Как правильно подготовить chroot для восстановления сломанной установки Linux?

52

Этот вопрос относится к часто задаваемым вопросам. Процедура часто упоминается или связана с выездом, но не часто четко и правильно изложена. Чтобы сконцентрировать полезную информацию в одном месте, этот вопрос призван дать четкую и правильную ссылку на эту процедуру.


Как правильно подготовить среду chroot для процедуры восстановления?

Во многих ситуациях восстановление поврежденной установки Linux лучше всего выполнить изнутри установки. Но если система не загружается, как это исправить изнутри?

Предположим, вам удалось загрузить альтернативную систему. Оказавшись там, вам нужно получить доступ к вашей сломанной установке, чтобы исправить это. Многие специалисты по восстановлению How-Tos рекомендуют использовать chroot для запуска программ, как будто вы действительно загружены в сломанную установку.

  • Какова основная процедура?
  • Есть ли принятые передовые практики для подражания?
  • Какие переменные необходимо учитывать, чтобы адаптировать основные подготовительные этапы к конкретной задаче восстановления?

Так как это Вики Сообщества, не стесняйтесь редактировать этот вопрос, чтобы улучшить его.

квикота
источник

Ответы:

72

Вот некоторые ресурсы:

«Изменение корня» или «chrooting» - это метод увеличения части вашей файловой системы, например, /pathдля ссылки на то, что ранее было доступно в /mnt/path. «Корень» в выражении «chroot» относится к корневой файловой системе /, а не к пользователю root. (Хотя, как правило, вам понадобятся привилегии пользователя root для того, чтобы выполнить chroot.)

подготовка

  • Все шаги в этом руководстве должны быть выполнены от имени пользователя root.

  • Мы предполагаем, что ваш жесткий диск находится в / dev / sda1, а его тип файла - ext3. Если вы не знаете местоположение и тип файла вашего диска, прочитайте вывод fdisk -l.

  • Убедитесь, что архитектура системы, в которую вы загрузились (например, это 32-битный LiveCD), и система, в которую вы хотите войти (например, это 32-битная установка на вашем жестком диске), совпадают. Вы можете определить архитектуру, с которой вы загрузились uname -m.

  • Убедитесь, что все модули ядра, которые вам нужны, были загружены.

  • Настройте свою сеть, если вам это нужно (например, для установки обновленных пакетов).

  • При необходимости инициализируйте раздел подкачки (например, swapon /dev/sda3).

Выполнение chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev

Если ваш /bootкаталог находится в другом разделе /, а вы хотите манипулировать файлами в нем (например, если вы будете работать с GRUB, выполнять обновление ядра и т. Д.), Вам также необходимо смонтировать этот раздел. Если он находится в / dev / sda2, а его тип файла - ext2, выполните:

mount -t ext2 /dev/sda2 /mnt/boot

Аналогично для любых других частей вашей файловой системы ( /var, /usr), которые находятся в отдельных разделах, но к которым вам необходим доступ. Обычно, когда вы используете chroot для исправления чего-либо, вам не нужен доступ к / home, поэтому вам не нужно беспокоиться об этом.

(Также возможно монтировать файловые системы после того, как вы выполните chroot, но это разумнее сделать заранее. Причина в том, что когда вы делаете это после, внешняя среда / ядро ​​не будет знать о смонтированных файловых системах, поэтому, если вы забудете Размонтируйте их перед выходом из chroot, и система не будет знать о том, как размонтировать их при завершении работы. Это может повредить эти файловые системы.)

Если вы настроили свою сеть и хотите использовать ее в изолированной системе, скопируйте ее, /etc/resolv.confчтобы иметь возможность разрешать доменные имена:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

Теперь вы готовы перейти к смонтированной файловой системе:

chroot /mnt /bin/bash

(Если это возвращает ошибку chroot: cannot run command '/bin/bash': Exec format error, это обычно означает, что вы загрузились с одной архитектурой (например, x86_32) и пытаетесь выполнить переход на другую (например, x86_64). Решение состоит в том, чтобы использовать LiveCD, который имеет ту же архитектуру, что и система, которую вы хотите Chroot в.)

На этом этапе вы все еще используете ядро, с которым загрузились, но все пути /pathбудут ссылаться на то, что было раньше /mnt/path.

Если вы будете что-то делать с GRUB, вам нужно быть уверенным, что ваш /etc/mtabфайл обновлен:

grep -v rootfs /proc/mounts > /etc/mtab

На этом этапе также может быть полезно:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

Делай свою грязную работу

На этом этапе вы можете выполнить любые необходимые действия по устранению неполадок:

  • повторно запустите GRUB на MBR вашего диска
  • сбросить забытый пароль
  • выполнить обновление ядра (или понижение версии)
  • восстановить свой initramdisk
  • исправьте ваш / etc / fstab
  • переустановите пакеты, используя менеджер пакетов
  • без разницы

Убираться

Когда вы закончите, убедитесь, что все запущенные программы остановлены. Затем выйдите из chroot:

exit

Теперь размонтируйте все разделы, которые вы установили:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

Наконец, попытайтесь размонтировать ваш жесткий диск:

umount /mnt

Если вы получаете сообщение о том, что / mnt (или любой другой раздел) занят, это может означать одно из двух:

  • Программа была запущена внутри chroot.

  • Или более часто: точка монтирования все еще существует на этом монтировании. Например, / mnt / usr все еще монтируется при попытке размонтировать / mnt.

В последнем случае сначала просто размонтируйте нарушающую точку монтирования. Чтобы получить напоминание обо всех текущих точках монтирования, запустите mountбез параметров.

В заключение:

reboot
dubiousjim
источник
10
В качестве подготовки я склоняюсь к тому, чтобы оставить скрипт, вызываемый chroot.shв корне каждой системы, которую я использую, содержание которой более или менее соответствует приведенному выше. Когда мне нужно войти в систему с LiveCD или чего-то еще, я просто монтирую корневую файловую систему и запускаю скрипт chroot. Больше не нужно безумно искать нужные команды.
Райан Томпсон
4
Вы, сэр, сохранили мой бекон - блестящая статья. В таких ситуациях я бы хотел, чтобы SO имел кнопку +1000.
Зеланикс
1
Используйте это: SHELL=/bin/bash chroot /mntесли SHELL по умолчанию в livecd не находится в изолированной среде (например, defalut zsh в systemrescuecd) для исправления, например, !в Vim.
Алоис Махдал
Я узнал, что вам также нужно смонтировать в /runэти дни с mount --bind /run /mnt/run.
Сенгик