Linux系统之initramfs工作流程

initrd的参考文档可见:
      1) Linux initial RAM disk (initrd) overview, http://www.ibm.com/developerworks/linux/library/l-initrd/index.html
      2)  NTTdocomo-openstack / baremetal-initrd-builder, https://github.com/NTTdocomo-openstack/baremetal-initrd-builder
      2.1, nash指令(一个文件小,内置了一些实用的指令)
      2,2 挂载主要的文件系统, 并建立设备文件所需的文件系统
         mount -t proc /proc /proc
         mount -t sysfs /sys /sys
            2.2.1,procfs映射着内存中的一个虚拟目录,用于提供硬件、进程的实时信息,会随时变动。linux为保证稳定性,不允许访问/proc下的文件,root用户也不例外。
            2.2.2, sysfs也映射着内存中的一个虚拟目录,用于硬件信息的分类, sys目录的每一个文件都只有一个字符为内容来做开关的。
            2.2.3, tmpfs也映射着内存中的一个虚拟目录,内存中的文件系统。想要速度快时,可以选择在内存建立tmpfs类型的文件系统,因为它都将建在内存中。
                   例如在内存中建立了一个tmpfs分区并挂载到/mnt/tmpfs目录 :mount -t tmpfs -o size=50M tmpfs /mnt/tmpfs/
                        [root@zhanghua proc]# df -h
                        Filesystem      Size  Used Avail Use% Mounted on
                        tmpfs            50M     0   50M   0% /mnt/tmpfs
            2.2.4, /dev/shm,它是tmpfs的一种变种,tmpfs所有的内容所放在内存中,而/dev/shm在内存与文件系统有个映射,硬盘和内存中都会有这内容。
                  速度快,能存大于内存的文件,但重启之后,内容会消失。
                  下面显示在/dev/shm中建立文件与在普通ext4文件系统建文件的速度比较:
                        [root@zhanghua proc]# time dd if=/dev/zero of=/dev/shm/test.file bs=1M count=100
            100+0 records in
            100+0 records out
            104857600 bytes (105 MB) copied, 0.0395221 s, 2.7 GB/s

            real    0m0.075s
            user    0m0.001s
            sys    0m0.041s
            [root@zhanghua proc]# time dd if=/dev/zero of=/bak/test.file bs=1M count=100
            100+0 records in
            100+0 records out
            104857600 bytes (105 MB) copied, 0.0647526 s, 1.6 GB/s

            real    0m0.090s
            user    0m0.001s
            sys    0m0.066s
            2.2.5,devfs, 所有的device都会在/dev目录建立一个对应的设备文件.
                   缺点是例如即使打印机没连在计算机上,/dev/printer文件也会存在,这样会造成在intrd阶段的设备过多,所以devfs正在被udev所取代
                   例如要用光驱时,需先在linux与光驱之间通过 mount /dev/cdrom /mnt/命令做关联
            2.2.6, udev, udev可以放在/sys目录下,不需要将所有未使用的文件建立设备文件,不再需要major number和minor number,当硬件被加载时可执行用户设置的script。
                   例如,如果/dev/cdrom是被udev建立的,而非devfs,那么当光驱被拨除时,/dev/cdrom文件就会消失。
            2.2.7,/proc/PID文件,第一个进程都会对应这要闰个文件
            2.2.8,/proc/partitions用来表示检测到的硬盘信息, major字段表示SCSI controller的slot ID,minor字段表示分区ID。
                  #[root@zhanghua proc]# cat /proc/partitions  
           major minor  #blocks  name
               8        0  488386584 sda
               8        1   82051956 sda1
            2.2.9, /sys/block,块设备
                  #[root@zhanghua proc]# cat /sys/block/
                    loop0/ loop1/  sda/   sr0/
            2.2.10, /dev/pts ( pseudo terminal slave) 副虚拟终端,其目录的文件都是由ptmx(主虚拟终端)产生的,它们是父子关系。当用ssh联机到localhost本地端之后,就会在
                   /dev/pts目录下产生一个叫做"0"的文件,当别的console也利用ssh联到这台机器时,就会出现“1“.
                  [root@zhanghua proc]# ps -ef|grep ssh
                   hua      11186  3068  0 16:01 pts/0    00:00:00 ssh hua@localhost  
                   hua      11195 11187  0 16:01 ?        00:00:00 sshd: hua@pts/3
                   如上,当一个用户以ssh登录之后,该用户就分到一个ptmx所赋予的pts资源(pts/3),所以说ssh使用的是虚拟终端,不是真正的tty接口。telnet用的则是真正的tty接口。
            2.2.11, /dev/mapper,如果使用LVM后,linux要和硬盘打交道时不再直接使用/proc/partitions下的硬盘设备,而是使用/dev/mapper下的设备再去中转。
                    # ls -l /dev/mapper/*
                      brw-rw---- 1 root disk 253, 0 jan 27 16.16  /dev/mapper/vg0-lv0
                    # cat /proc/partitions
                      major minor #blocks name
                       8     0     17528  sda
                       253   0     1111   dm-0
      3,建立最初所需使用的设备文件
         设备文件使用mknod指令建立,mknod指令用来建立字符(character)或块(block)文件。
         例:mknod /dev/tty1c41, 建立一个名为tty1的设备文件,c表示是字符文件,major=4, minor=1
      4,加载相关模块
      5,切入image所指示的硬盘中实体操作系统. (rescue mode是直接通过kernel加载initrd进入单纯的内存开机的虚拟操作系统)
         5.1, mkrootdev -t ext4 -o defaults.ro hda1, 即nash指令会将GRUB中所设备的root=xxx中的xxx路径先建立好
         5.2, mount /sysroot, 将GRUB中的root路径mount到initrd中的/sysroot下。
         5.3, switchroot这个nash指令将initrd中的/sysroot文件系统切换成/rootfs,从而切换到了硬盘中的文件系统。

你可能感兴趣的:(Linux系统之initramfs工作流程)