does not start on physical sector boundary ワーニング
古いPCで、Debian12のインストーラーに任せてパーテーションを作成して fdiskを実行したところ「 Partition 2 does not start on physical sector boundary. 」というワーニングがでていました。
今回はこれに対処します。
Partition 2 does not start on physical sector boundary.
Partition 2 does not start on physical sector boundary. のワーニングを和訳すると、パーテーションが物理セクタサイズの倍数で始まっていないことを意味します。
このワーニングが表示された際の詳細は次の通りです。
# fdisk -l isk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors Disk model: TOSHIBA MQ01ABF0 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: dos Disk identifier: 0x046e26a3 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 974772223 974770176 464.8G 83 Linux /dev/sda2 974774270 976771071 1996802 975M 5 Extended /dev/sda5 976771071 1996800 975M 82 Linux swap / Solaris Partition 2 does not start on physical sector boundary.
sda2 が拡張パーテーションとなっており、その中に論理パーテーションである sda5 が生成されています。
fdisk の表示はセクタの位置が表示されていますが、これは論理セクタで表現されています。今回の場合、論理セクタ(512)は物理セクタ(4096)の4分の1ですので、物理セクタの位置に合わせるには4で割切れなければいけないということになります。
ワーニングの通りsda2の開始位置である 974,774,270 は 4で割切れません。
このようなパーテーション構成は、パフォーマンスの低下やディスク寿命を縮める原因となります。
今回は Disklabel type が dos となっているので MBR で構成されているようです。念のため GPT版の fdisk である gdisk でも確認してみます。(gdiskはDebianの標準ツールには含まれていないため、別途インストールする必要があります)
gdisk -l /dev/sda GPT fdisk (gdisk) version 1.0.9 Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present *************************************************************** Found invalid GPT and valid MBR; converting MBR to GPT format in memory. *************************************************************** ...
出力されたメッセージによると GPT がおかしくて、 MBR が正しいので、MBR を内部的にGPTテーブルに変換しているという事ですが、実際は単にMBRで構成されていてそのパーテーションの位置がおかしいようです。
修正
ためしにDebianを再インストールしてみても同じようにパーテーションの位置がずれました。BIOSを使う古いPCのなので、MBRで構成されるのは問題ないのですが、その際に物理セクタを512で計算しているのかもしれません。
インストーラーでマニュアルでパーテーションを指定すればよさそうですが、それでもずれないとも限らないので、OSからfdiskを使って修正します。
通常のパーテーションならデータ一旦退避して修正後に戻しますが、今回はスワップ領域が対象なので退避データはありませんでした。パーテーションを変更する際は、可能なら操作対象ではない物理ディスクからOSを起動した方がいいです。それができない場合は操作対象のパーテーションはアンマウントするようにします。
スワップ領域の場合は、アンマウント=swapを止めることになります。
swapを止める際はメモリを多く使うような作業は控えるようにします。データベース等を運用していたら作業中は止めておいた方がいいと思います。
# swapoff -a
# fdisk /dev/sda Command (m for help): d # 既存の論理パーテーション5を削除 Partition number (1,2,5, default 5): 5 Partition 5 has been deleted. # 開始位置がずれている拡張パーテーション2を削除 Command (m for help): d Partition number (1,2, default 2): 2 # 拡張パーテーションを再作成 Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): e Partition number (2-4, default 2): 2 # OSからの操作だと位置に問題はないのでデフォルト値を使います First sector (974772224-976773167, default 974772224): Last sector, +/-sectors or +/-size{K,M,G,T,P} (974774272-976773167, default 976773167): Created a new partition 2 of type 'Extended' and of size 976 MiB. # 拡張パーテーション内に論理パーテーション(swap)を作成 Command (m for help): n All space for primary partitions is in use. Adding logical partition 5 First sector (974774272-976773167, default 974774272): Last sector, +/-sectors or +/-size{K,M,G,T,P} (974774272-976773167, default 976773167): # スワップ領域としてのシグネチャの削除の確認(y) Created a new partition 5 of type 'Linux' and of size 976 MiB. Partition #5 contains a swap signature. Do you want to remove the signature? [Y]es/[N]o: y The signature will be removed by a write command. # パーテーションタイプをスワップに Command (m for help): t Partition number (1,2,5, default 5): 5 Hex code or alias (type L to list all): 82 Changed type of partition 'Linux' to 'Linux swap / Solaris'. # 最終確認 Command (m for help): p Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors Disk model: TOSHIBA MQ01ABF0 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: dos Disk identifier: 0xcd916112 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 974772223 974770176 464.8G 83 Linux /dev/sda2 974772224 976773167 2000944 977M 5 Extended /dev/sda5 974774272 976773167 1998896 976M 82 Linux swap / Solaris # 書き込み Command (m for help): w The partition table has been altered. Syncing disks.
スワップとして利用するための作業を続けます。スワップファイルシステムを生成し、fstabのUUIDを書き換えます。
# spanファイルシステムの作成 # ここで出力されたUUIDをメモしておきます。 mkswap: /dev/sda5: Setting up swapspace version 1, size = 976 MiB (1023430656 bytes) no label, UUID=4a0fc006-be43-4b62-b608-d35b78d39c27
/etc/fstab をエディタで開き、メモしたUUIDを既存のものと書き換えます。
/etc/fstab
# swap was on /dev/sda5 during installation UUID=82345b02-553b-4b79-a088-402657f69801 none swap sw 0 0もし、メッセージを見逃してしまった場合は、管理者権限で、blkid か、 lsblk -f コマンドを実行することで再度確認ができます。
このUUID(Universally Unique Identifier)は一意となる識別子を意味します。
fstabでは、ファイルシステムに対してそれを割り当てることで、デバイス名の変更に影響を受けることなく、ファイルシステム管理することができます。
これは mkfs.ext4 コマンドを実行するなどファイルシステムが生成された時に付与されます、各ファイルシステムのメタデータとして保存されます(ファイルシステム別に保存のされかたが違うようです)。
似て異なるものの概念としてGPTのGUIDがありますが、これはパーテーションを一意に識別するためのもので、fstabのUUIDとは違います。
再起動して、再度 fdisk コマンドで確認します。
root@debian:~# fdisk -l Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors Disk model: TOSHIBA MQ01ABF0 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: dos Disk identifier: 0xcd916112 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 974772223 974770176 464.8G 83 Linux /dev/sda2 974774272 976773167 1998896 976M 5 Extended /dev/sda5 974776320 976773167 1996848 975M 82 Linux swap / Solaris
スワップ領域が少し小さくなりましたが、無事警告メッセージが消えました。
gave up waiting for suspend/resume device
後から気づいたのですが、Swapの変更をした場合、先の設定だけだと、起動時にウェイトがかかり「 gave up waiting for suspend/resume device 」が表示されます。
/etc/initramfs-tools/conf.d/resume ファイル内にもUUIDを指定する場所があり、これを更新したあと「 update-initramfs -u 」コマンドを実行します。
この解決法はQuiita:「gave up waiting for suspend/resume device の直し方」を参考にさせていただきました。ありがとうございました。
これらの作業が何をやっているかの説明します。
- initramfs-toolsディレクトリ
resume ファイルがあるinitramfs-toolsディレクトリは、initramfs を構成する際の追加設定を保存しておく場所となっています。
initramfs の役割についてはgihyoのページの解説がわかりやすかったですが、ルートのファイルシステムをマウントする際に必要なデバイスドライバを格納しておく一時的で小さなファイルシステムで「ミニルート」とも呼ばれるそうです。
/boot ディレクトリ内の initrd.img...等で始まるファイルが initramfs のファイルです。ファイル名には initrd という接頭がついていますが、厳密にいうと、initrd と initramfs は異なる技術です。initrd(Initial RAM Disk)が、メモリ上にディスクイメージとしてマウントされるのに対し、 initramfs(Initial RAM File System) はカーネルによって直接展開されて利用されます(ディスクイメージではありません)。initramfs の方がより柔軟に起動時の設定が可能です。
- update-initramfs
update-initramfs は initramfs イメージを作成するためのコマンドです。-uオプションで既存の initramfs を更新します。これはカーネルモジュール(カーネルの機能を拡張したりする場合などに用いるコード)の設定を追加・削除したりする場合に用いられます。
よくあるのは、modprove、insmod、rmmod によって変更しているカ―ネールモジュールの操作を、/etc/initramfs-tools/modulesファイルに設定する(モジュール名を入力する)ことで、それらを初期状態に反映させることができます。
resume ファイル内では、レジューム時に使うSwapファイルシステムのUUIDを指定することで、ハイバネーション(休止)からのレジューム(再開)時に利用されます。
先のエラーはここで指定したファイルシステムが見つからない為におきたものでした。
Windowsがpagefile.sys(ページファイル)に仮想メモリを保持し、hiberfil.sysにハイバネーションデータを保持するのに対し、Debianではその両方をスワップ領域で処理します。そのため、仮想メモリを使っていている場合は、通常のメモリの内容と仮想メモリの内容を保持しないといけません。その理由からハイバネーションをする際は、スワップファイル領域のサイズは物理メモリサイズの2倍程度のサイズが推奨されています。
GPTテーブルの修正
本当にGPTテーブルが壊れていて修正したいなら、fdisk や gdisk で 修正する事が可能です。
gdisk コマンドででパーテーション編集プロンプトに入ります。
/dev/sda GPT fdisk (gdisk) version 1.0.9 Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present *************************************************************** Found invalid GPT and valid MBR; converting MBR to GPT format in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by typing 'q' if you don't want to convert your MBR partitions to GPT format! ***************************************************************
ここでも、GPTテーブルが不正である旨のワーニングがでています。
システム全体を壊す可能性があるかもしれないとの事です。筆者の場合は失って困るデータは入っていませんでしたので気にせずに続けます。
プロンプトで、r を押すとプロンプトが変わり、リカバリーモードになります。この状態で ? を押すといつもと違ったメニューがでます。
Command (? for help): r Recovery/transformation command (? for help): ? b use backup GPT header (rebuilding main) c load backup partition table from disk (rebuilding main) d use main GPT header (rebuilding backup) e load main partition table from disk (rebuilding backup) f load MBR and build fresh GPT from it g convert GPT into MBR and exit h make hybrid MBR i show detailed information on a partition l load partition data from a backup file m return to main menu o print protective MBR data p print the partition table q quit without saving changes t transform BSD disklabel partition v verify disk w write table to disk and exit x extra functionality (experts only) ? print this menu
例えば「f:load MBR and build fresh GPT from it」(MBRを読み込んで、新しいGPTをそこからビルド)を選択し、w で書き込みをします。
Recovery/transformation command (? for help): f Warning! This will destroy the currently defined partitions! Proceed? (Y/N): Y Recovery/transformation command (? for help): w 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.
この後、PCの再起動をします。
先ほどの環境(MBR only)でこれを行うと、当然ですがただしくパーテーションが読み込めなくなりOSが起動しなくなります。