学习啦>学习电脑>操作系统>Linux教程>

initrd如何切入linux文件系统

若木分享

  initrd切入linux文件系统

  initrd,典型的系统启动顺序

  1. boot loader加载内核并初始化ram disk

  2. 内核把initrd转化成正常的ram disk并释放initrd使用的内存

  3. initrd作为root被挂载,赋予读写权限。

  4. /linuxrc被执行(这可以是任何可执行文件,如脚本,运行在uid 0,可以做任何初始化)。

  5. linuxrc挂载真正的根文件系统

  6. linuxrc使用pivot_root系统调用把根文件系统放在根目录。

  7. 正常的启动序列(/sbin/init)在根文件系统上执行。

  8. initrd文件系统被移去。

  注意,改变根目录不牵扯卸载他。 挂载在initrd的文件系统仍然可以被访问。

  如何改变根设备

  整个过程包括如下几步:

  1. 挂载新的根文件系统

  2. 把他变成根文件系统

  3. 删除所有对旧(Initrd)文件系统的访问

  4. 卸载initrd文件系统,重定位ram disk

  挂载新的根文件系统很容易:只需把他挂载到当前根下。例如:

  # mkdir /new-root

  # mount -o ro /dev/hda1 /new-root

  根的转变伴随着pivot_root系统调用。pivot_root把当前的根转移到新根下的一个目录,并把新的根放到原来的地方。老根的目录必须在调用pivot_root前退出。例如:

  # cd /new-root

  # mkdir initrd

  # pivot_root . initrd

  现在,linuxrc进程可以仍然访问老的根。所有的这些引用可以通过如下命令释放:

  # exec chroot . what-follows dev/console 2>&1

  然后执行的就是新根下的init程序,例如/sbin/init。

  如果新的根文件系统使用devfs,而/dev目录还不可用,devfs必须被挂载进来, 在使用chroot之前,只有这样才有/dev/console设备。

  注意:

  privot_root执行的情况可能有所不同。为了保证兼容性,注意以下几点:

  调用pivot_root之前,调用进程的当前目录应指向新的根 文件目录使用”.“作为第一个参数,老根的相对路径作为第二个参数。ch

  root程序必须在就老的和新的根下都可以使用。

  最后改变根到新的根下。

  在执行命令中 使用dev/console的相对路径。

  注意,initrd可以被卸载,而ram disk使用的内存可以被释放:

  # umount /initrd

  # blockdev --flushbufs /dev/ram0 # /dev/rd/0 if using devfs

  initrd还可以使用NFS-mounted根,参考man pivot_root(8)。

  示例

  下面是redhat的linuxrc文件,其中用的是nash命令系统。

  #!/bin/nash

  echo "Loading scsi_mod.o module"

  insmod /lib/scsi_mod.o

  echo "Loading sd_mod.o module"

  insmod /lib/sd_mod.o

  echo "Loading BusLogic.o module"

  insmod /lib/BusLogic.o

  echo "Loading jbd.o module"

  insmod /lib/jbd.o

  echo "Loading ext3.o module"

  insmod /lib/ext3.o

  echo Mounting /proc filesystem

  mount -t proc /proc /proc

  echo Creating block devices

  mkdevices /dev

  echo Creating root device

  mkrootdev /dev/root

  echo 0x0100 > /proc/sys/kernel/real-root-dev

  echo Mounting root filesystem

  mount -o defaults --ro -t ext3 /dev/root /sysroot

  pivot_root /sysroot /sysroot/initrd

  umount /initrd/proc

    75392