"입력/출력 오류"로 인해 chroot할 수 없습니다. 파일과 디스크가 정상적으로 표시됩니다.

"입력/출력 오류"로 인해 chroot할 수 없습니다. 파일과 디스크가 정상적으로 표시됩니다.

업데이트 중에 컴퓨터가 충돌한 후 시작되지 않은 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

chrootroaima의 추천을 받은 후, 내가 들어가고 싶은 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처리(압축해제 및 설정)하지 않기 때문에 (보통) 때때로 문제가 발생할 수 있습니다 . 그러나 이러한 라이브러리 파일에는 (분명히) 어떠한 속성도 필요하지 않으므로 그대로 사용하겠습니다.tarbsdtar

답변2

그렇지 않습니까 /bin/bash? 그렇지 않다면 프로세스가 필요한 파일을 사용하고 있을 수 있습니다. 다음을 통해 확인할 수 있습니다.lsof

관련 정보