손상된 Linux 설치를 복구하기 위해 chroot를 준비하는 올바른 방법은 무엇입니까?


52

이 질문은 자주 묻는 질문과 관련이 있습니다. 절차는 종종 외부에서 언급되거나 연결되지만 명확하고 정확하게 언급되지는 않습니다. 유용한 정보를 한 곳에 집중시키기 위해이 질문은이 절차에 대한 명확하고 정확한 참조를 제공하고자합니다.


복구 절차 를 위해 chroot 환경 을 준비하는 올바른 단계는 무엇입니까 ?

에서 많은 경우 , 깨진 리눅스 설치를 복구하는 가장 좋은 설치 내에서 수행된다. 그러나 시스템이 부팅되지 않으면 어떻게 내부에서 시스템을 수정합니까?

대체 시스템으로 부팅한다고 가정 해 봅시다. 설치가 완료되면 손상된 설치에 액세스하여 문제를 해결해야합니다. 대부분의 복구 방법-TOS는 사용하는 것이 좋습니다 의 chroot를 실제로 깨진 설치로 부팅하는 것처럼 프로그램을 실행하기 위해.

  • 기본 절차는 무엇입니까?
  • 준수해야 할 모범 사례가 있습니까?
  • 기본 준비 단계를 특정 복구 작업에 적용하려면 어떤 변수를 고려해야합니까?

커뮤니티 위키이므로이 질문을 수정하여 개선하십시오.

답변:


72

다음은 몇 가지 리소스입니다.

"루팅 변경"또는 "chrooting"은 파일 시스템의 일부를 확대하는 방법이므로 예를 들어에서 /path이전에 액세스 할 수 있었던 것을 참조합니다 /mnt/path. "chroot"표현식의 "root" /는 루트 사용자가 아닌 루트 파일 시스템을 나타냅니다 . (일반적으로 chroot하기 위해서는 루트 사용자 권한이 필요합니다.)

예비

  • 이 안내서의 모든 단계는 루트 사용자로 수행해야합니다.

  • 하드 디스크가 / 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) 의 다른 부분의 경우와 유사 일반적으로 무언가를 고치려고 할 때 / 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)로 chroot하려고 함을 나타냅니다. 해결책은 원하는 시스템과 동일한 아키텍처를 가진 LiveCD를 사용하는 것입니다. chroot into.)

이 시점에서 여전히 부팅 한 커널을 실행하고 있지만 모든 경로 /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

더러운 일을

이 시점에서 필요한 모든 문제 해결을 수행 할 수 있습니다.

  • 디스크의 MBR에 resintall GRUB
  • 잊어 버린 비밀번호 재설정
  • 커널 업그레이드 수행 (또는 다운 그레이드)
  • 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를 마운트 해제하려고 할 때 / mnt / usr이 여전히 마운트됩니다.

후자의 경우 문제가되는 마운트 포인트를 먼저 마운트 해제하십시오. 모든 현재 마운트 지점을 상기 시키려면 mount매개 변수없이 실행하십시오 .

드디어:

reboot

10
준비 과정에서 필자는 chroot.sh사용하는 모든 시스템의 루트에서 호출되는 스크립트를 남기는 경향이 있으며 그 내용은 위와 거의 일치합니다. LiveCD 등에서 해당 시스템으로 chroot해야 할 경우 루트 파일 시스템을 마운트하고 chroot 스크립트를 실행하면됩니다. 더 이상 올바른 명령에 열광적 인 인터넷 검색이 필요하지 않습니다.
라이언 톰슨

4
선생님, 저의 베이컨을 저장했습니다 – 훌륭한 글씨. 이와 같은 상황에서 SO에 +1000 버튼이 있기를 바랍니다.
zelanix

1
이것을 사용하십시오 : SHELL=/bin/bash chroot /mntlivecd의 기본 SHELL이 chroot 환경에 있지 않은 경우 (systemrescuecd의 defalut zsh가 예입니다) !Vim에서 수정하십시오 .
Alois Mahdal

나는 또한 /run요즘 마운트해야한다는 것을 알았습니다 mount --bind /run /mnt/run.
cengique
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.