時々、ディスクのパーティションをリサイズしたり、他の方法で変更したりすると、cfdiskは次のように表示します。
_
Wrote partition table, but re-read table failed. Reboot to update table.
_
(これは他のパーティションツールでも発生するので、これはcfdiskの問題ではなくLinuxの問題だと思います。)なぜこれが発生し、なぜそれが発生するのかときどきと、何ができるかそれを避けるために?
注:実際に編集しているパーティションが開かれていないか、マウントされていないか、使用されていると想定してください。
更新:
cfdiskはioctl(fd, BLKRRPART, NULL)
を使用して、パーティションテーブルを再度読み取るようにLinuxに指示します。これまでに推奨された他の2つのツール(_hdparm -z
_ DEVICE
、_sfdisk -R
_ DEVICE
)は正確に同じこと。一方、partprobe
DEVICE
コマンドは、BLKPGと呼ばれる新しいioctlを使用しているようです。知りません。 (BLKPGが失敗した場合は、BLKRRPARTにもフォールバックします。)
BLKPGは「このパーティションが変更されました。これは新しいサイズです」という操作のようで、渡されたデバイスのすべてのパーティションでpartprobe
が個別に呼び出したように見えるので、個々のパーティションが未使用。しかし、私はそれを試す機会がありませんでした。
私見最も信頼できる/最良の答えは
partprobe /dev/sdX
パーティションテーブル情報の再読み取りは常に機能するとは限りませんが、
hdparm -z /dev/sda
または
sfdisk -R /dev/sda
それが機能する場合、/ proc/partitionsの値が変更されます。
Centos7の場合:
によると https://access.redhat.com/solutions/19957
試してみてください :
partx -u <partition>
それは私のために働いた。
注:実際に編集しているパーティションが開かれていないか、マウントされていないか、使用されていると想定してください。
その仮定を前提として、パーティションテーブルcanは正常に再スキャンされ、問題は発生しません。このエラーが発生した場合、それはパーティションテーブルisが現在使用されているためであり、不整合を生じさせずに再スキャンすることはできません。
編集しているパーティションに基づいていません。
ハードディスクが1つ(/dev/sda
)と2つのパーティション(/dev/sda1
、/dev/sda2
)しかなく、1つのパーティション(/dev/sda1
)だけをマウントしたとします。マウントされていない他のパーティション(/dev/sda2
)を削除または変更すると、パーティションテーブルの再読み取りが失敗し、カーネルが古いテーブルを使用するというエラーが発生します。
ただし、2つのハードディスク(/dev/sda
、/dev/sdb
)があり、(/dev/sdb
)のどのパーティションも使用されていない場合。次に、/dev/sdb
のパーティションを追加/削除/サイズ変更/編集して、問題なく再読み取りできます。ただし、変更中に/ dev/sdbの1つのパーティションがマウントされていても。その後、カーネルは古いテーブルを使用し続けます。
私(元の質問者)は、数日前、他の回答(partprobe /dev/sdX
、現在受け入れられている最高投票の回答を含む)がどれも機能しなかった状況にありました。 didが機能したのはこれでした。
blockdev --rereadpt /dev/sdX
(なぜこれが機能し他の人が機能しなかったのかはわかりませんが、ビジー状態のサーバーで再起動する手間を省いたので、機能して満足しています。)
私はcentos 6.5 x64を使用しています。カーネル2.6.32。そして、私はリサイズするためにfdiskトリックをテストしています。
/dev/sda1 /boot
/dev/sda2 /
次のすべてのコマンドはnotでカーネルを再読み取りしました。
それを機能させるには、まだ再起動が必要です
すべてのマウントポイントをマウント解除して、Yocto 2.4を実行します。
partprobe /dev/sda
デバイスでパーティションが削除された後も、パーティションテーブルの再ロードに失敗しました。また試した-失敗した:
udevadm trigger --subsystem-match=block; udevadm settle
hdparm -z /dev/sda
blockdev --rereadpt /dev/sda
すべて、同様の「BLKRRPARTが失敗しました:デバイスまたはリソースがビジーです...」エラーが報告され、再起動するように指示されました。以前に機能していたメソッドのこの失敗は、おそらくudevがsystemdの制御下にあるという事実によるものですか?私が試したそれらの線に沿って考える:
systemctl restart systemd-udevd.service
そして突然、私のディスクは再び利用可能になります再起動なしで!
あなたも試すことができます:
echo 1 > /sys/block/sdX/device/rescan
(しかし、動作しません。以下のコメントを参照してください)
blockdev --rereadpt /dev/sdX
のようなコマンドが失敗して
blockdev: ioctl error on BLKRRPART: Device or resource busy
これは通常、一部の(古い)パーティションが実際にまだカーネルによって使用されていることを意味します。
考えられる原因/修正:
sdX1
がまだマウントされている-mount
で確認してアンマウント/dev/sdX1
はソフトウェアraidの一部です-cat /proc/mdstat
を確認し、関連するアレイを停止してください。 mdadm --stop /dev/md126
/dev/sdX1
はLVM物理ボリュームの一部です-pvdisplay
/vgdisplay
で確認し、vgchange
で非アクティブ化してください/dev/sdX1
は一部のデバイスマッピングの一部です。 cryptsetup
経由-/dev/mapper
とlsblk
を確認し、マッピングを削除してください(例:cryptsetup luksClose
)ps
で実行中のプロセスを確認し、おそらく1つを強制終了します1つのツール-blockdev --rereadpt
が失敗した場合、通常、(partx -uv
、kpartx
、partprobe
、kpartprobe
)のような同様のツールは、根本的な原因が取り除かれます。
kpartx -a <partition>
は、システムを再起動する代わりに、新しく作成されたパーティション....で2回実行できます。
私にとって、partprobe
ソリューションもblockdev
ソリューションも機能しませんでした。ただし、これは機能します:
udevadm settle --exit-if-exists=/dev/sdb1
Udevサービスが実行されていることを確認してください。これは、partprobe、hdparm、blockdev、およびその他のさまざまなコマンドによって、/ dev /ディレクトリで使用可能なデバイスファイルに違いが見られない場合に特に役立ちます。