# Mount the root filesystem.
1 .mount -o ro /dev/sda1 /mnt/root
# Boot the real thing.
2 .exec switch_root /mnt/root /sbin/init
这是 initramfs 的 /init 文件中的一段代码,如中所述巴布亚新几内亚。此处,rootfs 挂载到 /mnt/root,之后执行 switch_root,其中 /mnt/root 作为 newroot,/sbin/init 作为目标。
第 1 行执行后,/dev/sda1 的内容被挂载到 /mnt/root。我试过,
sudo mount -o ro /dev/sda1 /mnt/temp
并收到此消息,
安装:/mnt/temp:/dev/sda1 已安装在/boot/efi 上。
所以我尝试了,cd /boot/efi
它说
cd: 未找到命令
所以我./efi
在 /boot 目录中尝试过,但现在我收到了这条消息,
bash: ./efi: 是一个目录
然后我尝试查看 /sbin/init 的内容:
cd /sbin/init
但现在它说,
bash: cd: /sbin/init: 不是目录。
我很困惑。怎么 /dev/sda1 和 /mnt/root 是目录,但突然 /sbin/init 是可执行文件?那不应该也是一个目录吗?
答案1
这里出现混乱是因为你误解了它的switch_root
作用。
从联机帮助页:
NAME
switch_root - switch to another filesystem as the root of the mount tree
SYNOPSIS
switch_root [-hV]
switch_root newroot init [arg...]
DESCRIPTION
switch_root moves already mounted /proc, /dev,
/sys and /run to newroot and makes newroot the new root
filesystem and starts init process.
WARNING: switch_root removes recursively all
files and directories on the current root filesystem.
通俗地说,这意味着目录指定为第一个参数(在您的情况下,/mnt/root
成为新的根文件系统(它成为/
),各种虚拟文件系统树被挂载,并且程序指定为第二个参数的将作为 new 执行init
。
更重要的是,看起来这些指令是错误的,并且不适用于您拥有的任何设置,因为在您的情况下/dev/sda1
是挂载 EFI 文件系统的位置。
我强烈地建议您在知道自己在做什么以及原因之前不要尝试执行此操作。
答案2
这手册页说:
SWITCH_ROOT(8) System Administration > SWITCH_ROOT(8) NAME switch_root - switch to another filesystem as the root of the mount tree SYNOPSIS switch_root newroot init [arg...] DESCRIPTION switch_root moves already mounted /proc, /dev, /sys and /run to newroot and makes newroot the new root filesystem and starts init process.
因此,当您运行 时switch_root /mnt/root /sbin/init
,您正在使用 make /mnt/root/
as /
,复制一些系统目录,然后执行/sbin/init
.
在我的 debian 系统上/sbin/init
有一个符号链接:
$ ls -la /sbin/init
lrwxrwxrwx 1 root root 20 Aug 17 22:28 /sbin/init -> /lib/systemd/systemd
它链接到/lib/systemd/systemd
一个可执行文件:
$ ls -la /lib/systemd/systemd
-rwxr-xr-x 1 root root 1649088 Aug 17 22:28 /lib/systemd/systemd