Який правильний спосіб підготувати chroot до відновлення зламаної установки Linux?


52

Це питання стосується питань, які часто задаються. Процедура часто згадується або пов'язується з сторонніми місцями, але не часто є чітко та правильно вказаною. З метою зосередити корисну інформацію в одному місці, це питання має на меті дати чітке, правильне посилання на цю процедуру.


Які належні кроки для підготовки середовища chroot до процедури відновлення?

У багатьох ситуаціях ремонт несправної установки Linux найкраще проводити зсередини інсталяції. Але якщо система не завантажиться, як це виправити зсередини?

Припустимо, вам вдається завантажитися в альтернативну систему. Потрапивши туди, вам потрібно отримати доступ до зламаної установки, щоб її виправити. Багато практичних запитів щодо відновлення рекомендують використовувати chroot для запуску програм, як ніби ви насправді завантажені в зламану установку.

  • Яка основна процедура?
  • Чи прийняті найкращі практики, яких слід дотримуватися?
  • Які змінні потрібно врахувати, щоб адаптувати основні етапи підготовки до конкретного завдання відновлення?

Оскільки це спільнота Wiki, сміливо відредагуйте це питання, щоб також покращити його.

Відповіді:


72

Ось деякі ресурси:

"Зміна кореня" або "хротування" - це метод збільшення масштабу на частині вашої файлової системи, так що, наприклад, /pathбуде посилатися на те, що раніше було доступне на /mnt/path. "Корінь" у виразі "chroot" відноситься до кореневої файлової системи /, а не до кореневого користувача. (Хоча, як правило, вам знадобляться користувацькі привілеї для кореневого користування.)

Підготовка

  • Усі кроки в цьому посібнику повинні бути виконані як користувач root.

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

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

  • Переконайтесь, що завантажені будь-які модулі ядра.

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

  • Ініціалізуйте свій розділ swap, якщо це необхідно (наприклад, swapon /dev/sda3).

Виконання хроту

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, система не знатиме, як їх вимкнути, коли вона вимкнеться. Це може пошкодити ці файлові системи.)

Якщо ви налаштували свою мережу та хочете використовувати її в системі, що вбудовується, скопіюйте її /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

10
Під час підготовки я, як правило, залишаю скрипт, який називається chroot.shв корені кожної використовуваної нами системи, вміст якої більш-менш відповідає вищенаведеному. Коли мені потрібно перейти до цієї системи з LiveCD або чогось іншого, я просто монтую кореневу файлову систему і запускаю скрипт chroot. Більше шаленого гуглювання для правильних команд немає.
Райан Томпсон

4
Ви, пане, врятували моє бекон - геніальне написання. У таких ситуаціях я хотів би, щоб SO мав кнопку +1000.
zelanix

1
Використовуйте це: SHELL=/bin/bash chroot /mntякщо за замовчуванням livecd SHELL не знаходиться в захищеному середовищі (приклад systemrescuecd defalut zsh є прикладом) для виправлення, наприклад, !у Vim.
Алоїз Магдал

Я дізнався, що вам теж потрібно монтуватися в /runці дні mount --bind /run /mnt/run.
cengique
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.