アップデート中にコンピュータがクラッシュした後に起動しなかった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
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