2018-05-16 14:32:33 Buster_ZR 阅读数 2768

Linux 系统启动项修复

首先简单了解一下, linux 启动的过程

想要了解详细过程可移步 Linux 系统启动过程

简单来说,系统开机的经过可以汇整成下面的流程的:

1.载入 BIOS 的硬件信息与进行自我测试,并依据设置取得第一个可开机的设备;
2.读取并执行第一个开机设备内 MBR 的 boot Loader (亦即是 grub2, spfdisk 等程序);
3.依据 boot loader 的设置载入 Kernel ,Kernel 会开始侦测硬件与载入驱动程序;
4.在硬件驱动成功后,Kernel 会主动调用 systemd 程序,并以 default.target 流程开机;
  • systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统;
  • systemd 启动 multi-user.target 下的本机与服务器服务;
  • systemd 执行 multi-user.target 下的 /etc/rc.d/rc.local 文件;
  • systemd 执行 multi-user.target 下的 getty.target 及登陆服务;
  • systemd 执行 graphical 需要的服务

1. grup2 引导错误

mbr 的作用是为了记录/boot目录所在分区位置磁盘0磁道1扇区的前446字节
若是不小对这段信息进行了破坏将会导致系统无法启动

可在虚拟机中执行 dd if=/dev/zero if=/dev/xda bs=446 count=1 进行模拟

1.1 对mbr破坏后未重启机器

 直接在 shell 下执行 grub2-install /dev/vda 进行恢复
 [root@localhost ~]# grub2-install /dev/vda

执行如下:
这里写图片描述

1.2 对 mbr 破坏后重启机器

对 mbr 破坏后重启机器会导致无法进行引导进而无法启动机器(如下:)
这里写图片描述
此时需要依靠外部设备进行帮助,这里我们借助一个与系统系统版本相符的镜像源文件对系统来进行修复

 进行下述操作:
 1.在真机执行 virt-manager 选择grub2出现错误的虚拟机
 2.为 grub2 出现错误的虚拟机添加:storage IDE CDROM (必须关闭虚拟机)
 3.添加镜像文件(与系统版本相符的镜像文件)
 4.选择:Boot Options 将 IDE CDROM 选到第一个,使开机先识别 ID CDROM
 5.打开虚拟机选择: Troubleshooting
 6.选择:Rescue a Red Hat Enterprise Linux sustem
 7.执行:chroot /mnt/sysimage
 8.执行:grub2-install /dev/vda
 9.执行:vim /etc/sysconfig/selinux
       关闭 selinux 为了开机迅速
 10.关闭机器,选择:Boot Options 将IDE CDROM选到最后
 11.启动机器

具体执行如下:
1.在真机执行 virt-manager 选择grub2出现错误的虚拟机
这里写图片描述
2.为 grub2 出现错误的虚拟机添加: storage IDE CDROM (必须关闭虚拟机)
选择
这里写图片描述
添加 storage IDE CDROM
这里写图片描述
3.添加镜像文件
这里写图片描述
4.选择: Boot Options 将 IDE CDROM 选到第一个,使开机先识别 ID CDROM
这里写图片描述
5.打开虚拟机选择: Troubleshooting
这里写图片描述
6.选择: Rescue a Red Hat Enterprise Linux sustem
这里写图片描述
选择后,下面提示:你的系统将会在援助环境下,被挂载到援助环境下的 /mnt/sysimage,选择 continue 继续操作
这里写图片描述
提醒你,你的系统已经被挂载到援助环境下的 /mnt/sysimage,你可以通过执行 chroot /mnt/sysimage 切换到你真实的系统环境中,并写系统会在退出 shell 后进行重启,选择 ok 继续操作
这里写图片描述
‘再次提醒你,你的系统已经被挂载到援助环境下的 /mnt/sysimage
这里写图片描述
7.执行: chroot /mnt/sysimage
这里写图片描述
8.执行: grub2-install /dev/vda
这里写图片描述
9.执行: vim /etc/sysconfig/selinux ,关闭 selinux (为了开机迅速)
这里写图片描述
这里写图片描述
10.关闭机器,选择: Boot Options 将IDE CDROM选到最后
这里写图片描述
11.启动机器(可成功启动)
这里写图片描述

2. 自动引导文件 /boot/grub2/grub.cfg

/boot/grub2/grub.cfg.此文件属于 Linux 系统开启的自动引导文件,通过此文可以自动完成对系统根目录的挂载,linux 内核的初始化和初始化程序的引导,此文件若是缺失,系统则无法自动开启,需要进行手动引导。

若是系统 /boot/grub2/grub.cfg 文件缺失,则开机后需执行如下操作

 set root='hd0,msdos1'  #设置root读取第一块磁盘的第一个分区,md0表示第一块磁盘,
                        #msdos表示第一个分区
 linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64  ro root=/dev/vda1
                        #手动进行内核引导,并将根目录只读挂载到 /dev/vda1 上
 initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
                        #生动进行引导初始化程序
 boot                   #启动机器
 开机后进行  /boot/grub2/grub.cfg 文件的修复
 执行:
 [root@localhost ~]# grub2-mkconfig > /boot/grub2/grub.cfg
                        #生成自动引导文件

具体执行如下:
自动引导文件缺失后,开启系统将会进入下示环境:
这里写图片描述
执行以下操作进行手动引导
1.set root=’hd0,msdos1’
2.linux16 /boot/vmlinuz-3.10.0-123.el7.x86_64 ro root=/dev/vda1
3.initrd16 /boot/initramfs-3.10.0-123.el7.x86_64.img
4.boot
这里写图片描述
开机后生成自动引导文件
这里写图片描述

3. 内核程序 /boot/vmlinuz-3.10.0-123.e17.x86_64 缺失

若内核程序 /boot/vmlinuz-3.10.0-123.e17.x86_64 缺失,则系统会因为无法加载内核而无法启动。可以通过外加光盘,通过 Linux 补救程序为系统重新安装符合系统版本的内核程序
内核程序启动系统会显示如下:
这里写图片描述
先介绍一个命令,可以从安装包中提取文件及程序的命令


 [root@localhost Desktop]# rpm2cpio #从RPM Package Manager (RPM)包中提取cpio归档文件
 [root@localhost Desktop]# rpm2cpio kernel-3.10.0-123.el7.x86_64.rpm | cpio -id
                         #将内核安装包内的文件提取出来          
                cpio     #从档案到档案的拷贝文件。
                -i:      #提取
                -d:      #在需要的地方创建引导目录。

执行如下:
将当前目录下内核程序安装包内的目录、文件提取出来:
这里写图片描述

想要重新安装内核程序,可进行如下操作

 进行下述操作:
 1.在真机执行virt-manager
 2.为内核文件的缺失虚拟机添加:storage IDE CDROM
 3.添加镜像文件(与系统版本相符的镜像文件)
 4.选择:Boot Options 将IDE CDROM选到第一个,使开机先识别ID CDROM
 5.打开虚拟机选择:Troubleshooting
 6.选择:Rescue a Red Hat Enterprise Linux sustem
 7 执行:df
   可看到光盘挂载在当前的 /run/install/repo 下,切换到此目录下,可看到光盘内的文件,
   安装包等,将Packages内的内核安装包(kernel-3.10.0-123.el7.x86_64.rpm)复制到
   真实主机中(此处指虚拟机)的指定目录下目录下。
 8.执行:chroot /mnt/sysimage 切换到真实主机根目录
 9.切换到/mnt目录后
    执行:rpm2cpio  kernel-3.10.0-123.el7.x86_64.rpm | cpio -id   
                   #将内核安装包内的文件提取出来
 10.执行:cp boot/vmlinuz-3.10.0-327.el7.x86_64 /boot/   
         #第一个'boot/'是内核安装包内的东西,第二个/boot/是真实主机的根目录,将内核安装
         #包内的对应内核程序移动到/boot/下,使机器可以正常运行。
 11.关闭机器,选择:Boot Options 将IDE CDROM选到最后
 12.启动机器

具体值执行如下:
1~6步与修复 mbr 相同
7. 进入挽救环境后执行:df
**将Packages内的内核安装包(kernel-3.10.0-123.el7.x86_64.rpm)复制到
真实主机中**
df
这里写图片描述
复制内核程序安装包到真实主机(此处指虚拟机)的指定目录下。
这里写图片描述
8.执行:chroot /mnt/sysimage/mnt 切换到真实主机根目录,并切换到 内核安装包所在目录
执行:rpm2cpio 命令 将内核安装包内的文件提取出来
执行:cp boot/vmlinuz-3.10.0-327.el7.x86_64 /boot/ 将内核程序拷贝到真实主机 /boot 目录下
第一个’boot/’是内核安装包内的东西,第二个/boot/是真实主机的根目录,将内核安装包内的对应内核程序移动到/boot/下,使机器可以正常运行。
这里写图片描述
11~12步与修复 mbr 最后两步亦同

4. initramfs 镜像缺失

若是系统的 initramfs-3.10.0-327.el7.x86_64.img 缺失,系统因为无法进行下一步的开机引导而不能启动。(如下:)
这里写图片描述
想要修复 initramfs 镜像,可进通过挽救程序,进入到系统真实目录对 initramfs 镜像修复
先介绍一个命令 ( mkinitird )

 [root@localhost ~]# mkinitrd [选项...] [<initrd映像文件>] <内核版本>
                   #是一个compat包装器,它调用dracut来生成一个initramfs
 执行如下命令进行修复 initramfs 
 [root@localhost ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
           uname -r #显示内核版本号
           在bash中,$( )与` `(反引号)都是用来作命令替换的。
 命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,
 再重组成新的命令行。
 $( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
 上述指令等同于:
 mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64     

示例如下:
这里写图片描述
修复 initramfs 镜像需要执行如下操作

 进行下述操作:
 1.在真机执行virt-manager
 2.为内核文件的缺失虚拟机添加:storage IDE CDROM
 3.添加镜像文件(与系统版本相符的镜像文件)
 4.选择:Boot Options 将IDE CDROM选到第一个,使开机先识别ID CDROM
 5.打开虚拟机选择:Troubleshooting
 6.选择:Rescue a Red Hat Enterprise Linux sustem
 7 执行:chroot /mnt/sysimage 切换到真实主机根目录
 8.执行:mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64 
        #恢复 initramfs 镜像
 9.关闭机器,选择:Boot Options 将IDE CDROM选到最后
 10.启动机器

具体执行如下
1~6步与修复 mbr 相同
7 执行:chroot /mnt/sysimage 切换到真实主机根目录
8.执行:mkinitrd /boot/initramfs-3.10.0-123.el7.x86_64.img 3.10.0-123.el7.x86_64
这里写图片描述
9~10步与修复 mbr 最后两步亦同

5. 系统启动级别发生错误

介绍一下 Linux 系统启动的级别

  • Linux 启动级别分为六种 0-6
    0 :为停机,机器关闭。
    1 :为单用户模式,就像Win9x下的安全模式类似。
    2 :为多用户模式,但是没有NFS支持。
    3 :为完整的多用户模式,是标准的运行级。
    4 :一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
    5 :就是X11,进到X Window系统了。
    6 :为重启,运行init 6机器就会重启。

Linux 是可以通过通过 systemctl 指令来管理不同的操作环境 (target unit)而跟操作界面相关性比较高的 target 主要有下面几个:

graphical.target: 文字加上图形界面,这个项目已经包含了下面的 multi-user.target
项目!
multi-user.target: 纯文本模式!
rescue.target: 在无法使用 root 登陆的情况下,systemd 在开机时会多加一个额外的暂
时系统,与你原本的系统无关。这时你可以取得 root 的权限来维护你的系统。
emergency.target: 紧急处理系统的错误,还是需要使用 root 登陆的情况,在无法使用
rescue.target 时,可以尝试使用这种模式!
shutdown.target:  关机的流程。
getty.target: 可以设置你需要几个 tty 之类的,如果想要降低 tty 的项目,可以修改这个
东西的配置文件

如果不小心将开机启动级别改为了 shutdown.target
可以通过

 [root@localhost ~]# systemctl set-default <target名>

来进行开机启动的设置
如是错误的将开机启动目标设置为了 shutdown.target 将会直接关闭系统而导致机器无法启动(如下:)
这里写图片描述
此时需要进行对开机启动级别的修复,首先先要进行正常的进入系统才行
1. 在上述界面下点击 Ctrl+Alt+Delete / Ctrl+Alt+End,进入系统选择界面
这里写图片描述
2. 出现上述界面后,快速点击键盘上下键,否则将又会进入最开始那无法进入系统的界面。再次界面点击 ‘E’ 键进入编辑界面
这里写图片描述
3. 在编辑界面 linux16 * 一行最后加上 ‘5’ ,后点击 Ctrl+x ,就可正常启动
这里写图片描述
4. 启动机器后在 shell 下执行 systemctl set-default graphical.target 将开机级别设置为图形界面,就完成了系统启动级别的修复
这里写图片描述

2020-02-05 05:42:50 qq_36643282 阅读数 6

获取内核版本、架构、用户名、终端、目录


4064394-0a4a57763ccb455c.png
image.png
/*
 * @Author: machineplay
 * @Date: 2020-02-05 03:04:30
 * @Description: only for fun
 */
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include <fcntl.h>
#include <sys/utsname.h>
#include <pwd.h>


int main(int argc, char* argv[]) {

    /* init time. */
    tm sys_time;
    timespec sys_timespec;
    tm *sys_tm_ptr = &sys_time;
    time_t time_now = time(NULL);
    char time_buf[255];
    sys_tm_ptr = localtime(&time_now);
    int ret = strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S %Z", sys_tm_ptr);

    if(!ret) {
        printf("get time error\n");
        return -1;
    }

    /* init sys info. */
    utsname sys_info;
    passwd *sys_pwd = nullptr;
    ret = uname(&sys_info);
    if(ret) {
        printf("get uname error\n");
    }

    /* getuid then getpwuid. */
    sys_pwd = getpwuid(getuid());


    /* display system info. */
    printf("______system_info______\t\n");
    printf("* kernel: %s\t\n* machine: %s\t\n* release: %s\t\n* hostname: %s\t\n* system: %s\t\n"
    , sys_info.version, sys_info.machine, sys_info.release, sys_info.nodename, sys_info.sysname);

    /* get username from pwd. */
    printf("* user: %s\t\n", sys_pwd->pw_name);
    printf("* shell: %s\t\n", sys_pwd->pw_shell);
    printf("* home: %s\t\n", sys_pwd->pw_dir);

    /* time. */
    printf("* time: %s\t\n", time_buf);
    return 0;
}
2013-11-18 09:13:47 yangyangliangliang 阅读数 1770

平台:linux

windows下读取声音应用windows下的API,那么如果直接移植到嵌入式等系统下的话,是肯定执行不出来的。那么,就得改成在linux下可以执行的方式。(以上个人意见,不一定对哈!)

下面给出linux下读取音频并播放的程序,在linux下调试通过。

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <linux/soundcard.h>


#define OPEN_DSP_FAILED     0x00000001      /*打开  dsp 失败!*/
#define SAMPLERATE_STATUS     0x00000002    /*samplerate status failed*/
#define SET_SAMPLERATE_FAILED  0x00000003   /*set samplerate failed*/
#define CHANNELS_STATUS       0x00000004    /*Channels status failed*/
#define SET_CHANNELS_FAILED    0x00000005   /*set channels failed*/
#define FMT_STATUS       0x00000006        /*FMT status failed*/
#define SET_FMT_FAILED     0x00000007       /*set fmt failed*/
#define OPEN_FILE_FAILED        0x00000008    /*opem filed failed*/


int P8100_Audio_Play(char *pathname,int nSampleRate,int nChannels,int fmt)
{
int dsp_fd,mix_fd,status,arg;
dsp_fd = open("/dev/dsp" , O_RDWR);   /*open dsp*/
if(dsp_fd < 0)
{
  return  OPEN_DSP_FAILED;
}
arg = nSampleRate;
status = ioctl(dsp_fd,SOUND_PCM_WRITE_RATE,&arg); /*set samplerate*/
if(status < 0)
{
  close(dsp_fd);
  return SAMPLERATE_STATUS;
}
if(arg != nSampleRate)
{
  close(dsp_fd);
  return SET_SAMPLERATE_FAILED;
}
arg = nChannels;  /*set channels*/   
status = ioctl(dsp_fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if(status < 0)
{
  close(dsp_fd);
  return CHANNELS_STATUS;
}
if( arg != nChannels)
{
  close(dsp_fd);
  return SET_CHANNELS_FAILED;
}
arg = fmt; /*set bit fmt*/
status = ioctl(dsp_fd, SOUND_PCM_WRITE_BITS, &arg);
if(status < 0)
{
  close(dsp_fd);
  return FMT_STATUS;
}
if(arg != fmt)
{
  close(dsp_fd);
  return SET_FMT_FAILED;
}/*到此设置好了DSP的各个参数*/            
FILE *file_fd = fopen(pathname,"r");
if(file_fd == NULL)
{
  close(dsp_fd);
  return OPEN_FILE_FAILED;
}
int num = 3*nChannels*nSampleRate*fmt/8;
int get_num;
char buf[num];
while(feof(file_fd) == 0)
{
  get_num = fread(buf,1,num,file_fd);
  write(dsp_fd,buf,get_num);
  if(get_num != num)
  {
   close(dsp_fd);
   fclose(file_fd);
   return 0;
  }
}
close(dsp_fd);
fclose(file_fd);
return 0;
}


int main()
{
    int value;

    //千万注意播放文件的路径!!!
//    value = P8100_Audio_Play("/windows/C/WINDOWS/Media/Windows Startup.wav",44100,2,16);//如果不在同一个工作目录下则使用绝对路径,但是移植时要注意这个问题。
value = P8100_Audio_Play("22.wav",44100,2,16); //如果此代码和音频文件在一个工作目录下,则直接写音频文件名。也可使用相对路径,即代码和音频所在文件夹在一个工作目录下,相对路径格式“voice\\22.wav” ,其中voice是存放音频的文件夹,这样就可以很方便的移植了。至于\\这个就是路径的有的一个\就可以,有的得两个,因为有一个\是转义字符。


    fprintf(stderr,"value is %d",value);
    return 0;
}


好了就这些吧,说的越多错误就越多!毕竟水平有限!

2019-06-05 11:12:35 cc_suuif 阅读数 1526

导入需要用到的package

import os
import pandas as pd

定义文件路径

python在linux系统上进去文件I/O操作时,可以有多种方式定义文件路径,这里给出两种:

路径的一般范式: /home/login_user_account/directory_a/…/directory_n/filename.*****
        /主目录/登录账号名/文件夹a/…/文件夹n/文件名及其格式

  1. 方式一:

    path = '/home/test/test'
    file_name = os.path.join(path, 'testfile.txt')
    file_name_csv = os.path.join(path, 'test_csv_file.csv')
    
  2. 方式二:

    path = os.path.join(os.sep, 'home', 'test', 'test')
    file_name = os.path.join(path, 'testfile.txt')
    file_name_csv = os.path.join(path, 'test_csv_file.csv')
    

读取文件

  1. 利用file(open)方法读取

    # with结构读取文件:打开文件且当文件读取完毕后自动关闭文件
    with file(file_name, 'r+') as inf:
    	for line in inf.readlines():	# 读取txt文档中的每一行并在清除行右侧空白符后打印出来
    		print line.rstrip()
    
    
  2. pandas读取csv文件

    # 利用pandas读取指定路径下指定的csv文件
    df = pd.read_csv(file_csv_name)
    print df.head()	# 打印出已读取csv文档的前5行,是Dataframe格式的数据
    

写在最后

对于python编程笔者还是小学生一枚,不敢高谈教化,只希冀将自己的理解能解释清楚。
读到此处的您,如果我的理解对解答您的问题有所帮助,那我将是很开心的。
能力一般,水平有限,可优化的地方千千…请指正!

祝好!

Linux读取串口数据

阅读数 9563

linux系统启动

阅读数 235

没有更多推荐了,返回首页