パーティションのサイズ変更 fdisk が無効な引数で失敗する

パーティションのサイズ変更 fdisk が無効な引数で失敗する

最近、ホストのコントロール パネルを使用して、VPS を 50 GB SSD から 300 GB SSD にサイズ変更しました。新しいスペースをすべて使用できるように、現在、fdisk を使用してメイン パーティションのサイズを変更しようとしています。ただし、fdisk の起動時に警告が表示されます。

GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).
GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).

50GB から 300GB になったので、以前のサイズの 6 倍になっているのは明らかです。そこで、ヒントに従って表を書くことにしました...

Command (m for help): w
GPT PMBR size mismatch (104857599 != 629145599) will be corrected by w(rite).
fdisk: failed to write disklabel: Invalid argument

.. 動作しません。多くの検索クエリにもかかわらず、このエラーの原因はどこにも見つかりません。私は LVM を使用していませんが、パーティション テーブルは次のようになります。

Disk /dev/vda: 300 GiB, 322122547200 bytes, 629145600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 30D92031-0C13-42FF-AC16-D34F36DD3907

Device        Start       End  Sectors Size Type
/dev/vda1      2048     32767    30720  15M BIOS boot
/dev/vda2     32768  16809983 16777216   8G Linux swap
/dev/vda3  16809984 104857566 88047583  42G Linux filesystem

ディスクが 300GiB として表示され、サイズの変更が認識されていることに注意してください。

答え1

私はこれをかなり簡単に解決することができました。parted をインストールし、それを実行すると、パーティション テーブルがディスク全体をカバーしていない (当然) というメッセージが表示され、 とFix/Cancel応答するように求められました。 で応答しましたFix。 でパーティションをフル サイズに変更できたので、どうやらこれでうまくいったようですが、その後、変更を適用するには をsudo fdisk /dev/vda実行する必要がありました。sudo resize2fs /dev/vda3

答え2

これは、GPT パーティションを拡張しようとしたときにうまくいった方法です。いつものように、パーティション テーブルを変更するときは、計画どおりに進まなかった場合に備えてバックアップが不可欠です。

まず、すべての fdisk が同じように作られているわけではありません。Ubuntu 18.04 で私が使用している fdisk のバージョンは次のとおりです。

$ fdisk -v
fdisk from util-linux 2.31.1

fdisk を起動します。 'p' でパーティション テーブルを印刷し、既存のパーティション テーブルが GPT であることを確認します。

Disklabel type: gpt

パーティション情報をコピーして別のウィンドウに貼り付けると、開始セクターが正確に同じパーティションを再作成できます。

「g」キーを押して、古い GPT パーティション テーブルを新しい GPT パーティション テーブルに置き換えます。

もう一度「p」キーを押して新しいテーブル情報を印刷し、サイズが大きくなっていることを確認します。

パーティションを再作成するには、「n」を押します。最後のパーティションを除き、すべてのパーティションは開始セクターと最終セクターが正確に同じで再作成する必要があります。最後のパーティションは開始セクターが同じである必要がありますが、終了セクターは大きくすることができます。

パーティションにファイルシステムがある場合は、次のように表示されます。

Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: N

ファイルシステムの署名を保持する場合は、「N」で応答します。

fdisk プロンプトに戻り、もう一度「p」と入力してテーブルを確認し、すべてが正常に動作していることを確認します。

変更を書き込む(コミットする)には、「w」と入力します。

そこから、fdisk を終了し、標準の手順に従ってファイルシステムのサイズを変更します (例: ext4 のe2fsck -f場合resize2fs)。raw ディスク イメージ ファイル (QEMU 用など) で作業している場合は、 を使用してパーティションのループ デバイスを取得し、それらのループ デバイスで とをkpartx -av disk.img実行できます。e2fsckresize2fs

答え3

問題は、保護 MBR (PMBR) が小さすぎることです。次の方法で保護 MBR を変更できます。

  1. x追加機能
  2. M保護/ハイブリッドMBRに入る
  3. p保護されたMBRを表示できます)
  4. rメインメニューに戻ります(まだ保護 MBR モードです)。
  5. d間違ったサイズの保護MBRパーティションを削除する
  6. n新しいパーティションを作成するには 1 回、enterデフォルト設定 (プライマリ、パーティション番号 1、フルサイズ) を受け入れるには4 回
  7. tタイプをeeGPTに変更する
  8. x追加機能
  9. M保護/ハイブリッドMBRモードを終了する
  10. rメインメニューに戻る(再びGPTモードになります)
  11. w書く

これにより、GPT PMBR サイズの不一致を修正できました。

ディスクラベルの問題を修正するには、 を使用してパーティション テーブルをダンプしO、エクスポートされたスクリプトの last-lba を、 で報告されたディスク サイズからfdisk34 (セカンダリ GPT 用) を引いた値に変更する必要がありました。次に、 を使用してスクリプトを再インポートしましたI

答え4

gdisk で問題を修正しました。実行したことは次のとおりです。

sudo fdisk --list

GPT PMBR size mismatch (41943039 != 62914559) will be corrected by w(rite).
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 62D6A220-B955-44BE-9730-CC89FE5CA928

# Naive fix attempt:
sudo fdisk /dev/sda
w 
# ^^ fails with:
# GPT PMBR size mismatch (62914559 != 83886079) will be corrected by w(rite).
# fdisk: failed to write disklabel: Invalid argument

# try (because it is a GPT disk?)
viradmin@instance-2:~$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): ?
b   back up GPT data to a file
c   change a partition's name
d   delete a partition
i   show detailed information on a partition
l   list known partition types
n   add a new partition
o   create a new empty GUID partition table (GPT)
p   print the partition table
q   quit without saving changes
r   recovery and transformation options (experts only)
s   sort partitions
t   change a partition's type code
v   verify disk
w   write table to disk and exit
x   extra functionality (experts only)
?   print this menu

Command (? for help): w
Warning! Secondary header is placed too early on the disk! Do you want to
correct this problem? (Y/N): y
Have moved second header and partition table to correct location.

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

# then
sudo reboot

その後、私は次のことも行いました。これはGoogle CloudのUbuntuマシン上で実行されていたためです(ガイドに従ってhttps://slacker.ro/2019/07/17/how-to-increase-google-cloud-virtual-machine-disk-size/):

sudo apt install -y cloud-guest-utils
sudo growpart /dev/sda 1
sudo resize2fs /dev/sda1


stage@instance-2:/$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/root       30308240 16684136  13607720  56% /


# fixed:
sudo fdisk --list

Disk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 62D6A220-B955-44BE-9730-CC89FE5CA928

Device      Start      End  Sectors  Size Type
/dev/sda1  227328 83886046 83658719 39.9G Linux filesystem
/dev/sda14   2048    10239     8192    4M BIOS boot
/dev/sda15  10240   227327   217088  106M EFI System

この後、ディスクとパーティションは新しいサイズに適切に拡張されました。

これが役に立つことを願っています。

関連情報