Profile picture

[Linux] 부팅 가능한 백업 디스크 만들기

JaehyoJJAng2025년 08월 20일

개요

이번 게시글에서는 부팅 가능한 백업 디스크를 만드는 방법에 대해서 다뤄보겠습니다.


작업 환경 및 목표

실습에서 진행할 메인 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"

UEFILegacy 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
    Tag -

Loading script...