「入力/出力エラー」のため、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

したがって、最も基本的なシステムライブラリのサイズはゼロです。想像できる最も不適切な瞬間に衝突が発生したからです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

おすすめ記事