パーティション テーブルの再読み取りに失敗しました。エラー 16: デバイスまたはリソースがビジーです

パーティション テーブルの再読み取りに失敗しました。エラー 16: デバイスまたはリソースがビジーです

CentOS 6.x で USB フラッシュ ドライブを再パーティション化するときに、次のエラーが発生しました。

Disk /dev/sdb: 31.5 GB, 31466323968 bytes
255 heads, 63 sectors/track, 3825 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0e693bd9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1        3826    30727808    c  W95 FAT32 (LBA)
[root@csc ~]# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): d
Selected partition 1

Command (m for help): 1
1: unknown command
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): d   
No partition is defined yet!

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-3825, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-3825, default 3825): 
Using default value 3825

Command (m for help): 
Command (m for help):  
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 86
Changed system type of partition 1 to 86 (NTFS volume set)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

答え1

このデバイスはマウントされているようです。実行しumount /dev/sdb1てもう一度お試しください。

答え2

expect操作を自動化(例えば、 を使用)した結果、この結果が得られたと仮定するとfdisk(そして、パーティションは実際にはマウントされていません)、パーティションを変更した後、パーティションを書き込む前に、数秒の遅延を追加してみてください。

fdiskCentos 7.6 で次のように呼び出しを自動化しようとしたときに、同じエラーが発生しました。

# (echo "d"; echo "";
        echo "n"; echo ""; echo 3; echo 2001954; echo "";
        echo "w") | fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): Partition number (1-3, default 3): Partition 3 is deleted

Command (m for help): Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): Using default response p
Partition number (3,4, default 3): First sector (2001954-31116287, default 2002944): Last sector, +sectors or +size{K,M,G} (2001954-31116287, default 31116287): Using default value 31116287
Partition 3 of type Linux and of size 13.9 GiB is set

Command (m for help): The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


私の疑いは、パイプ入力されたコマンド ストリームがタイミングの問題fdisk(遅い/手動入力ではトリガーされない) を表面化させているということでした。そこで、エラーがなくなるまでさまざまな入力を遅らせるコマンドを散りばめ始めました。私の場合の問題は、新しいパーティションが定義された直後に問題が発生していたsleepことです。w

一貫した成功につながる結果sleep 5の前:w

# (echo "d"; echo "";
        echo "n"; echo ""; echo 3; echo 2001954; echo "";
        sleep 5; echo "w") | fdisk /dev/sdb

答え3

以前アレイのメンバーだったデバイスをマシンに接続すると、そのデバイスがビジー状態になるというのはよくあることですmdadm。これが当てはまるかどうかを確認するには、cat /proc/mdstatそこにリストされているアレイにドライブが表示されるかどうかを確認します。

1 つ以上のエラーが見つかった場合は、次の手順を実行して、以前の配列の関連付けからそれらを解放できます。

mdadm --stop /dev/md1234

/dev/md1234は に示されている配列です。/proc/mdadm再パーティション化しようとしているドライブに関連付けられている各配列に対してこれを実行してください。上記のコマンドでは、古くて使用されていない配列のみを指定するように注意してください。

実行前にこれを 1 回実行しfdisk /dev/sdxy、その後の fdisk コマンドがカーネル テーブルの更新に失敗した後も再度実行する必要がありました。その場合、`mdadm --stop ..." コマンドを再度実行し、fdisk を再度実行し、単に "w" コマンドを発行して何も変更しませんでした。2 回目は正常に動作しました。

答え4

コマンドを試してください: sudo resize2fs /dev/mmcblk0p2

関連情報