文件系统切换

Skyge / 2023-04-29 / 原文

//疑问:到底采用swith_root 还是chroot ?

/若采用了chroot之后,web端能见到chroot之后的文件系统吗?!!!

/switch_root好像需要多建一个分区

/结合chroot可以退出的特性ctrl+d

 

//busybox默认调用initramfs中根目录的linuxrc程序。该程序调用rcS脚本,但该脚本并不是以PID=1运行的。所以,在根目录中自己写一个init脚本,然后在该脚本中挂载硬盘文件系统,然后再调用switch_root即可切换到硬盘启动。

 

/其次chroot仅仅是在系统目录上进行了隔离,并没有对进程、网络等层面进行隔离。

 

switch_root的用法基本如下,需要newrootdir和切换之后的要执行的init(1)的路径,以及需要的传递的参数:

switch_root /sysroot "/sbin/init"

switch_root newroot init跳转到另外一个文件系统,并且把newroot作为新的mount tree,并且执行init程序

 设备/dev/sda1里面是新的文件系统,现在将它挂在到newroot目录下,那么在switch_root的时候,就必须要switch到这个newroot目录下,而不能switch到newroot目录的任何子目录。

 

chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init,本文的最后一个 demo 会详细的介绍这种用法。

 

 

 

//因此我们这里将rcS文件改回init (不再需要内存中的linux的shell环境)保证我们加入语句以init的权限调用 pid=1的进程。

#cp etc/init.d/rcS  ./init
# vi init
—————–init final-1————–
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo /sbin/mdev > /proc/sys/kernel/hotplug           //热插拔
echo ‘waiting to load all devices…..’
mdev -s
sleep 10
mount /dev/sda1        /mnt                     //这里我们把挂载写死了
echo "The pid now is $$"                    //打印当前pid 确保为1
exec switch_root  /mnt /sbin/init              //转换

 

参考:

https://blog.csdn.net/u012385733/article/details/102565591