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

87972
quack quixote

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


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

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

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

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

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

43

1 ответ на вопрос

64
dubiousjim

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

«Изменение корня» или «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/ 

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

umount /mnt 

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

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

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

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

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

reboot 
В качестве подготовки я склоняюсь к тому, чтобы оставить скрипт с именем `chroot.sh` в корне каждой системы, которую я использую, чье содержимое более или менее соответствует приведенному выше. Когда мне нужно войти в систему с LiveCD или чего-то еще, я просто монтирую корневую файловую систему и запускаю скрипт chroot. Нет больше безумного поиска в Google для правильных команд. Ryan Thompson 14 лет назад 9
Вы, сэр, сохранили мой бекон - блестящая статья. В таких ситуациях я бы хотел, чтобы у SO была кнопка +1000. zelanix 8 лет назад 3
Используйте это: `SHELL = / bin / bash chroot / mnt`, если SHELL по умолчанию в livecd не находится в chrooted среде (например, defalut zsh в systemrescuecd), чтобы исправить, например,`! `В Vim. Alois Mahdal 8 лет назад 1

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