Boot

錯誤:根設備掛載成功,但 /sbin/init 不存在

  • July 18, 2016

我已經在我的電腦上安裝了 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

等等…

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

我必須注意,對於 Manjaro 安裝,我使用單獨的分區 for/和 for/usr和 for /var。這可能有影響?正如我在這裡看到的。

但問題是我不能寫任何東西,它掛起。

我還在這裡找到了一篇部落格文章的評論,其中指出:

“如果將 /usr 保留為單獨的分區,則必須遵守以下要求:” - 添加關閉掛鉤。關閉過程將轉向已保存的 initramfs 副本,並允許 /usr(和 root)從 VFS 中正確解除安裝。

“ - 添加 fsck 鉤子,在 /etc/fstab 中用密碼 0 標記 /usr。雖然推薦給所有人,但如果您希望 /usr 分區在啟動時被 fsck’ed,這是強制性的。沒有這個鉤子,/usr 將永遠不會被 fsck’d。

“ - 添加 usr 鉤子。這將在掛載 root 後掛載 /usr 分區。在 0.9.0 之前,如果 /usr 在真實根目錄的 /etc/fstab 中找到,它會自動掛載。”

並且永遠不要忘記在每次更改 mkinitcpio.conf 後執行 mkinitcpio -p linux 以實際創建新圖像並將它們放置在正確的位置。

這聽起來很有希望,因為 my/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
   }
}

正如@Leiaz 在評論中非常正確地指出的那樣,/sbinArch(以及副檔名 Manjaro)現在是指向/usr/bin. 這意味著除非/usr被掛載,否則/usr/sbin/init將不存在。因此,您需要確保它/usr是由初始 ramdisk 安裝的。這就是您的 OP 中 Arch wiki 引用的意思:

如果將 /usr 保留為單獨的分區,則必須遵守以下要求:

  • 啟用 mkinitcpio-generate-shutdown-ramfs.service 或添加關閉掛鉤。
  • 添加 fsck 鉤子,在 /etc/fstab 中用 passno 0 標記 /usr。雖然推薦給所有人,但如果您希望 /usr 分區在啟動時被 fsck’ed,這是強制性的。沒有這個鉤子,/usr 將永遠不會被 fsck’d。
  • 添加 usr 鉤子。這將在掛載 root 後掛載 /usr 分區。在 0.9.0 之前,如果在真實根目錄的 /etc/fstab 中找到 /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"
  1. /usr用 0 的 passno標記/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 -----|
  1. 創建新的初始化映像。為此,您還必須掛載 Manjaro 的/usr目錄。
sudo mount /dev/sda12 ~/manjaro_root/usr

我對 Arch 沒有太多經驗,所以這可能不需要(你可能mkinitcpio沒有 a也可以執行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

您現在將處於一個認為~/manjaro_root/實際上是/. 您現在可以繼續生成新的初始映像

mkinitcpio -p linux
  1. 退出chroot
exit
  1. 更新您的grub.cfg(同樣,這實際上可能不需要):
sudo update-grub

現在重新啟動並嘗試再次啟動到 Manjaro。


1 “鉤子”是一些小腳本,告訴mkinitcpio它應該向它生成的初始化映像添加什麼。

引用自:https://unix.stackexchange.com/questions/139802