개요
이번 게시글에서는 부팅 가능한 백업 디스크를 만드는 방법에 대해서 다뤄보겠습니다.
작업 환경 및 목표
실습에서 진행할 메인 OS
- Rocky Linux 8.5
/dev/sda
(메인 디스크) - ext4/dev/sdb
(백업 디스크) - ext4 (초기화 예정)
목표
- 백업 디스크를 첫 번째 베이에 꽂으면 바로 부팅되도록 만들기
- 원본과 100% 동일한 환경 구성
- GRUB 부트로더 설정
1. 시스템 분석하기
복제를 시작하기 전에, 현재 시스템 구조를 정확히 파악해야 합니다.
1-1. 디스크 구조 확인
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 b872670d-c246-42b6-b6ca-726cbb5f84f1 /boot
├─sda2 ext4 1db98286-8f85-4eb5-8401-3687d32e374b /
├─sda3 ext4 09bce61c-ebf9-46a4-941a-914765dfd295 /home
├─sda4
├─sda5 ext4 e2908828-a2c7-466c-8c20-3470f4e4f0aa /var
├─sda6 ext4 0204874b-5ce9-41cf-8ce1-1514e8e842cf /usr
└─sda7 swap b8d18a55-97f4-4eaa-be4a-27dc123f8c9e [SWAP]
sdb
1-2. boot mode 확인
# UEFI 인지?, Legacy BIOS 인지?
[ -d /sys/firmware/efi ] && echo "UEFI" || echo "Legacy BIOS"
UEFI
와 Legacy BIOS
는 부트로더 설치 방법이 다르기 때문에 사전에 부트 모드가 어떤 모드인지 확인해야 함.
2. 디스크 준비하기
2-1. 백업 디스크 초기화
# /dev/sdb의 모든 데이터를 삭제해줍시다.
# 1. 모든 파티션 언마운트
$ umount /dev/sdb* 2>/dev/null
# 2. 파티션 테이블 완전 삭제
$ dd if=/dev/zero of=/dev/sdb bs=512 count=1
$ wipefs -a /dev/sdb
# 3. 확인
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk # 깨끗한 상태
2-2. 파티션 테이블 복제
이제 원본 디스크의 파티션 구조를 그대로 복사해줍시다.
2-2-1. GPT 디스크의 경우
# 파티션 테이블 복제
$ sgdisk -R /dev/sdb /dev/sda
# GUID 재생성 (원본 디스크와 동일한 GUID를 사용하면 충돌이 발생함!)
$ sgdisk -G /dev/sdb
# 커널에 알리기
$ partprobe /dev/sdb
2-2-2. MBR 디스크의 경우
# 파티션 테이블 복제
$ sfdisk -R /dev/sda | sfdisk /dev/sdb
# 커널에 알리기
$ partprobe /dev/sdb
2-2-3. 결과 확인
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 50G 0 disk
├─sdb1 8:17 0 572M 0 part # /boot
├─sdb2 8:18 0 20G 0 part # /
├─sdb3 8:19 0 12.4G 0 part # /home
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 10G 0 part # /var
├─sdb6 8:22 0 5G 0 part # /usr
└─sdb7 8:23 0 2G 0 part # swap
원본 디스크의 파티션 구조와 동일한지 한 번 더 점검해주세요.
3. 데이터 복제하기
3-1. 파일시스템 생성
# EXT4로 포맷하기
mkfs.ext4 -O dir_index /dev/sdb1
mkfs.ext4 -O dir_index /dev/sdb2
mkfs.ext4 -O dir_index /dev/sdb3
mkfs.ext4 -O dir_index /dev/sdb5
mkfs.ext4 -O dir_index /dev/sdb6
# swap 영역 생성
mkswap /dev/sdb7
# 결과 확인
blkid /dev/sdb*
/dev/sdb: PTUUID="f5c9092a" PTTYPE="dos"
/dev/sdb1: UUID="33703e34-1a7c-40e2-b79c-567f83c84870" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-01"
/dev/sdb2: UUID="822ea40f-baa9-436c-967d-286e75732ad5" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-02"
/dev/sdb3: UUID="7bf55974-679a-4b7b-9499-4cb41d7509ed" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-03"
/dev/sdb4: PTTYPE="dos" PARTUUID="f5c9092a-04"
/dev/sdb5: UUID="3d544675-1383-4fac-8009-9edcbf9ab6cc" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-05"
/dev/sdb6: UUID="675003e7-b705-4152-916d-44855d10180d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5c9092a-06"
/dev/sdb7: UUID="d068b557-e4b5-4f6c-987e-b1fb9ee7b60b" TYPE="swap" PARTUUID="f5c9092a-07"
3-2. 마운트 포인트 준비
# 임시 마운트 디렉토리 생성
mkdir -p /mnt/backup
# 마운트
mount /dev/sdb2 /mnt/backup # root filesystem 먼저
# 마운트된 상태에서 /mnt/backup 하위에 파티션 별 마운트 포인트 생성
mkdir /mnt/backup/{boot,home,var,usr}
# 하위 디렉토리 마운트
mount /dev/sdb1 /mnt/backup/boot
mount /dev/sdb3 /mnt/backup/home
mount /dev/sdb5 /mnt/backup/var
mount /dev/sdb6 /mnt/backup/usr
3-3. 데이터 복사 (rsync)
# rsync로 전체 시스템 복사
$ rsync -av --exclude /proc --exclude /sys --exclude /dev --exclude /run / /mnt/backup
4. 부트로더 설정 (핵심)
가장 중요한 부분입니다!!
부트로더 설정 시 복제된 원본 디스크의 /etc/fstab
파일이나 부트로더 설정 파일을 그대로 사용하면 다음과 같은 문제가 발생할 수 있어요.
현재 상황: 디스크 교체 후:
/dev/sdb (hd1) ───→ /dev/sda (hd0)
↓ ↓
GRUB이 hd1 참조 부팅 실패!
이를 막으려면 새로운 디스크의 UUID 값을 /etc/fstab
에 매핑해주거나,
부트로더의 값을 변경하여 다시 생성해줘야 하는데요!
그 방법에 대해서 알아보도록 하죠.
4-1. UUID 기반 설정
UUID를 사용하면 디스크 위치와 무관하게 파티션을 찾을 수 있습니다.
1. UUID 매핑 테이블 만들기
# 각 파티션의 UUID 확인 및 저장
$ OLD_BOOT_UUID=$(blkid -s UUID -o value /dev/sda1)
$ NEW_BOOT_UUID=$(blkid -s UUID -o value /dev/sdb1)
$ OLD_ROOT_UUID=$(blkid -s UUID -o value /dev/sda2)
$ NEW_ROOT_UUID=$(blkid -s UUID -o value /dev/sdb2)
echo "🔄 UUID 매핑:"
echo "Boot: $OLD_BOOT_UUID → $NEW_BOOT_UUID"
echo "Root: $OLD_ROOT_UUID → $NEW_ROOT_UUID"
2. fstab 수정하기
# fstab 백업
$ cp /mnt/backup/etc/fstab /mnt/backup/etc/fstab.backup
# UUID 교체
$ sed -i "s/$OLD_BOOT_UUID/$NEW_BOOT_UUID/g" /mnt/backup/etc/fstab
$ sed -i "s/$OLD_ROOT_UUID/$NEW_ROOT_UUID/g" /mnt/backup/etc/fstab
# 확인
$ cat /mnt/backup/etc/fstab
3. chroot 환경에서 GRUB 설치하기
# chroot 환경 준비
$ mount --bind /dev /mnt/backup/dev
$ mount --bind /proc /mnt/backup/proc
$ mount --bind /sys /mnt/backup/sys
# chroot 진입
$ chroot /mnt/backup
# GRUB 설정 확인
$ vi /etc/default/grub
# 다음 라인 추가/확인:
GRUB_DISABLE_LINUX_UUID=false
# device.map 수정 (중요!)
$ echo "(hd0) /dev/sdb" > /boot/grub2/device.map
# GRUB 설치
$ grub2-install --recheck /dev/sdb
# GRUB 설정 재생성
$ grub2-mkconfig -o /boot/grub2/grub.cfg
# SELinux 레이블 재설정
$ touch /.autorelabel
# chroot 종료
$ exit
4-2. 직접 수정하기
1. fstab 수정하기
vim /etc/fstab
# 파티션 구조에 맞게 마운트되도록 수정
/dev/sda2 / ext4 defaults 1 1
/dev/sda1 /boot ext4 defaults 1 2
/dev/sda3 swap swap defaults 0 0
/dev/sda5 /var ext4 defaults 0 0
/dev/sda6 /usr ext4 defaults 0 0
/dev/sda7 /home ext4 defaults 0 0
2. 작업 과정
# chroot 환경 준비
$ mount --bind /dev /mnt/backup/dev
$ mount --bind /proc /mnt/backup/proc
$ mount --bind /sys /mnt/backup/sys
# chroot 진입
$ chroot /mnt/backup
# grub 재생성
grub2-mkconfig -o /boot/grub2/grub.cfg
# grub 설정 변경
sed -i "s/sdb/sda/g" /disk/boot/grub2/grub.cfg
sed -i "s/hd1/hd0/g" /disk/boot/grub2/grub.cfg
# GRUB 바이너리 설치
grub2-install /dev/sdb