CentOS 6.7 RAIDを完全に削除します。ディスクをクローズして/dev/sdaから起動します

CentOS 6.7 RAIDを完全に削除します。ディスクをクローズして/dev/sdaから起動します

私は Linux の初心者です。ドイツのどこかでホストされている専用サーバーを引き継ぎました。OS は CentOS リリース 6.7 (最終) 64 ビットです。サーバーにはソフトウェア RAID-1 構成の 3TB ディスクが 2 つあります。私が対処している状況は、SMART によると 2 番目のディスクが故障しそうだということですが、前の管理者が RAID に問題を抱えていたため、/dev/sda コンポーネントを完全に削除したため、システムは単一ディスク (劣化) RAID-1 アレイから起動し、すべてのファイルは /dev/sdb (故障しそうなディスク) にあります。さらに、/dev/sda は完全に消去されました。この問題を解決するには、次のタスクを実行する必要があります。

  1. /dev/sda を /dev/sdb と同じになるように再パーティション化します。
  2. すべてのデータを /dev/sdb から /dev/sda にコピー (クローン) します。
  3. RAID-1 構成を完全に削除します。
  4. システムをネイティブ ディスク (/dev/md* ではない) として /dev/sda から起動するように構成します。
  5. すべてが正常に動作していることを確認してください。
  6. /dev/sdb を安全に消去します。
  7. 故障したディスク (/dev/sdb) を新しいディスクに交換するようにサポートに依頼してください。
  8. RAID-1 アレイを再作成して同期します。

問題は、Linux でこれらのタスクを実行する方法がわからないことです。システムにリモートでアクセスしているので、システムを起動できなくなるようなミスは許されません。ただし、レスキュー システム (基盤となるシステムにアクセスできる DHCP から起動可能な小さな Linux) にはアクセスできます。

以下に、いくつかの(おそらく役に立つ)コマンド出力と設定ファイルを示します。

fdisk -l

Disk /dev/sdb: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000e76a6

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1567    12582912+  83  Linux
/dev/sdb2            1567        1633      524288+  fd  Linux raid autodetect
/dev/sdb3            1633      135307  1073741824+  fd  Linux raid autodetect
/dev/sdb4          135307      364802  1843413464    f  W95 Ext'd (LBA)
/dev/sdb5          135308      364802  1843412440   fd  Linux raid autodetect

Disk /dev/sda: 3000.6 GB, 3000592982016 bytes
255 heads, 63 sectors/track, 364801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00074207

Device Boot      Start         End      Blocks   Id  System

Disk /dev/md3: 1887.7 GB, 1887654199296 bytes
2 heads, 4 sectors/track, 460853076 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md1: 536 MB, 536858624 bytes
2 heads, 4 sectors/track, 131069 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Disk /dev/md2: 1099.5 GB, 1099511488512 bytes
2 heads, 4 sectors/track, 268435422 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

ファイル -s /dev/sdb

/dev/sdb: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3,     stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, starthead 32, startsector 2048, 25165825 sectors; partition 2: ID=0xfd, starthead 254, startsector 25169920, 1048577 sectors; partition 3: ID=0xfd, starthead 254, startsector 26220544, 2147483649 sectors; partition 4: ID=0xf, starthead 254, startsector 2173706240, 3686826928 sectors, code offset 0x48

ファイル -s /dev/sda

/dev/sda: x86 boot sector, code offset 0xb8

/etc/fstab をスキャンする

proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/md0 none swap sw 0 0
/dev/md1 /boot ext3 defaults 0 0
/dev/md2 / ext4 defaults 0 0
/dev/md3 /home ext4 defaults 0 0

/boot/grub/grub.conf を cat します

timeout 5
default 0

title CentOS (2.6.32-573.7.1.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-573.7.1.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-573.7.1.el6.x86_64.img

title CentOS (2.6.32-504.1.3.el6.x86_64)
root (hd0,1)
kernel /vmlinuz-2.6.32-504.1.3.el6.x86_64 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-504.1.3.el6.x86_64.img

/proc/mdstat を cat する

Personalities : [raid1]
md2 : active raid1 sdb3[1]
      1073741688 blocks super 1.0 [2/1] [_U]

md1 : active raid1 sdb2[1]
      524276 blocks super 1.0 [2/1] [_U]

md3 : active raid1 sdb5[1]
      1843412304 blocks super 1.0 [2/1] [_U]

unused devices: <none>

これに関してご助力いただければ幸いです。

ありがとう。

答え1

まず、これは RAID-1 アレイ内の故障したディスクを交換することではなく、RAID アレイを完全に削除し、故障しそうなディスクをクローンし、RAID 構成なしで正常なディスクからシステムを起動する方法であることを理解する必要があります。このアプローチの理由は、正常なディスクである最初のディスク (sda) が完全に空で、パーティションやファイル システムがなく、それをアレイに追加すると、2 番目のディスク (sdb) に読み取りエラーがあるために同期 (再構築) に失敗するためです。さらに、2 番目のディスク (不良ディスク) は、システムが起動する場所です。Linux とそのコマンドを知っていれば、このタスクを完了するために必要な手順はかなり簡単ですが、この手順にはパーティション分割、クローン作成、および MBR インストール タスクが含まれており、十分に注意しないとデータが破壊されます。最後に、次の手順は質問で説明されているディスクの構成に固有のものですが、必要なデバイスとパーティション名を慎重に置き換えれば、他のシステムでも機能するはずです。

手順は次のとおりです。

1. システムをレスキューモードで起動します。

システムのブート ディスクからデータをクローンするので、ロックされたファイルなどについて心配する必要はありません。これを行う最善の方法は、レスキュー モードでブートすることです。幸い、私のサーバー ホスティング会社は、非常に簡単な方法でこれをサポートしています。直接アクセスできるサーバー (リモートなし) では、ライブ CD からブートするか、ブート メニューから [レスキュー モード] を選択するようなものになります。

2. データのクローン作成用の最初のディスク (/dev/sda) を準備します。

sda を準備するには、sdb からパーティション情報を取得する必要があります。実際には、この手順は必須ではありません。これは、RAID 構成なしで、または必要に応じて sdb と関係なくシステムを起動することが目的であるためです。したがって、現在のパーティション スキームが希望どおりでない場合は、これを変更する機会となります。念頭に置く必要があるのは、新しいパーティションに sdb のデータを保持するのに十分なスペースが必要であることだけです。ただし、Linux でのパーティション分割には、アラインメントなどに関する深い知識が必要であり、sdb はすでに適切にパーティション分割されているため、sda で同じことを行う方が簡単であることがわかりました。そのためには、まず sdb のパーティションを表示する必要があります。そのためには、parted を使用しました。

注記:Linux で何かを行う方法を調べるときに最も難しい作業は、(多数の) コマンドのうちどれを使用するのが最適かを見つけることです。たとえば、パーティション コマンドとユーティリティは多数あり、どれを使用するかを決定するには、情報を読み、比較するのにかなりの時間がかかります。ここで parted を使用することにしました。これは、パーティションとともにファイル システムを表示し、大容量ディスクのサポートが優れているためです (よくわかりません)。

# parted /dev/sdb
(parted) unit s
(parted) print

出力:

Model: ATA ST3000DM001-1CH1 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number  Start        End          Size         Type      File system  Flags
 1      2048s        25167872s    25165825s    primary
 2      25169920s    26218496s    1048577s     primary   ext3         raid
 3      26220544s    2173704192s  2147483649s  primary   ext4         raid
 4      2173706240s  5860533167s  3686826928s  extended               lba
 5      2173708288s  5860533167s  3686824880s  logical   ext4         raid

(parted) quit

ここでわかるように、sdb には msdos タイプのパーティション テーブルがあります。つまり、ディスク上に最大 4 つのプライマリ パーティションを作成できます。この場合、3 つのプライマリ パーティション (1、2、3) と、論理パーティション (5) を保持する 1 つの拡張パーティション (4) があります。

次のステップは、sda に同じパーティションを作成することです。

# parted /dev/sda
(parted) unit s
(parted) mkpart primary 2048 25167872
(parted) mkpart primary 25169920 26218496
(parted) mkpart primary 26220544 2173704192
(parted) mkpart extended 2173706240 5860533167
(parted) mkpart logical 2173708288 5860533167
(parted) quit

ご覧のとおり、sdb から同じ開始セクターと終了セクターを使用しました。もちろんディスクは同じですが、そうでない場合はセクターをそれに応じて配置する必要があります。

ここで、sda のパーティションの変更についてシステムに通知する必要があります。

# partprobe /dev/sda

最後に、sda にファイル システムを作成する必要があります。sdb からパーティションをクローンするので、クローン作成手順によってファイル システム情報もコピーされるため、この手順はまったく必要ありませんが、問題はありません。

# mkfs -t ext3 /dev/sda2
# mkfs -t ext4 /dev/sda3
# mkfs -t ext4 /dev/sda5

パーティション 4 (sda4) にはファイル システムを作成していないことに注意してください。これは、論理パーティション (sda5) を保持する拡張パーティションであるため、論理パーティションにのみファイル システムを作成する必要があります。

これで、sda がパーティション分割され、データを保持する準備が整いました。

3. sdb からデータをコピーします。

このステップでは、主にデータをコピーする方法が多数あるため、最も多くの調査が必要でした。おそらく cp -a で十分でしょうが、システムを正しく起動するために隠しファイルやリンクなどを処理する方法について確かな情報を見つけることができませんでした。そこで、ファイル コピー コマンドではなく、バイト単位のコピー ユーティリティ (クローン作成) を使用することにしました。使用したユーティリティは dd です。

# dd if=/dev/md1 of=/dev/sda2 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md2 of=/dev/sda3 bs=512 conv=noerror,sync,notrunc
# dd if=/dev/md3 of=/dev/sda5 bs=512 conv=noerror,sync,notrunc

注: まず、/dev/sdb* ではなく /dev/md* からコピーしていることに注意してください。これは、sdb ディスクが実際には RAID-1 アレイの一部であるためです。これは、確かな情報を見つけられなかったもう 1 つの部分です。たとえば、システムは、データを保持するパーティションである /dev/sdb2、/dev/sdb3、および /dev/sdb5 を「認識」しますが、/etc/fstab ファイルによると、/dev/md1、/dev/md2、および /dev/md3 をマウントするため、/dev/md* からコピーする方がよいと想定しました。注意する必要があるもう 1 つの点は、sda のどこにデータをコピーするかです。つまり、sda のどこに /dev/md1、2、3 をコピーする必要があるかです。この場合、パーティション サイズとファイル システムに基づいて簡単に見つけることができますが、別のシステムでは、df -kこれを表示できますが、レスキュー モード内からは表示できません。これを機能させるには、通常どおり起動する必要があります。

最後に、上記のコマンドを使用して、dd に各パーティションをバイトごとに個別にクローンするように指示します。読み取りエラーが発生しても停止しません (noerror パラメータ)。もちろん、sdb に読み取りデータ エラーがある場合 (この場合はエラーがあります)、これによりシステムが起動できなくなる可能性があります。ただし、dd を使用する前に、影響を受けるファイルを見つけ、クローン作成を続行しても安全かどうかを確認するいくつかのテクニックを使用しました。このタスクはこの回答の範囲を超えていますが、開始するには次の場所が適しています。ここ

もう一つの重要な注意点は、ブロック サイズ パラメータ (bs) です。dd のドキュメントによると、bs を 512 バイトに設定する必要があります。読み取りエラーが発生した場合 (実際に発生します)、ターゲット ディスクの 512 バイトのみが「破壊」され、より大きな領域は破壊されませんが、プロセスは遅くなります。これについても確かな情報を見つけることができませんでしたが、おそらくブロック サイズを 4096 バイトに設定しても同じ結果になると思われます。

最後に、dd は操作中に出力を生成せず、パーティションのサイズが原因で完了するまでにかなりの時間がかかります。場所を確認するには、新しいコンソール セッション (私の場合はリモートで実行しているため、新しい ssh リモート セッション) を開いて、次のコマンドを発行します。

# kill -USR1 $(pidof dd)

これにより、dd は最初のコンソール セッションで現在の進行状況を強制的に出力します。

4. sda を起動可能にします。

これは非常に簡単に実行できます。まず、必要なマウント ポイントを sda にマウントする必要があります。

# mount -t ext4 /dev/sda3 /mnt
# mount -t proc proc /mnt/proc
# mount -t sysfs sys /mnt/sys
# mount -o bind /dev /mnt/dev
# mount -t ext3 /dev/sda2 /mnt/boot

注意: システムに /boot 用の別のパーティションがない場合は、最後のコマンドは必要ありません。

次に、/dev/sda ディスクのルートになる必要があります。現在、レスキュー システムのルートになっています。

# chroot /mnt /bin/bash

次に、etc/mtab ファイルを更新する必要があります。なぜこれを行う必要があるのか​​はよくわかりませんが、別のレスキュー チュートリアルで説明なしで見つけました。

# grep -v rootfs /proc/mounts > /etc/mtab

次に、sda に GRUB をインストールする必要があります。

# grub-install --recheck /dev/sda

出力:

Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.

現在、sda は起動する準備ができていますが、sda から起動した後に必要なファイルがどこにあるかをシステムに知らせるために、さらにいくつかの手順が必要です。

まず編集する設定ファイルこれはGRUBが処理方法を調べるために読み込むファイルです。私の場合は、「ルート (hd0,0)」インスタンス「ルート(hd0,1)」そしてすべての"/dev/md2"インスタンス「/dev/sda3」です。

設定ファイル特に、これまで使用したことがない人にとっては非常に混乱を招く可能性があります。最も混乱を招く部分はルート パラメータです。grub では、ルートという単語には 2 つの異なる意味があります。"root (hd0,1)" と表示される場合、必要な Linux カーネルとそれらを起動する方法の指示を見つけるために、grub にルート ディレクトリの場所を伝えます。多くの人がこれを、完全に起動されたシステムのルート "/" ディレクトリと混同していますが、ここで grub に必要なのは /boot ディレクトリの場所なのです。この場合、/boot ディレクトリを保持する別のパーティション (/dev/sda2) があり、/dev/sda2 は最初のディスクの 2 番目のパーティションであるため、grub に正確にそれを伝える必要がありますが、ゼロから開始します (最初のパーティションは 0、2 番目は 1 など)。したがって、コマンド "root (hd0,1)" は、必要なファイルが最初のディスクの 2 番目のパーティションにあることを grub に伝えます。

ルートが「/dev/」と表示される場合、ファイルシステムのルートがどこにあるかをカーネルに伝えます。システムが完全に起動すると、ルートは「/」になります。したがって、この場合は、「/」があるパーティション名 (Linux が認識するとおり) を入力します。私の場合は /dev/sda3 です。

最後に編集する必要があります/etc/fstab起動時にシステムに何をどこにマウントするかを指示するためのファイルです。

私の場合、すべての「/dev/md*」エントリを、対応する「/dev/sda*」パーティションに置き換える必要がありました。

/dev/md1 --> /dev/sda2 /dev/md2 --> /dev/sda3 /dev/md3 --> /dev/sda5

5. sdb からのブートを確認して無効にします。

私のように強迫観念に駆られた人は、逃げた方がいいかもしれません

# file -s /dev/sda

grub が sda にインストールされているかどうかを確認します。次のような出力が表示された場合:

/dev/sda: sticky x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94;

次に、grub (GRand Unified Bootloader) が sda にインストールされます。

必須ではありませんが、sdd から grub を削除したい場合があります。上記の構成に誤りがあると、システムが sdb から起動してしまい、混乱を招く可能性があるため、これを行いました。sdb から grub を削除するには、dd を使用しました。

# dd if=/dev/zero of=/dev/sdb bs=446 count=1

これにより、msdos パーティション テーブルを持つディスクで grub が存在するディスクの最初の 446 バイトにゼロが書き込まれます。

$ file -s /dev/sdb

これにより、grub が削除されたことが確認されます。

6. chroot を終了し、すべてをアンマウントします。

# exit
# umount /mnt/boot
# umount /mnt/dev
# umount /mnt/sys
# umount /mnt/proc
# umount /mnt

上記のコマンドの実行中にエラーが表示された場合は、chroot セッションで何かが完了していないか、問題が発生しているため、最初からやり直す必要がある可能性があります。

7. 再起動します。

さあ、指を交差させて再起動しましょう

# reboot

元のルート資格情報を使用してサーバーにログインでき、すべてが正常に動作しているように見える場合 (データベース、Web サイトなど)、sda からの起動は成功です。

8. 交換用の sdb を準備します。

私の場合、サポートに交換を依頼する前に、sdb からすべてのデータを消去したいと考えていました。さらに、新しいディスクを設置したときに、最初から新しい RAID 構成を構築できるように、システムから RAID 構成を完全に削除する必要がありました。まず、parted を実行してパーティションを削除しました。

# parted /dev/sdb
# (parted) rm 5
# (parted) rm 4
# (parted) rm 2
# (parted) rm 2
# (parted) rm 1
# (parted) quit

その後、すべてのRAID構成も削除されていることに気づいたので、RAID定義はパーティション内にあると想定し、これ以上のアクションは実行しませんでした。次に、消去されたsdbを保護しました。これを行うには多くの方法があります。私は/dev/urandom方法からここ

答え2

これを試みないで、代わりに最初からやり直すか、何かするのが最善かもしれません。Linux を初めて使ったときは、これを試みなかったでしょう。

そうは言っても、必要なのはパーティションを作成して /dev/sda を RAID アレイに追加し、再構築したら /dev/sdb を交換することだけです。grub が両方のディスクにあり、起動時に BIOS が両方のディスクを試すことを確認してください。

関連情報