업데이트 중에 컴퓨터가 충돌한 후 시작되지 않은 Arch 설치를 수정하려고 합니다(최악의 경우). 그러나 chroot
실패했습니다.
이것을 시도했습니다 :
# mount /dev/sdb2 /mnt/arch
# cd /mnt/arch
# mount --bind /dev dev
# mount --bind /proc proc
# mount --bind /sys sys
# chroot . bin/bash
chroot: failed to run command ‘bin/bash’: Input/output error
Exit 126
파일은 실제로 잘 읽힙니다.
# sha256sum bin/bash
3695f983ad6a1387826f769b96488f24e3635a1501fe89c96d3eadfa4e04caf7 bin/bash
파일 시스템과 디스크를 확인해 봅시다
# umount sys
# umount proc
# umount dev
# cd ..
# umount arch
# fsck -f /dev/sdb2
(보고된 오류 없음)
# smartctl -a /dev/sdb
(보고된 오류 없음)
디스크는 그리 오래되지 않은 SSD입니다. dmesg
관련 커널 오류 메시지가 표시되지 않습니다.
PS/편집:
# chroot . bin/bash
그리고
# chroot . /bin/bash
동일한 파일을 처리할 때 동일한 오류가 발생합니다. 존재합니다( sha256sum
명령 참조).
편집 2: @roaima가 라이브러리를 확인하라고 지적했습니다.
# ldd bin/bash
linux-vdso.so.1 (0x00007fff16563000)
libreadline.so.8 => /lib64/libreadline.so.8 (0x00007f6483600000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f64835f8000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6483430000)
libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f64833f8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6483778000)
그런 다음 다음을 확인하십시오 /mnt/arch
.
# ls -ld ./lib64/ld-linux-x86-64.so.2 ./lib64/ld-2.29.so ./usr/lib/libdl.so.2 ./usr/lib/libdl-2.29.so
-rwxr-xr-x 1 root root 0 Jun 23 10:33 ./lib64/ld-2.29.so
lrwxrwxrwx 1 root root 10 Jun 23 10:33 ./lib64/ld-linux-x86-64.so.2 -> ld-2.29.so
lrwxrwxrwx 1 root root 13 Jun 23 10:33 ./usr/lib/libdl.so.2 -> libdl-2.29.so
-rwxr-xr-x 1 root root 0 Jun 23 10:33 ./usr/lib/libdl-2.29.so
따라서 가장 기본적인 시스템 라이브러리의 크기는 0입니다. 왜냐하면 상상할 수 있는 가장 부적절한 순간에 충돌이 발생했기 때문입니다 glibc
.
답변1
chroot
roaima의 추천을 받은 후, 내가 들어가고 싶은 Arch Linux 시스템의 (공유 객체) 라이브러리, 특히 바이너리에서 사용하는 라이브러리를 확인했습니다 bin/bash
. 보다 구체적으로 0 크기 파일 /mnt/arch/lib64/ld-2.29.so
등 이 손상되었습니다 ./mnt/arch/usr/lib/libdl-2.29.so
Arch Linux에서 손상된 파일을 복구하기 위해 손상된 라이브러리가 포함된 패키지 파일 이름을 (인터넷에서) 검색했습니다. 파일은 여전히 패키지 관리자의 패키지 캐시에 있습니다.
/mnt/arch/var/cache/pacman/pkg/glibc-2.29-3-x86_64.pkg.tar.xz
chroot
다음과 같이 파일의 압축을 푼다(아직 ing 전).
cd /mnt/arch
tar --wildcards -xvJf var/cache/pacman/pkg/glibc-2.29-3-x86_64.pkg.tar.xz usr/lib/\*
패키지 파일에서 "usr/lib/*"와 일치하는 모든 파일을 추출합니다.
그 후에는 내가 chroot
원하는 것을 실제로 할 수 있습니다. 가장 먼저 한 일은 pacman -Syu
실패한 업데이트를 완료하는 것이었습니다.
참고 사항:Arch Linux는 BSD를 사용하여 tar
패키지 파일을 패키지/압축 해제합니다. 저는 GNU를 사용합니다 tar
. GNU가 BSD ( ) 에 의해 예약/설정된 특수 파일 속성을 tar
처리(압축해제 및 설정)하지 않기 때문에 (보통) 때때로 문제가 발생할 수 있습니다 . 그러나 이러한 라이브러리 파일에는 (분명히) 어떠한 속성도 필요하지 않으므로 그대로 사용하겠습니다.tar
bsdtar
답변2
그렇지 않습니까 /bin/bash
? 그렇지 않다면 프로세스가 필요한 파일을 사용하고 있을 수 있습니다. 다음을 통해 확인할 수 있습니다.lsof