개요
시스템 관리자라면 한 번쯤은 이런 생각을 해보셨을 겁니다.
"운영 중인 서버랑 똑같은 환경의 테스트 서버가 있으면 딱 좋겠는데..."
새로운 기능을 테스트하거나, 설정을 변경해 보거나, 장애 상황을 시뮬레이션할 때 운영 서버와 동일한 복제 서버는 정말 소중하죠.
오늘은 기존 리눅스 서버의 하드디스크(sda
)를 통째로 새 디스크(sdb
)에 복제해서,
파티션, 파일 시스템, 데이터는 물론 부팅까지 완벽하게 동일한 '쌍둥이 서버'를 만드는 방법을 기록해보려고 합니다
Step 1. 🗺️ 파티션 복제하기
건물을 지을 때 설계도가 가장 먼저 필요하듯, 디스크 복제의 첫걸음은 원본 디스크의 '파티션 설계도'를 그대로 가져오는 것입니다.
이 때 sfdisk
를 사용하면 원본 디스크의 파티션을 고~대로 복제할 수가 있어요!
귀찮게 새로 추가한 디스크(/dev/sdb
)에 원본 디스크의 파티션을 fdisk
로 일일이 생성해 줄 필요가 없어요!
# sda의 파티션 설계도를 그대로 떠서 sdb에 그려 넣습니다.
# 경고: 이 명령어 한 줄로 /dev/sdb의 파티션 정보가 완전히 덮어 써집니다!
sfdisk -d /dev/sda | sfdisk /dev/sdb
✔️ 확인 타임: fdisk -l /dev/sdb
명령어를 입력해서 sda
와 똑같은 파티션들(sdb1
, sdb2
...)이 sdb
에 만들어졌는지 확인해보세요.
Step 2. 🧱 똑같은 파일 시스템 만들기
이제 원본과 똑같은 파일 시스템(etx4
, xfs
등)을 만들어주도록 하겠습니다.
1. 원본 디스크의 파일 시스템 엿보기'
lsblk -f
로 원본(sda
)의 파일 시스템 타입을 확인해봅시다.
UUID는 달라도 되지만, FSTYPE(파일 시스템 타입)은 잘 기억해둬야 합니다.
# lsblk -f
NAME FSTYPE UUID MOUNTPOINT
sda
├─sda1 ext4 a1b2c3d4-e5f6-7890-1234-567890abcdef /
├─sda2 xfs b2c3d4e5-f678-9012-3456-7890abcdef12 /home
└─sda3 swap c3d4e5f6-7890-1234-5678-90abcdef1234 [SWAP]
sdb
├─sdb1
├─sdb2
└─sdb3
2. 새 디스크에 파일 시스템 시공하기
위에서 확인한 타입 그대로, mkfs
(Make Filesystem) 명령어로 새 디스크를 포맷합니다.
# sdb1은 ext4 타입으로!
mkfs.ext4 /dev/sdb1
# sdb2는 xfs 타입으로!
mkfs.xfs /dev/sdb2
# sdb3는 swap 공간으로!
mkswap /dev/sdb3
Step 3. 🚪 데이터 이사를 위한 마운트 작업
이제 본격적인 데이터 이사를 위해 새 디스크의 문을 열어줘야 합니다.
임시 작업 공간(/mnt/new_root
)을 만들고,
파티션들을 촵촵 연결(마운트)해줍시다.
# 1. 임시 작업 공간(디렉터리) 만들기
mkdir -p /mnt/new_root
# 2. 새 디스크의 루트(/) 파티션(sdb1)을 작업 공간에 연결
mount /dev/sdb1 /mnt/new_root
# 3. 만약 다른 파티션(/home 등)이 있다면?
# 작업 공간 안에도 똑같이 디렉터리를 만들고 연결해줍니다.
mkdir /mnt/new_root/home
mount /dev/sdb2 /mnt/new_root/home
만약 /var
, /boot
등 분리된 파티션이 더 있다면 모두 같은 방식으로 작업 공간 안에 디렉터리를 만들고 마운트해주세요.
Step 4. rsync로 데이터 동기화
드디어 이삿날입니다!
우리의 만능 이삿짐센터 rsync
를 이용해 원본의 모든 데이터를 새 디스크로 옮길 시간입니다.
rsync
는 단순 복사를 넘어 권한, 소유권, 심볼릭 링크까지 모든 것을 그대로 옮겨주는 시스템 복제의 영웅이죠.
# rsync, 출동!
rsync -avh --progress --delete \
--exclude=/dev/* --exclude=/proc/* --exclude=/sys/* \
--exclude=/tmp/* --exclude=/run/* --exclude=/mnt/* \
--exclude=/media/* / /mnt/new_root/
✨ rsync 옵션 꿀팁
-a
: '아카이브 모드'. 권한, 소유자 등 모든 속성을 보존하는 필수 옵션!--delete
: 원본에 없는 파일은 새 디스크에서도 삭제해서 완벽한 '거울' 상태를 만들어줘요.--exclude
: 복사하면 안 되는 '가상' 디렉터리나, 자기 자신(mnt)을 제외해서 오류를 막아주는 아주 중요한 옵션입니다.
Step 5. 새 디스크 부팅 가능하게 만들기
데이터 이사는 끝났지만, 아직 새 디스크는 스스로 부팅하는 방법을 모릅니다.
약간의 마법(chroot
)을 부려서 새 디스크에 생명을 불어넣어 줍시다. 이 부분이 가장 중요해요!
1. fstab 파일 수정 (새 주소 알려주기)
디스크가 바뀌었으니 파티션의 고유 주소(UUID)도 바뀌었습니다. 부팅 시 길을 잃지 않도록 새 주소를 알려줘야 해요.
- 새 디스크의 UUID 확인:
blkid /dev/sdb*
명령으로 새 UUID 목록을 확인합니다. - fstab 파일 수정:
vi /mnt/new_root/etc/fstab
명령으로 파일을 열고, 기존 UUID를 방금 확인한 새 UUID로 모두 교체해주세요.
2. chroot
로 가상 접속!
이제 새 디스크의 운영체제 환경으로 잠시 '빙의'해서 마무리 작업을 할 시간입니다.
# chroot 환경에 필요한 시스템 정보들을 연결
mount --bind /dev /mnt/new_root/dev
mount --bind /proc /mnt/new_root/proc
mount --bind /sys /mnt/new_root/sys
# chroot로 새 디스크의 세계로!
chroot /mnt/new_root /bin/bash
이 명령을 실행하면 프롬프트 모양은 같아도, 실제로는 새 디스크 안에서 명령을 내리는 상태가 됩니다.
3. GRUB 설치 (시동키 제작)
부트로더 GRUB
을 설치해서 "이 디스크로 부팅해!" 라는 명령을 심어줍니다.
BIOS 시스템인 경우
grub-install /dev/sdb
update-grub # Debian/Ubuntu 계열
# 또는 grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS 계열
UEFI 시스템인 경우
# (chroot 전에 /boot/efi 파티션도 마운트했다고 가정)
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
update-grub # 또는 RHEL/CentOS 계열 명령어
4. 복귀
exit
를 입력해 chroot
에서 빠져나옵시다.
Step 6. 🎉 최종 점검 및 부팅!
자, 모든 여정이 끝났습니다. 이제 마지막 정리를 하고 떨리는 마음으로 결과를 확인할 시간이에요.
1. 연결 해제
umount -R /mnt/new_root
명령으로 마운트했던 모든 것을 깔끔하게 정리합니다.
2. 시스템 종료
shutdown -h now
3. 최종 확인
서버 전원을 끈 상태에서 원본 디스크(sda
)를 물리적으로 제거합니다.
또는 BIOS/UEFI 설정에서 부팅 순서를 새 디스크(sdb
)로 변경합니다.
전원 ON!