ОШИБКА: Корневое устройство, смонтированное успешно, но/sbin/init, не существует

Добавиться немного:

Основной формат для printf в тексте:

%s      # Print as is
%10     # Right justify minimum width print 10
%-10    # Left justify minimum width print 10
%.10    # Max width 10
%10.10  # Max width 10, min width print 10
%-10.10 # Left justify, max width 10, min width print 10
%*s     # Same as above, but get number from arguments
%-*s    # Same as above, but get number from arguments
...

Когда каждый получает длинные шаблоны, это может стать немного грязным для отслеживания на где и который и т.д. Один способ сделать это немного легче мог быть чем-то вроде этого:

#!/bin/bash

usage()
{
    printf "Usage: %s <FILE>\n" "$(basename "$0")" >&2
    [[ -n "$1" ]] && echo "$1"
    exit 1
}

if [[ ! -t 0 ]]; then
    : # Piped to
elif [[ $# -eq 0 ]]; then
    usage "Missing file."
elif [[ ! -r "$1" ]]; then
    usage "Unable to read \`$1'."
else
    # Accept input from file to file descriptor 0, aka stdin
    exec 0< "$1"
fi

fmt=""
fmt="$fmt%s|"       # F1
fmt="$fmt%-24.24s|" # F2
fmt="$fmt%-30s|"    # F3
fmt="$fmt%-10.10s|" # F4
fmt="$fmt%-10.10s|" # F5
fmt="$fmt%-10s|"    # F6
fmt="$fmt%-2.2s|"   # F7
fmt="$fmt%-2.2s|\n" # F8

# Set IFS to newline and bar and read fields
# assigning them to f1 ... f8
#
while IFS=$'\n'"|" read f1 f2 f3 f4 f5 f6 f7 f8; do
    printf "$fmt"\
    "$f1" "$f2" "$f3" "$f4" \
    "$f5" "$f6" "$f7" "$f8"
done <&0

Или. например:

while IFS=$'\n'"|" read f1 f2 f3 f4 f5 f6 f7 f8; do
    printf "%s|%-*.*s|%-*s\n" \
    "$f1" \
    24 24 "$f2" \
    30 "$f3"
done < "input"

Если это - только строка, анализирующая затем awk, хорошая альтернатива. например:

#!/usr/bin/awk -f

BEGIN {FS="|"}
/^/ {
    printf "%s|%-24.24s|%-30s|%-10.10s|%-10.10s|%-10s\n",
        $1, $2, $3, $4, $5, $6
}

Или:

#!/usr/bin/awk -f

BEGIN {
    FS="|"
}
/^/ {
    printf "%s|%-*.*s|%-*s|%-*.*s|%-*.*s|%-*s\n",
        $1,
        24, 24, $2,
        30, $3,
        10, 10, $4,
        10, 10, $5,
        10, $6
}
7
30.06.2014, 03:04
3 ответа

Так как @Leiaz очень правильно указал в комментариях, /sbin в Arch (и, соответственно, Manjaro) теперь является симлинкой к /usr/bin. Это означает, что если не установить /usr, то /usr/sbin/init не будет существовать. Поэтому необходимо убедиться, что /usr монтируется начальным разветвителем. Это то, что означает цитата из вики Arch в вашем ОП:

Если вы сохраняете /usr как отдельный раздел, вы должны придерживаться следующих требований:

  • Включите mkinitcpio-generate-shutdown-ramfs.service или добавьте крюк выключения.

  • Добавьте крюк fsck, отметьте /usr пассом 0 в /etc/fstab. Хотя это рекомендуется для всех, это обязательно, если вы хотите, чтобы ваш раздел /usr был fsck'ed при загрузке. Без этого крюка, /usr никогда не будет fsck'd.

  • Добавьте крюк usr. Это позволит монтировать раздел /usr после того, как будет смонтирован root. До версии 0.9.0 монтирование /usr было бы автоматическим, если бы он был найден в /etc/fstab настоящего root'а.

Итак, вам нужно сгенерировать новый init-файл с правильными hooks1. Они добавляются путем изменения строки 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 files systemss shutdown usr fsck".
    
  3. Отметьте /usr с пассом 0 в /etc/fstab. Для этого откройте manjaro_root/etc/fstab и найдите строку /usr. Для этого примера я буду считать, что это /dev/sda12, но используйте ту, которая находится в вашей системе. Номер "pass" является последним полем записи /etc/fstab. Итак, вам нужно убедиться, что строка выглядит как

    /dev/sda12 /usr ext4 rw,errors=remount-ro 0 0
     ^
     Это важный сайт |-----.
    
  4. Создайте новое изображение. Для этого вам также необходимо смонтировать каталог Manjaro /usr.

    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/ на самом деле /. Теперь вы можете сгенерировать свой новый init-образ

    mkinitcpio -p linux.
    
  5. Выход из хроота

     выход
    
  6. Обновите ваш grub.cfg (опять же, это может и не понадобиться):

    sudo update-grub
    

Теперь перезагрузитесь и попробуйте загрузиться в Manjaro снова.


1 "Hooks" - это маленькие сценарии, которые говорят mkinitcpio, что нужно добавить к создаваемому им init-образу.

.
7
27.01.2020, 20:17

С Mint вы можете изменить корень на вашу установку 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

Как объяснено в wiki : "Hooks - это маленькие скрипты, которые описывают то, что будет добавлено в образ". Отредактируйте /etc/mkinitcpio.conf, добавьте usr fsck и shutdown hooks к записи HOOK, как указано в вики и комментариях. Восстановите initramfs : mkinitcpio -p linux (будет записано в /boot)

Выходите из chroot, размонтируйте proc, sys, dev и Manjaro разделы и попробуйте перезагрузиться.

.
2
27.01.2020, 20:17

Только что потратил около 6 часов на создание загрузочного устройства USB для Linux Mint, резервное копирование всех моих данных с двух разделов и различные попытки спасения после получения ужасного сообщения sbin/init not found...

Это произошло после небольшого обновления - система не перезагружалась. Похоже, что вся папка sbin была таинственным образом удалена и не могла быть восстановлена. Единственным разумным советом, который я смог найти, была "переустановка".

Решение (менее 5 минут!!) было следующим:

  1. загрузитесь с оригинального установочного диска (Cinnamon Mint 17. 1 в данном случае),
  2. открыть файловый проводник от имени root (либо щелкните правой кнопкой мыши на папке и выберите "открыть как root", либо откройте терминал и введите 'sudo nemo'
  3. найти папку sbin живой установки
  4. смонтировать поврежденный раздел Mint (щелкните на значке)
  5. изменить разрешения, применяемые к папке sbin (щелкните правой кнопкой мыши, Properties, Permissions, Others, File access, read and write - затем нажмите 'Apply Permissions to Enclosed Files')
  6. скопируйте всю папку sbin в корневой каталог установленной системы (/). (Здесь находятся системные папки 'bin', 'boot', 'home', 'usr' и т.д.)
  7. Перезагрузка
0
27.01.2020, 20:17

Теги

Похожие вопросы