CentOS 6.7 RAID를 완전히 제거합니다. 디스크를 닫고 /dev/sda에서 부팅

CentOS 6.7 RAID를 완전히 제거합니다. 디스크를 닫고 /dev/sda에서 부팅

저는 Linux를 처음 접했습니다. 저는 독일 어딘가에 호스팅된 전용 서버를 물려받았습니다. OS는 CentOS 릴리스 6.7(최종) 64비트입니다. 서버에는 소프트웨어 RAID-1 구성의 3TB 디스크 2개가 있습니다. 제가 다루고 있는 상황은 SMART에 따르면 두 번째 디스크가 곧 실패할 예정이지만 이전 관리자가 RAID에 몇 가지 문제가 있어서 /dev/sda 구성 요소를 완전히 제거했기 때문에 이제 시스템이 단일 디스크에서 부팅된다는 것입니다. 디스크(성능 저하) 모든 파일이 포함된 RAID-1 어레이는 /dev/sdb(장애가 발생하려는 디스크)에 있습니다. 게다가 그는 /dev/sda를 완전히 지웠습니다. 문제를 해결하려면 다음 작업을 수행해야 합니다.

  1. /dev/sda를 /dev/sdb와 동일하게 다시 파티션하십시오.
  2. /dev/sdb의 모든 데이터를 /dev/sda로 복사(복제)합니다.
  3. RAID-1 구성을 완전히 제거합니다.
  4. /dev/sda에서 기본 디스크(/dev/md* 아님)로 부팅하도록 시스템을 구성합니다.
  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

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

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)가 완전히 비어 있고 파티션과 파일 시스템이 없으며 이를 어레이에 추가할 때 읽기 오류가 있기 때문에 동기화(재구축)에 실패하기 때문입니다. 두 번째 디스크(sdb)에 있습니다. 게다가 두 번째 디스크(불량 디스크)는 시스템이 부팅되는 디스크입니다. 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)을 보유하는 하나의 확장 파티션(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 어레이의 일부이기 때문입니다. 그것은 내가 확실한 정보를 찾지 못한 또 다른 부분이었습니다. 예를 들어, 시스템은 데이터를 보관하는 파티션인 /dev/sdb2, /dev/sdb3 및 /dev/sdb5를 '인식'하지만 /etc/fstab 파일에 따라 /dev/md1, /dev/md2 및 /dev/md3 그래서 나는 /dev/md*에서 복사하는 것이 더 낫다고 생각했습니다. 주의해야 할 또 다른 사항은 sda에서 데이터를 복사할 위치입니다. 즉, sda /dev/md1,2,3을 복사해야 하는 위치입니다. 음, 이 경우 파티션 크기와 파일 시스템을 기반으로 쉽게 찾을 수 있지만 다른 시스템에서는df -k이를 표시할 수 있지만 구조 모드 내부에서는 표시할 수 없습니다. 이 기능이 작동하려면 정상적으로 부팅해야 합니다.

마지막으로 위 명령을 사용하여 읽기 오류(noerror 매개변수) 없이 중지하지 않고 각 파티션을 바이트 단위로 별도로 복제하도록 dd에 지시합니다. 물론 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에서 부팅한 후 필요한 파일을 찾을 수 있는 위치를 시스템에 알리기 위한 몇 가지 단계가 더 있습니다.

가장 먼저 할 일은 편집이다./boot/grub/grub.conffile은 GRUB이 어떻게 진행되는지 알아보기 위해 읽는 파일입니다. 내 경우에는 모든 것을 교체해야했습니다."루트(hd0,0)"인스턴스"루트(hd0,1)"그리고 매"/dev/md2"인스턴스"/dev/sda3".

grub.conf특히 이전에 사용해 본 적이 없는 사람에게는 매우 혼란스러울 수 있습니다. 가장 혼란스러운 부분은 루트 매개변수입니다. grub에는 루트라는 단어에 두 가지 다른 의미가 있습니다. "root (hd0,1)"로 표시되면 필요한 Linux 커널과 부팅 방법에 대한 지침을 찾기 위해 루트 디렉터리가 어디에 있는지 grub에 알려줍니다. 많은 사람들이 완전히 부팅되었을 때 시스템의 루트 "/" 디렉터리와 혼동하지만 여기서 grub에 필요한 것은 /boot 디렉터리가 있는 곳입니다. 이 경우 /boot 디렉터리를 보유하는 별도의 파티션(/dev/sda2)이 있고 /dev/sda2가 첫 번째 디스크의 두 번째 부분이기 때문에 grub에게 정확히 알려주어야 하지만 0부터 시작합니다(첫 번째 파티션). 0, 두 번째는 1 등), "root (hd0,1)" 명령은 grub에게 첫 번째 디스크의 두 번째 파티션에서 필요한 파일을 찾을 것이라고 알려줍니다.

루트가 "/dev/"로 나타나면 파일 시스템의 루트가 어디인지 커널에 알려줍니다. 즉, 시스템이 완전히 부팅되면 "/"입니다. 따라서 이 경우에는 "/"가 있는 파티션 이름(리눅스가 인식하는 대로)을 입력합니다. 제 경우에는 /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바이트에 0이 기록됩니다.

$ 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

원래 루트 자격 증명으로 서버에 로그인하고 모든 것이 제대로 작동하는 것처럼 보이면(데이터베이스, 웹 사이트 등) sda에서 성공적으로 부팅한 것입니다.

8. 교체할 sdb를 준비합니다.

제 경우에는 지원팀에 교체를 요청하기 전에 sdb에서 모든 데이터를 지우고 싶었습니다. 게다가 새 디스크가 설치되었을 때 처음부터 새 구성을 구축하려면 시스템에서 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가 부팅 시 두 디스크를 모두 시도하는지 확인하십시오.

관련 정보