Linux で「スーパーブロックを読み取れません」エラーを修正する方法 (ext4 および Btrfs)
最近、私の Linux デスクトップ コンピューターは 5TB の外付けハードディスク ドライブ (HDD) をマウントできず、ファイル マネージャーの画面に「スーパーブロックを読み取れません」というエラーが表示されます。エラーを修正するために私が行ったことを共有するので、同じ状況に陥っている場合は、この記事が役立つかもしれません。
ただし、その前に、Linux 上のハードディスク ドライブとファイル システムに関する基本的な知識を説明して、何をしているのかを実際に理解できるようにしたいと思います。それらの詳細を気にしない場合は、解決策に直接ジャンプできます。ハードディスクドライブ(HDD) は磁気ディスクです。ソリッドステートドライブ(SSD) は電子ディスクです。
ハードディスクドライブの構造
ハードディスクドライブには通常、複数の円形プラッターが垂直に積み重ねられており、中心でディスクを回転させるスピンドルが付いています。各プラッターは、データを記録するために磁化可能な材料でコーティングされています。各プラッター表面は数万のトラックに分割されています。スポーツにおけるランニングトラックのようなものです。
ヒント: ハードディスク ドライブは非常に複雑なデバイスなので、地面に落とすと簡単に損傷する可能性があります。
各トラックはセクターに分割されています。通常、トラックごとに数百のセクターがあり、各セクターは通常同じ長さです。セクタは、ディスクからデータを読み取るための最小単位です。つまり、セクターのデータの一部だけが必要な場合でも、読み書きヘッドはセクター全体を読み取ってデータを取得します。従来、1 つのセクターには512 バイトのデータが保存されます。 2009 年、業界はディスクの信頼性を向上させ、容量を増やすためにアドバンスト フォーマットとして知られる4Kセクター サイズ フォーマットを考案しました。 2011 年 1 月以降、ほとんどの新しいハード ドライブには 1 つのセクターに 4096 バイト のデータが保存されます。
物理セクタ サイズと論理セクタ サイズ
新しいハード ドライブは 4K アドバンスト フォーマットを使用しますが、オペレーティング システムは依然として 512 バイトのセクター サイズを想定しているため、HDD 上のファームウェアは 4K 物理セクターを複数の論理セクター (通常は 512 バイト) に分割します。 Linux では、fdisk コマンドを使用して HDD の物理セクター サイズと論理セクター サイズを確認できます。
fdisk -l /dev/sdaスクリーンショットから、 ハードディスクの物理セクター サイズは 4096 バイト、論理セクター サイズは 512 バイトであることがわかります。 I/O サイズは、オペレーティング システムがディスクから読み取るデータの最小チャンクです。
パーティションのアライメント
ファームウェアを使用して論理セクターを作成すると、特にファイル システム パーティションが物理セクターと一致していない場合、パフォーマンスが低下する可能性があります。パーティションの調整には 2 つの要件があります。
- 物理セクターには 8 つの論理セクターが含まれるため、各パーティションのセクター数は 8 の倍数である必要があります。
- 各パーティションの開始セクターは、物理セクターの最初の論理セクターである必要があります。セクター 0 はディスク全体の最初のセクターであるため、各パーティションの開始セクターはセクター 0、セクター 8、セクター 16 などの 8 の倍数である必要があることを意味します。
ハードディスク ドライブにパーティションを作成するときは、次の 2 つのパーティション テーブルに注意する必要があります。
- MBR: マスター ブート レコード。
- GPT: GUID パーティション テーブル。
新しいハードディスクを購入する場合は、新しいGPT 形式を使用してハードディスクをパーティション分割することをお勧めします。 MBR と GPT はどちらもディスクの先頭にあるセクターを使用するため、最初のパーティションの前に空きスペース (1MiB など) を残しておく必要があります。物理セクターに合わせてパーティションを作成するには、 ディスクをパーティション分割するときにセクターを単位として使用します。
parted (パーティション エディタ) ユーティリティを使用すると、ディスク パーティションが物理セクタと一致しているかどうかを簡単に確認できます。 parted は、MBR や GPT などの複数のパーティション テーブル形式をサポートするディスク パーティション エディタです。
まず、parted にディスクを使用するように指示します。例として my/dev/sdb を使用します。
parted /dev/sdb
次に、p と入力して、ディスク上のパーティション テーブルを出力します。そして、次のコマンドを実行してパーティションの配置を確認します。
align-check opt partition-number終了するには、「q」と入力します。
以下のスクリーンショットからわかるように、最初の 2 つのパーティションは適切に位置合わせされていません。 3 番目のパーティションは位置合わせされます。
SSDパーティションのアライメント
SSD の構造は HDD の構造とは大きく異なることに注意してください。 SSD モジュールの最小単位はセルと呼ばれます。連続するセルはページを形成し、その多くはブロックに編成されます。読み取りおよび書き込み操作はページ レベルで実行されます。 SSD のページ サイズは、メーカーやモデルによって異なります。 Linux コマンド ラインを使用してページ サイズを確認する簡単な方法はありません。これは、フラッシュ変換レイヤーによって OS が SSD を従来のハードディスクであると認識させるためです。 OS は SSD ページを理解せず、依然としてセクターを使用して SSD 上の場所を記述します。
一般的なページ サイズは 8KiB、16KiB、32KiB です。 SSD 上のパーティションを調整することも非常に重要です。パーティションの位置がずれていると、読み取りまたは書き込みのための余分なページが常に 1 つ存在します。パフォーマンスが低下するだけでなく、SSD の寿命も短くなります。 SSD 上のパーティションを適切に配置するには、SSD の先頭に 1 つの空のページ (例: 32KiB) を残し、SSD 上のすべてのパーティションのサイズがページ サイズの倍数であることを確認するだけです。
GParted を使用して SSD に最初のパーティションを作成すると、最初のパーティションの前に 1MiB の空き領域が自動的に残ります。これは 32 の空のページ (32 KiB * 32=1024 KiB) です。これで大丈夫です。次のスクリーンショットは、UEFI コンピューターの EFI システム パーティション (ESP) の作成を示しています。パーティション サイズは、FAT32 ファイル システムで 512MiB です。
ファイルシステム内のブロック
ファイルシステムにはブロックと呼ばれる概念があり、ディスク ドライブのセクターに似ています。多くの人がこれら 2 つの概念を混同しています。違いを理解するのはそれほど難しいことではありません。ディスク上にパーティションを作成する場合、セクタを使用してそのサイズを定義できます。ファイル システムでパーティションをフォーマットすると、ブロックが作成されます。
オペレーティング システムとファイル システムは、ディスク上のデータにセクタ単位ではなくブロック単位でアクセスします。通常、ブロックはセクターの倍数です。では、セクター内のデータにアクセスするだけではどうでしょうか?そうですね、ブロックはディスクの物理的な詳細を抽象化できます。セクターをアドレス指定する (セクターのアドレスを調べる) 場合は、CHS スキーム (シリンダー ヘッド セクター) を使用する必要があります。これは、ハードディスク ドライブに複数のプラッタがあるためです。セクターがどのプラッターとトラックに位置するかを知る必要があります。ブロックをアドレス指定する場合は、ブロックの物理的な詳細を知る必要がなく、ブロック 0、ブロック 1、ブロック 2 などを使用するだけです。ディスク。各ブロックは論理ブロック アドレス指定 (LBA) スキームを使用して 1 つのセクター (または複数のセクター) にマッピングされます。
スーパーブロック
ディスクまたはパーティションの最初のブロックはスーパーブロックと呼ばれ、これがプライマリ スーパーブロックです。スーパーブロックは突然の停電などで破損する可能性があるため、 スーパーブロックのバックアップ コピーがブロック グループに存在します。
- プライマリスーパーブロック
- バックアップスーパーブロック
スーパーブロックを読み取れません
OS が HDD 上のスーパーブロックを読み取れない理由はいくつか考えられます。
- HDDが地面に落ちてスーパーブロックが破損。これは通常、ディスク上の対応するセクターに対する物理的な損傷です。
- 突然の停電があります。スーパーブロックは RAM にキャッシュされるため、停電が発生した場合、ディスクに書き込まれていない重要な変更がスーパーブロックに存在する可能性があります。
プライマリ スーパーブロックが破損している場合、ファイル システムをマウントできません。ファイル システムをマウントしようとすると、オペレーティング システムはおそらく「スーパーブロックを読み取れません」と通知するでしょう。バックアップ コピーから不良スーパーブロックを回復する必要があります。次の手順は、ext4 および Btrfs ファイル システムのスーパーブロックを回復する方法を示しています。私のHDDは外付けハードディスクです。破損したファイルシステムがルートファイルシステムである場合は、Linux Live USB スティックからコンピュータを起動する必要があります。
ext4 ファイルシステム上のスーパーブロックを回復する
破損したパーティションのデバイス名を調べます。
sudo parted -lバックアップ スーパーブロックの場所を決定します。
sudo mke2fs -n /dev/xxxたとえば、私の HDD パーティションのデバイス名は /dev/sdb1 なので、次のコマンドを実行します。
sudo mke2fs -n /dev/sdb1パーティションに ext4 ファイル システムが含まれていることが表示されます。y を押して続行します。 -n オプションは mke2fs にファイル システムを作成しないように指示するので心配しないでください。
mke2fs 1.45.5 (07-Jan-2020)
/dev/sdb1 contains a ext4 file system labelled 'Stretch'
last mounted on /media/linux-terminal/b43e4eea-9796-4ac6-9c48-2bcaa46353732 on Thu Jan 28 02:43:43 2021
Proceed anyway? (y,N) y
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Filesystem UUID: fcae3dc8-ee11-412c-97f0-27106601314e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
下部に、バックアップ スーパーブロックの場所が表示されます。次に、最初のバックアップ コピーからスーパーブロックを復元します。
sudo e2fsck -b 32768 /dev/xxxこれで、ext4 パーティションをマウントできるようになります。
btrfs ファイルシステム上のスーパーブロックを回復する
破損したパーティションのデバイス名を調べます。
sudo parted -lBtrfs ユーティリティをインストールします。
sudo apt install btrfs-progs次に、次のコマンドを実行してスーパーブロックを回復します。
sudo btrfs rescue super-recover -v /dev/xxx「すべてのスーパーは有効なので、回復する必要はありません」というメッセージが表示された場合は、syslog を確認してください。
sudo dmesgログ ツリーが破損しているため、ログを再生できないことを示す次のメッセージが表示される場合があります。
BTRFS: error (device sdb1) in btrfs_run_delayed_refs:2227: errno=-5 IO failure
BTRFS: error (device sdb1) in btrfs_replay_log:2287: errno=-5 IO failure (Failed to recover log tree)次に、次のコマンドを実行してファイルシステムのログ ツリーをクリアする必要があります。
sudo btrfs rescue zero-log /dev/xxxこれで、Btrfs ファイル システムをマウントできるようになります。
Btrfs ファイル システムで定期的な IO エラーが発生した場合は、crontab ジョブを追加して、ファイル システムのログ ツリーを 1 日 1 回自動的にクリアできます。
sudo crontab -ecrontab ファイルの最後に次の行を追加します。
@daily umount /dev/xxx && btrfs rescue zero-log /dev/xxx && mount -aファイルを保存して閉じます。
ディスク上のファイルをバックアップする
データの損失を防ぐために、Duplicati などのツールを使用してファイルをクラウド ストレージに自動的にバックアップすることをお勧めします。 Duplicati はファイルを暗号化して覗き見を防ぎます。
- Duplicati を使用して Debian、Ubuntu、Linux Mint でファイルをバックアップする方法
外付けHDDが読み取り専用になってしまう?
ファイル システムにエラーが発生し、Linux が外付け HDD を読み取り専用モードでしかマウントできない場合があります。これを修正するには、外付け HDD をアンマウントし、e2fsck コマンドライン ユーティリティを使用してファイル システム エラーを修正する必要があります。
例えば、
sudo e2fsck /dev/sdb1y と答えてファイル システムを最適化または修正すると、外付け HDD を書き込み可能モードでマウントできるようになります。
ヒント
- 一部のマザーボードでは、オペレーティング システムをシャットダウンしても USB デバイスを充電できます。外付け HDD をお持ちの場合は、シャットダウン時に USB デバイスの電源をオフにして、外付け HDD の回転が停止することをお勧めします。これは寿命を考えると良いことです。たとえば、ASUS PRIME z270 マザーボードを持っています。 UEFI 詳細設定セクションに移動し、「電源状態 s5 での USB デバイスの充電」を無効にします。
まとめ
このチュートリアルが Linux 上の「スーパーブロックを読み取れません」エラーの解決に役立つことを願っています。いつものように、この投稿が役立つと思われた場合は、無料のニュースレターを購読して、さらに多くのヒントやコツを入手してください。気をつけてください 🙂