Debian 9.0Stretchのカーネルを4.9.0-1-AMD64にアップグレードしています。
パッケージはインストールされていますが、手順の最後に不可解なエラーが発生しました。
device-mapper: reload ioctl on osprober-linux-sda2 failed: Device or resource busy
Command failed
また、再起動して、正しく起動しないことも心配です。
dpkg-reconfigure linux-image-4.9.0-1-AMD64
を実行しても同じエラーが発生します。
奇妙なことに、/etc/fstab
にはsda2
パーティションがなく、この手順はこれまで機能していました。最後のパッケージのアップグレード後に動作を停止しただけです(実際に、最後のudev
パッケージを232-18にアップグレードした後、最初にエラーが発生したことを私は確信できました)。 Jessieを搭載したVMは引き続き正常に動作しています。
したがって、fstab
は次のようになります。
$cat /etc/fstab
/dev/sda1 / ext3 errors=remount-ro,noatime 0 1
/dev/sda3 none swap sw 0 0
ただし、blkid
を実行すると、/dev/sda2
がext3ジャーナリングパーティションであることを覚えています。
/dev/sda1: UUID="43dcd715-1914-4da8-8e55-27879705920a" EXT_JOURNAL="b153f326-cb4e-491b-9b38-f9750dcf5165" TYPE="ext3" PARTUUID="8aac691c-01"
/dev/sda2: LABEL="j-my-dev" UUID="b153f326-cb4e-491b-9b38-f9750dcf5165" LOGUUID="b153f326-cb4e-491b-9b38-f9750dcf5165" TYPE="jbd" PARTUUID="8aac691c-02"
/dev/sda3: UUID="a04c0b69-07d5-40e1-8c80-6914118f6df4" TYPE="swap" PARTUUID="8aac691c-03"
もう少し調査したところ、古いsda2
がまだ含まれているダングリングファイルも見つかりました(このVMは、何ヶ月も前にLVMのサーバーから移行されたため)
/etc/blkid.tab
の内容は次のとおりです。
<device DEVNO="0x0802" TIME="1414777337.116803" UUID="B24u3l-mvwB-vyxK-GRNw-vc6o-r2sS-NDgVru" TYPE="LVM2_member">/dev/sda2</device>
私はそれを削除しましたが、適切なblkid.tab
は/var/run/blkid/blkid.tab
で期待どおりであるため、おそらく何の違いもありません。
<device DEVNO="0x0801" TIME="1487991512.317454" UUID="43dcd715-1914-4da8-8e55-27879705920a" EXT_JOURNAL="b153f326-cb4e-491b-9b38-f9750dcf5165" TYPE="ext3" PARTUUID="8aac691c-01">/dev/sda1</device>
<device DEVNO="0x0802" TIME="1487991415.63466" LABEL="j-my-dev" UUID="b153f326-cb4e-491b-9b38-f9750dcf5165" LOGUUID="b153f326-cb4e-491b-9b38-f9750dcf5165" TYPE="jbd" PARTUUID="8aac691c-02">/dev/sda2</device>
<device DEVNO="0x0803" TIME="1487991512.507280" UUID="a04c0b69-07d5-40e1-8c80-6914118f6df4" TYPE="swap" PARTUUID="8aac691c-03">/dev/sda3</device>
以前のdpkg-reconfigure
を実行しても、同じエラーが発生します。
また、upgrade-grub
で呼び出されているdpkg-reconfigure
にエラーを特定することもできました。個別に実行する:
#update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.9.0-1-AMD64
Found initrd image: /boot/initrd.img-4.9.0-1-AMD64
device-mapper: reload ioctl on osprober-linux-sda2 failed: Device or resource busy
Command failed
done
upgrade-grub
を囲んで、これが/etc/grub.d/30_os-prober
で発生することは明らかであり、そのスクリプトを読むと、問題のコマンドはos-prober
です。
だからそれを実行します:
#os-prober
device-mapper: reload ioctl on osprober-linux-sda2 failed: Device or resource busy
Command failed
エラーはos-prober
の呼び出しから発生します:
#/usr/bin/linux-boot-prober /dev/sda2
device-mapper: reload ioctl on osprober-linux-sda2 failed: Device or resource busy
Command failed
30_os-prober
を見ると、GRUB_OS_PROBER_SKIP_LIST
についてもわかります。
if [ "x${GRUB_OS_PROBER_SKIP_LIST}" != "x" ] && [ "x`echo ${GRUB_OS_PROBER_SKIP_LIST} | grep -i -e '\b'${EXPUUID}'\b'`" != "x" ] ; then
echo "Skipped ${LONGNAME} on ${DEVICE} by user request." >&2
continue
fi
グーグルでこの記事を見つけました: grub2に特定のパーティションを無視させます 、これにより/etc/default/grub
を入力しました:
GRUB_OS_PROBER_SKIP_LIST="b153f326-cb4e-491b-9b38-f9750dcf5165@/dev/sda2"
ただし、エラーは引き続き発生し、30_os-prober
スクリプトをデバッグモードにすると、GRUB_OS_PROBER_SKIP_LIST
の処理を担当するコードブロックが実行されないことが示されます。例えば上に表示されているif
行にも到達しません。
私のGRUBバージョンは2.02~beta3-5
です。どうしたらいいですか?
更新:@ GaD3Rリクエストに従って、libmapper-devは1.02.1です
GRUB_OS_PROBER_SKIP_LIST
が使用されていないようです(バグ?)。代わりに、すべてのパーティションでOSをスキャンしないようにGRUB/os-proberを構成する必要がありました。
そのため、次の行に/etc/default/grub
が追加されました。
GRUB_DISABLE_OS_PROBER=true
これで、コマンドdpkg-reconfigure linux-image-4.9.0-1-AMD64
およびupdate-grub
が正しく機能するようになりました。
問題のサーバーもカーネル4.9.0-1-AMD64
で再起動され、成功しました。
関連する質問、私がすべてのデバッグとソリューションの後に見つけた here も、代替としてos-prober
を完全に削除することを提唱しています。このソリューションは、スクリプトがバイナリを呼び出す前にその存在を確認するときにも機能します。
os-prober
はマルチOSグラブにのみ必要だと思いますが、私の場合はそうではありません。
@FerencWágnerの 歴史的な問題 とos-prober
についてのコメントの後、LinuxのみのVMのコンテキストでos-proberを削除しても問題がないという意見を共有した後、実際に削除しました私のVMから。
zfs
ミラーがあるため、このエラーdevice-mapper: reload ioctl on osprober-linux-sda1 failed: Device or resource busy
を受け取りました。
/etc/grub.d/30_os-prober
は、一致するデバイスをos-prober
の出力に依存しています。
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
デバイスはloop
でチェックされます:
for OS in ${OSPROBED} ; do
&os-prober
はデバイスを返す代わりにioctl
エラーを返すため、$OS
の$GRUB_OS_PROBER_SKIP_LIST
に対して/etc/grub.d/30_os-prober
をチェックしても効果はありません。
解決策は、デバイスを/etc/default/grub
の形式でUUID@device_path
に追加することでした。
GRUB_OS_PROBER_SKIP_LIST="1234567899273705219@/dev/sda1 1234567899273705219@/dev/sdb1"
&/usr/bin/os-prober
を編集:
--- /usr/bin/os-prober 2018-10-15 17:46:19.420933449 +0100
+++ /usr/bin/os-prober.bak 2018-10-15 16:44:49.927531809 +0100
@@ -167,12 +167,6 @@ for partition in $(partitions); do
continue
fi
- # Skip user defined devices in /etc/default/grub
- if echo $GRUB_OS_PROBER_SKIP_LIST | grep -qw $partition; then
- debug "$partition: probing disabled by user"
- continue
- fi
-
# do btrfs processing here; both mounted and unmounted will
# be handled by 50mounted-tests so we can do a subvol only once.
type=$(blkid -o value -s TYPE $mapped || true)
前:
[stuart@manjaro ~]$ Sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux-hardened
Found initrd image: /boot/intel-ucode.img /boot/AMD-ucode.img /boot/initramfs-linux-hardened.img
Found initrd fallback image: /boot/initramfs-linux-hardened-fallback.img
Found linux image: /boot/vmlinuz-4.14-rt-x86_64
Found initrd image: /boot/intel-ucode.img /boot/AMD-ucode.img /boot/initramfs-4.14-rt-x86_64.img
Found initrd fallback image: /boot/initramfs-4.14-rt-x86_64-fallback.img
device-mapper: reload ioctl on osprober-linux-sda1 failed: Device or resource busy
Command failed.
device-mapper: reload ioctl on osprober-linux-sdb1 failed: Device or resource busy
Command failed.
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
###### - Grub-btrfs: Auto-detect Start - ######
# found 0 snapshot(s)
# No snapshot found
# make sure you have at least one snapshot
# or please file a bug report at "https://github.com/Antynea/grub-btrfs"
###### - Grub-btrfs: Auto-detect End - ######
Found memtest86+ image: /boot/memtest86+/memtest.bin
/usr/bin/grub-probe: warning: unknown device type nvme0n1.
done
後:
[stuart@manjaro ~]$ Sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux-hardened
Found initrd image: /boot/intel-ucode.img /boot/AMD-ucode.img /boot/initramfs-linux-hardened.img
Found initrd fallback image: /boot/initramfs-linux-hardened-fallback.img
Found linux image: /boot/vmlinuz-4.14-rt-x86_64
Found initrd image: /boot/intel-ucode.img /boot/AMD-ucode.img /boot/initramfs-4.14-rt-x86_64.img
Found initrd fallback image: /boot/initramfs-4.14-rt-x86_64-fallback.img
Found Windows Boot Manager on /dev/nvme0n1p2@/EFI/Microsoft/Boot/bootmgfw.efi
###### - Grub-btrfs: Auto-detect Start - ######
# found 0 snapshot(s)
# No snapshot found
# make sure you have at least one snapshot
# or please file a bug report at "https://github.com/Antynea/grub-btrfs"
###### - Grub-btrfs: Auto-detect End - ######
Found memtest86+ image: /boot/memtest86+/memtest.bin
/usr/bin/grub-probe: warning: unknown device type nvme0n1.
done