(转)SWITCH_ROOT

原文:http://blog.sina.com.cn/s/blog_44de54df0100uytb.html

tar -X dir1  -c dir2|gzip > ddd.lrp  
 我们的U盘内设置已经成型 如果要让系统的东西能够存出来则需要修改init文件,使我们的U盘挂载到U盘系统的某个文件夹下 用于存储文件:
  在上次修改之后 我们执行mdev 后等待10s 此时所有的硬件信息都被存储到了/dev 下
我们从U盘启动 U盘默认被认成了 dev/sda
  因此 我们只需要加入挂载命令就可以
  当然 我们也可以用fstab设置自动加载云云 这就不在本文叙述范围内了。
# vi  etc/init.d/rcS
  ———-rcS     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                     //这里我们把挂载写死了
——————————————————————
  这样 开机后就会发现提示 挂载成功
在你的U盘linux下 就可以在 /mnt 下工作了 文件会存在U盘中 而不会丢失。
但是 这种解决方案并不完全。我们希望能够将系统完全转换到U盘下工作,这就要用到switch_root 命令了。
switch-root 是busybox提供的一个超级命令,
正常如果我们要切换系统的根目录,那么我们要:
(1)删除rootfs的全部内容,释放空间
find -xdev / -exec rm ‘{}’ ‘;’
(2)安装新的根文件系统,并切换
cd /newmount; mount –move . /; chroot .
(3)把stdin/stdout/stderr 附加到新的/dev/console,然后执行新文件系统的init程序
这十分的麻烦 而且常常会出错,因此我们的busybox用一个命令解决了整个过程,比如 我们商秘昂挂载我们的U盘到了mnt目录而我们的U盘根目录下就是我们写好的一个/ 根文件系统
我们需要执行:
switch_root   /mnt    /sbin/init
                新根目录   新文件系统的init
只后switch_root 就会帮我们自动切换好根文件系统。
需要特别注意的是:
switch_root命令必须由PID=1的进程调用,也就是必须由initramfs的init程序直接调用,不能由init派生的其他进程调用,否则会出错,提示:
switch_root: not rootfs
也是同样的原因,init脚本调用switch_root命令必须用exec命令调用,否则也会出错,提示:
switch_root: not rootfs
因此我们这里将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              //转换
——————————————————
重新打包 拷贝 从U盘引导 OK
如果一切正常 那么你的系统会切换到你U盘里的/ 下 正常的使用吧。
关于U盘里的那个系统 可以到网上下载一个轻量版的linux 或者直接把宿主linux拷贝进去

原文地址:https://www.cnblogs.com/yinsua/p/3540624.html