Jaki jest właściwy sposób przygotowania chroot do odzyskania uszkodzonej instalacji Linux?

52

To pytanie dotyczy często zadawanych pytań. Procedura jest często wymieniana lub powiązana z usługą poza siedzibą, ale często nie jest jasno i poprawnie określona. Aby skoncentrować przydatne informacje w jednym miejscu, pytanie to ma na celu zapewnienie jasnego i poprawnego odniesienia do tej procedury.


Jakie są właściwe kroki, aby przygotować środowisko chroot do procedury odzyskiwania?

W wielu sytuacjach naprawę zepsutej instalacji systemu Linux najlepiej wykonać z poziomu instalacji. Ale jeśli system nie chce się uruchomić, jak to naprawić od wewnątrz?

Załóżmy, że udało Ci się uruchomić system alternatywny. Tam musisz uzyskać dostęp do uszkodzonej instalacji, aby ją naprawić. Wielu How-Tos do odzyskiwania zaleca używanie chroot w celu uruchamiania programów tak, jakbyś faktycznie uruchomił się w uszkodzonej instalacji.

  • Jaka jest podstawowa procedura?
  • Czy są akceptowane sprawdzone praktyki?
  • Jakie zmienne należy wziąć pod uwagę, aby dostosować podstawowe kroki przygotowawcze do konkretnego zadania odzyskiwania?

Ponieważ jest to Wiki Wiki, możesz również edytować to pytanie, aby je poprawić.

quixote
źródło

Odpowiedzi:

72

Oto niektóre zasoby:

„Zmiana katalogu głównego” lub „chrootowanie” to metoda powiększania części systemu plików, aby na przykład /pathodwoływać się do tego, co wcześniej było dostępne /mnt/path. „Root” w wyrażeniu „chroot” odnosi się do głównego systemu plików /, a nie do użytkownika root. (Chociaż zazwyczaj będziesz potrzebował uprawnień użytkownika root, aby wykonać chroot.)

Przygotowanie

  • Wszystkie kroki w tym przewodniku należy wykonać jako użytkownik root.

  • Zakładamy, że twój dysk twardy znajduje się w / dev / sda1, a jego typ pliku to ext3. Jeśli nie znasz lokalizacji i rodzaju pliku na dysku, przeczytaj dane wyjściowe fdisk -l.

  • Upewnij się, że architektura systemu, w którym się uruchomiłeś (np. 32-bitowy dysk LiveCD) i systemu, do którego chcesz wejść (np. 32-bitowa instalacja na dysku twardym) jest zgodna. Możesz określić architekturę, z której uruchomiłeś system uname -m.

  • Upewnij się, że wszystkie wymagane moduły jądra zostały załadowane.

  • Skonfiguruj sieć, jeśli jej potrzebujesz (np. W celu zainstalowania zaktualizowanych pakietów).

  • W razie potrzeby zainicjuj partycję wymiany (np swapon /dev/sda3.).

Wykonywanie 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

Jeśli twój /bootkatalog znajduje się na innej partycji niż twoja /i chcesz na nim manipulować plikami (np. Jeśli będziesz pracować z GRUB, przeprowadzając aktualizację jądra itp.), Musisz także zamontować tę partycję. Jeśli jest to / dev / sda2, a jego typ pliku to ext2, to wykonaj:

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

Podobnie w przypadku wszystkich innych części systemu plików ( /var, /usr), które znajdują się na osobnych partycjach, ale do których potrzebujesz dostępu. Ogólnie, gdy chrootujesz, aby naprawić coś, nie potrzebujesz dostępu do / home, więc nie musisz się tym przejmować.

(Możliwe jest również montowanie systemów plików po chrootowaniu, ale jest to mądrzejsze, aby zrobić to wcześniej. Powodem jest to, że gdy zrobisz to później, środowisko zewnętrzne / jądro nie będzie wiedziało o zamontowanych systemach plików, więc jeśli zapomnisz umountuj je przed wyjściem z chroota, system nie będzie wiedział, jak je zamontować, gdy się wyłączy. Może to uszkodzić te systemy plików.)

Jeśli masz skonfigurowaną sieć i chcesz jej używać w systemie chrootowanym, skopiuj /etc/resolv.confją, aby móc rozpoznać nazwy domen:

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

Teraz możesz przejść do zamontowanego systemu plików:

chroot /mnt /bin/bash

(Jeśli zwraca błąd chroot: cannot run command '/bin/bash': Exec format error, zwykle oznacza to, że uruchomiłeś jedną architekturę (np. X86_32) i próbujesz chrootować w innej (np. X86_64). Rozwiązaniem jest użycie LiveCD, który ma taką samą architekturę jak system, który chcesz chroot do.)

W tym momencie nadal uruchamiasz jądro, z którego uruchomiłeś system, ale wszystkie ścieżki /pathbędą odnosić się do tego, co kiedyś było /mnt/path.

Jeśli będziesz robić cokolwiek z GRUB, musisz upewnić się, że /etc/mtabplik jest aktualny:

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

W tym momencie pomocne może być również:

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

Wykonuj swoją brudną robotę

W tym momencie możesz wykonać wszelkie czynności związane z rozwiązywaniem problemów:

  • ponownie zainstaluj GRUB na MBR dysku
  • zresetować zapomniane hasło
  • wykonaj aktualizację jądra (lub obniżenie wersji)
  • odbuduj swój initramdisk
  • napraw / etc / fstab
  • zainstaluj ponownie pakiety za pomocą menedżera pakietów
  • cokolwiek

Sprzątanie

Po zakończeniu upewnij się, że wszystkie uruchomione programy zostały zatrzymane. Następnie wyjdź z chroot:

exit

Teraz odmontuj wszystkie zamontowane partycje:

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

Na koniec spróbuj odmontować dysk twardy:

umount /mnt

Jeśli pojawi się błąd informujący, że / mnt (lub inna partycja) jest zajęta, może to oznaczać jedną z dwóch rzeczy:

  • W chroocie został uruchomiony program.

  • Lub częściej: punkt montowania nadal istnieje na tym montażu. Na przykład / mnt / usr jest nadal montowany podczas próby odmontowania / mnt.

W tym drugim przypadku najpierw najpierw odmontuj obrażający punkt montowania. Aby uzyskać przypomnienie o wszystkich bieżących punktach instalacji, uruchom mountbez parametrów.

Wreszcie:

reboot
dubiousjim
źródło
10
Przygotowując się, zostawiam skrypt wywoływany chroot.shw katalogu głównym każdego używanego systemu, którego zawartość odpowiada mniej więcej powyższemu. Kiedy muszę chrootować do tego systemu z LiveCD lub czegoś takiego, po prostu montuję główny system plików i uruchamiam skrypt chroot. Nigdy więcej gorączkowego wyszukiwania w Google dla właściwych poleceń.
Ryan Thompson
4
Pan, proszę pana, uratował mi boczek - genialny napis. W takich sytuacjach chciałbym, aby SO miał przycisk +1000.
zelanix,
1
Skorzystaj z tego: SHELL=/bin/bash chroot /mntjeśli domyślna SKORUPA livecd nie znajduje się w środowisku chrootowanym (przykładowo defalut systemrescuecd zsh) to naprawić np. !W Vimie.
Alois Mahdal
Dowiedziałem się, że musisz także zamontować /runte dni mount --bind /run /mnt/run.
cengique