Profile picture

[Linux] 서버 디스크 복제 완벽하게 해내는 방법

JaehyoJJAng2025년 01월 10일

개요

시스템 관리자라면 한 번쯤은 이런 생각을 해보셨을 겁니다.


"운영 중인 서버랑 똑같은 환경의 테스트 서버가 있으면 딱 좋겠는데..."


새로운 기능을 테스트하거나, 설정을 변경해 보거나, 장애 상황을 시뮬레이션할 때 운영 서버와 동일한 복제 서버는 정말 소중하죠.


오늘은 기존 리눅스 서버의 하드디스크(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!

    Tag -

Loading script...