GNU/Linux >> Linux の 問題 >  >> Linux

/dev/sda のメモリ内 (カーネル) パーティション テーブルを読み取るには?

はい、/sys でこれを行うことができます ファイルシステム。

/sys カーネルお​​よびカーネル ドライバーによって動的に生成される偽のファイル システムです。
この特定のケースでは、 /sys/block/sda に移動できます ドライブ上の各パーティションのディレクトリが表示されます。これらのフォルダーには、必要な 2 つの特定のファイル start があります。 そして size . start ドライブの先頭からのオフセットと size が含まれます パーティションのサイズです。パーティションを削除して、/sys とまったく同じ開始位置とサイズで再作成するだけです。 .

たとえば、これは私のドライブがどのように見えるかです:

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

これが /sys/block/sda にあるものです :

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


実行中のシステムでパーティション テーブルを変更した後、情報が正確であることを確認するためにこれをテストしました


無保証で、この問題の解決に役立つスクリプトを作成しました .(ただし、仮想マシンでテストしました)

次のスクリプトのように、最初のパラメータに破損した HD を指定して実行します:

[email protected]:~$ ./repart.sh sda

repart.sh の内容 :

#!/bin/bash

echo "unit: sectors" 
for i in /sys/block/$1/$1?/; do
    printf '/dev/%s : start=%d, size=%d, type=XX\n' "$(basename $i)" "$(<$i/start)" "$(<$i/size)"
done

出力は sfdisk 形式です。ただし、注意 、このファイルを使用するには変更する必要があります。拡張パーティション タイプ =5 で、すべての論理スペースに加えて、拡張の開始と最初の論理パーティションの開始の間のスペースを使用して、サイズを増やします。

unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX

タイプを変更する必要があります 、XX からパーティション タイプの番号まで。 ブータブル 最初の行で分割します。

unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82

この変更を適用

cat repart.sfdisk | sfdisk -f /dev/sda

パーティションテーブルを再読み込み

partprobe 
/sbin/blockdev --rereadpt

grubを再インストール

grub-install /dev/sda

テストディスクを試しましたか?再起動した後でも、ディスクをスキャンし、失われたパーティション テーブルを回復できます。

Debian 用に事前にパッケージ化されており、おそらく Ubuntu でも利用できます。おそらく他のディストリビューションです。

gparted CD を起動している場合は、CD がプリインストールされているかどうかを確認する価値があります。


Linux
  1. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  2. / dev/randomと/dev/ urandomをいつ使用するか?

  3. /dev/shm/ と /tmp/ はいつ使用する必要がありますか?

  1. /dev/zero から /dev/null への DD ...実際に何が起こるか

  2. Linux:/dev/console 、 /dev/tty 、 /dev/tty0 の違い

  3. カーネル:/dev/kmem と /dev/mem を無効化

  1. Linux が /dev/tty と /dev/tty0 を使用する方法

  2. echo または print /dev/stdin /dev/stdout /dev/stderr

  3. dd if=/dev/zero of=/dev/sda は既存のパーティションテーブルを一掃しますか?