错误:根设备安装成功,但 /sbin/init 不存在

错误:根设备安装成功,但 /sbin/init 不存在

我已经在我的计算机上安装了 Linux Mint 和 Manjaro Linux。我只在 MBR 上安装了 Linux mint。对于 Manjaro,我创建了一个/boot/efi分区,但我没有检查安装到 MBR。

所以,我用grub薄荷来控制。现在,当我尝试启动 Manjaro 时,它显示:

ERROR: resume: no device specified for hibernation: performing fsck on
dev/sda11  /dev/sda11: clean 1727/915712 files, .... blocks

WARNING: The root device is not configured to be mounted read-write!It
may be fsck'd again later

:mounting /dev/sda11 on real boot running cleanup hook [udev]

ERROR: Root device mounted successfully, but /sbin/init does not exist.

sh:can't access tty; job control turned off

[rootfs /]#

shell提示后,我什么也写不了。它挂起,或者有时它会连续向我显示消息,例如:

usb 3-3: device not accepting address 2, error -62

等等...

我尝试添加 init=/usr/lib/systemd/systemd到 grub,正如我在 google 中看到的那样,但仍然相同。

我必须注意,对于 Manjaro 安装,我使用单独的分区 for/和 for/usr和 for /var。这也许有影响?正如我所见这里

但问题是我什么也写不了,它挂了。

我还发现了一篇博文的评论这里其中规定:

“如果将 /usr 作为单独的分区,则必须遵守以下要求:” - 添加关闭挂钩。关闭过程将转向保存的 initramfs 副本,并允许 /usr(和 root)从 VFS 正确卸载。

“ - 添加 fsck 挂钩,在 /etc/fstab 中将 /usr 标记为 passno 0。虽然推荐给所有人,但如果您希望 /usr 分区在启动时进行 fsck,则这是强制性的。如果没有这个钩子,/usr 将永远不会被 fsck。

“ - 添加 usr 挂钩。这将在挂载 root 后挂载 /usr 分区。在 0.9.0 之前,如果在真实根目录的 /etc/fstab 中找到 /usr,则会自动挂载。”

并且永远不要忘记每次更改 mkinitcpio.conf 后运行 mkinitcpio -p linux 以实际创建新映像并将它们放置在正确的位置。

这听起来很有希望,因为我的/usr确实位于一个单独的分区上。这些“钩子”是什么以及如何添加它们?

parted -l:

Model: ATA TOSHIBA MQ01ABD0 (scsi)
Disk /dev/sda: 750GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name                  Flags
 1      1049kB  1075MB  1074MB  ntfs            Basic data partition  hidden, diag
 2      1075MB  1347MB  273MB   fat32           Basic data partition  boot
 3      1347MB  1482MB  134MB   ntfs            Basic data partition  msftres
 4      1482MB  80,1GB  78,6GB  ntfs            Basic data partition  msftdata
 5      80,1GB  80,4GB  262MB   ext4
 6      80,4GB  90,4GB  10,0GB  ext4                                  msftdata
 7      93,0GB  102GB   9000MB  ext4                                  msftdata
 9      102GB   106GB   3999MB  linux-swap(v1)
10      106GB   106GB   250MB   fat32                                 boot
11      106GB   121GB   15,0GB  ext4                                  msftdata
12      121GB   151GB   30,0GB  ext4                                  msftdata
13      151GB   165GB   14,0GB  ext4                                  msftdata
14      165GB   206GB   40,9GB  ext4                                  msftdata
 8      206GB   743GB   537GB   ext4                                  msftdata
15      743GB   747GB   4000MB  linux-swap(v1)                        msftdata

grub:

menuentry 'Linux Mint 17 Cinnamon 64-bit, 3.13.0-24-generic (/dev/sda5)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    gfxmode $linux_gfx_mode
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt5'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  19af2e09-8946-4ca2-9655-75921f3609a5
    else
      search --no-floppy --fs-uuid --set=root 19af2e09-8946-4ca2-9655-75921f3609a5
    fi
    linux   /vmlinuz-3.13.0-24-generic root=UUID=9356f543-f391-4ba5-9dcc-e8484d6935e0 ro   quiet splash $vt_handoff
    initrd  /initrd.img-3.13.0-24-generic
}
menuentry 'Linux Mint 17 Cinnamon 64-bit, 3.13.0-24-generic (/dev/sda5) -- recovery mode' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt5'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  19af2e09-8946-4ca2-9655-75921f3609a5
    else
      search --no-floppy --fs-uuid --set=root 19af2e09-8946-4ca2-9655-75921f3609a5
    fi
    echo    'Loading Linux 3.13.0-24-generic ...'
    linux   /vmlinuz-3.13.0-24-generic root=UUID=9356f543-f391-4ba5-9dcc-e8484d6935e0 ro recovery nomodeset 
    echo    'Loading initial ramdisk ...'
    initrd  /initrd.img-3.13.0-24-generic
}


menuentry 'Manjaro Linux (0.8.10) (on /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-95ed019d-9269-4869-9f99-a03f002a53c6' {
    insmod part_gpt
    insmod ext2
    set root='hd0,gpt11'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt11 --hint-efi=hd0,gpt11 --hint-baremetal=ahci0,gpt11  95ed019d-9269-4869-9f99-a03f002a53c6
    else
      search --no-floppy --fs-uuid --set=root 95ed019d-9269-4869-9f99-a03f002a53c6
    fi
    linux /boot/vmlinuz-312-x86_64 root=/dev/sda11
    initrd /boot/initramfs-312-x86_64.img
}
submenu 'Advanced options for Manjaro Linux (0.8.10) (on /dev/sda11)' $menuentry_id_option 'osprober-gnulinux-advanced-95ed019d-9269-4869-9f99-a03f002a53c6' {
    menuentry 'Manjaro Linux (0.8.10) (on /dev/sda11)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-312-x86_64--95ed019d-9269-4869-9f99-a03f002a53c6' {
        insmod part_gpt
        insmod ext2
        set root='hd0,gpt11'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt11 --hint-efi=hd0,gpt11 --hint-baremetal=ahci0,gpt11  95ed019d-9269-4869-9f99-a03f002a53c6
        else
          search --no-floppy --fs-uuid --set=root 95ed019d-9269-4869-9f99-a03f002a53c6
        fi
        linux /boot/vmlinuz-312-x86_64 root=/dev/sda11
        initrd /boot/initramfs-312-x86_64.img
    }
}

答案1

正如 @Leiaz 在评论中非常正确地指出的那样,/sbinArch(以及扩展的 Manjaro)现在是/usr/bin.这意味着除非/usr被挂载,否则/usr/sbin/init不会存在。因此,您需要确保它/usr是由初始 ramdisk 挂载的。这就是你的 OP 中 Arch wiki 引用的意思:

如果将 /usr 作为单独的分区,则必须遵守以下要求:

  • 启用 mkinitcpio-generate-shutdown-ramfs.service 或添加 shutdown 挂钩。

  • 添加 fsck 挂钩,在 /etc/fstab 中将 /usr 标记为 passno 0。虽然推荐给所有人,但如果您希望 /usr 分区在启动时进行 fsck,则这是强制性的。如果没有这个钩子,/usr 将永远不会被 fsck。

  • 添加 usr 挂钩。这将在挂载 root 后挂载 /usr 分区。在 0.9.0 之前,如果在真实根目录的 /etc/fstab 中找到 /usr,则会自动挂载 /usr。

因此,您需要使用正确的钩子1生成一个新的初始化文件。这些是通过更改HOOKS=""中的行来添加的/etc/mkinitcpio.conf。所以

  1. 启动到 Mint 并挂载 Manjaro/目录:

    mkdir manjaro_root && sudo mount /dev/sda11 manjaro_root
    

    现在,Manjaro 的根目录将安装在~/manjaro_root.

  2. 使用您最喜欢的编辑器编辑mkinitcpio.conf文件(我仅用nano作示例,不再赘述):

    sudo nano ~/manjaro_root/etc/mkinitcpio.conf
    

    找到该HOOKS行并确保它包含相关的钩子

    HOOKS="shutdown usr fsck"
    

    重要的" :不要删除任何已经存在的钩子。只需将上面的内容添加到那里。例如,最终结果可能如下所示

    HOOKS="base udev autodetect sata filesystems shutdown usr fsck"
    
  3. 在 中标记/usrpassno 为 0 /etc/fstab。为此,请打开manjaro_root/etc/fstab并找到该/usr行。对于本示例,我将假设它是/dev/sda12,但使用您系统上的任何一个。 “通行证”号码是/etc/fstab条目的最后一个字段。所以,你需要确保这条线看起来像

    /dev/sda12  /usr  ext4  rw,errors=remount-ro     0      0
                                                            ^
                             This is the important one -----|
    
  4. 创建新的初始化映像。为此,您/usr还必须挂载 Manjaro 的目录。

    sudo mount /dev/sda12 ~/manjaro_root/usr
    

    我对 Arch 没有太多经验,因此可能不需要(您可能可以mkinitcpio在没有 的情况下运行chroot),但为了安全起见,请设置一个chroot环境:

    sudo mount --bind /dev ~/manjaro_root/dev && 
    sudo mount --bind /dev/pts ~/manjaro_root/dev/pts && 
    sudo mount --bind /proc ~/manjaro_root/proc && 
    sudo mount --bind /sys ~/manjaro_root/sys &&
    sudo chroot ~/manjaro_root
    

    您现在将处于一个 chroot 环境中,该环境~/manjaro_root/实际上是/.您现在可以继续生成新的初始化映像

    mkinitcpio -p linux
    
  5. 退出chroot

    exit
    
  6. 更新您的grub.cfg(同样,实际上可能不需要):

    sudo update-grub
    

现在重新启动并尝试再次启动到 Manjaro。


1 “Hooks”是一些小脚本,告诉mkinitcpio我们应该将什么添加到它生成的初始化映像中。

答案2

从薄荷,你可以改变根到您的 Manjaro 安装,以便重新生成 initramfs。

将 Manjaro 根目录挂载到您选择的目录 ( ~/foo) 下。将您的/usr分区安装在~/foo/usr,如果引导是单独的,也安装引导。挂载 proc sys dev :

# mount -t proc proc ~/foo/proc/
# mount --rbind /sys ~/foo/sys/
# mount --rbind /dev ~/foo/dev/

并更改根:chroot ~/foo /bin/bash

正如中所解释的维基百科:“挂钩是小脚本,描述将添加到图像中的内容”。编辑/etc/mkinitcpio.conf,将usr fsckshutdown挂钩添加到HOOK条目中,如 wiki 和评论中所示。重新生成 initramfs : mkinitcpio -p linux(它将被写入/boot)

退出 chroot,卸载 proc、sys、dev 和 Manjaro 分区并尝试重新启动。

答案3

只是浪费了大约 6 个小时为 Linux Mint 创建 USB 启动设备,备份 2 个分区的所有数据,并在收到可怕的 sbin/init 未找到消息后尝试各种救援尝试......

这是在小更新后发生的 - 系统无法重新启动。似乎整个 sbin 文件夹已被神秘删除且无法恢复。我能找到的唯一有意义的建议是“重新安装”。

修复(不到 5 分钟!!)如下:

  1. 启动从原来的实时安装盘(本例中为 Cinnamon Mint 17.1),
  2. 以 root 身份打开文件资源管理器(右键单击文件夹并选择“以 root 身份打开”,或者打开终端并键入“sudo nemo”
  3. 找到实时安装的 sbin 文件夹
  4. 安装有缺陷的 Mint 分区(单击图标)
  5. 更改应用于 sbin 文件夹的权限(右键单击,属性,权限,其他,文件访问,读取和写入 - 然后单击“将权限应用于封闭文件”)
  6. 将整个 sbin 文件夹复制到安装的根目录 (/) 中。 (这是系统“bin”、“boot”、“home”、“usr”等文件夹所在的位置。)
  7. 重启

相关内容