본문 바로가기
리눅스/서버운영

[리눅스] 파티션 복사하기

by 상달군 2023. 11. 29.
728x90

목표. sda에 존재 하는 파티션 정보를 똑같이 sdb로 복사 하고 싶다. 

궁극적인 목표 : 추가된 노드에 우리가 정해 놓은 파티션 그대로 카피해서 손쉽게 원본에 있는 OS나 설치되어있는 패키지를 설정하기 위함


1. 방법 dd명령어를 사용하기 

 

dd 명령어는 데이터를 블록 단위로 복사하는 명령어로서, "디스크 복사"라고도 불립니다. 주로 리눅스 및 다른 유닉스 기반 시스템에서 사용되며, 파일이나 디스크의 내용을 복사하거나 변환하는 데에 활용됩니다. 아래는 dd 명령어의 기본 구문과 주요 옵션들에 대한 간단한 설명입니다.

💢 데이터를 똑같이 a -> b복사 하기때문에 시간이 오래 걸리고 중간에 문제가 있을시 정상 작동을 하지 않을수도 있음

dd if=input_file of=output_file bs=block_size
  • if: 입력 파일 (복사할 소스 파일)
  • of: 출력 파일 (대상 파일)
  • bs: 블록 크기 (한 번에 읽거나 쓰는 데이터의 크기)

예를 들어, /dev/sda의 내용을 /dev/sdb로 1MB 블록 크기로 복사하려면 다음과 같이 사용할 수 있습니다.

sudo dd if=/dev/sda of=/dev/sdb bs=1M

주요 옵션과 설명:

  • if: 입력 파일을 지정합니다. 예를 들면, 디스크 장치 파일 (/dev/sda)이나 일반 파일의 경로를 사용할 수 있습니다.
  • of: 출력 파일을 지정합니다. 디스크 장치 파일이나 일반 파일의 경로를 사용할 수 있습니다.
  • bs: 블록 크기를 지정합니다. 블록 단위로 데이터를 처리하며, 기본값은 512바이트입니다. bs 옵션을 사용하여 블록 크기를 조절할 수 있습니다. 큰 블록 크기를 선택하면 더 빠른 전송 속도를 얻을 수 있지만, 메모리 사용량이 늘어날 수 있습니다.
  • count: 몇 번 반복할지를 지정합니다. 예를 들어, count=10은 10번의 블록을 복사하라는 의미입니다.

dd 명령어는 강력하지만 주의가 필요합니다. 잘못 사용하면 데이터를 손상시킬 수 있습니다. 신중하게 사용하고, 정확한 장치 및 경로를 확인한 후에 실행하는 것이 중요합니다.

 

진행후 결론

  • dd를 이용해서 하는 방법은 우리에게 맞지 않는 방법이다. 
  • 용량이 1~2GB면 상관없지만 TB단위로 올라갔을때는 그 시간을 기다릴수 없음
  • 많은 데이터를 옮기다 보면 중간에 잘못될 가능성도 배제할 수 없음

2. cp 명령어 사용하기 

# cp [옵션] [원본 파일] [복사 위치]

자주 사용하는 옵션

옵션 내용
-a 원본 파일의 속성, 링크 정보도 함께 복사하는 옵션입니다.( -r옵션이 내재되어 있다.)
-b 복사될 파일의 이름이 이미 존재한다면 백업 파일을 생성한다
-p 원본 파일의 소유자, 그룹, 권한, 시간정보그대로 복사하는 옵션 입니다.
-f 복사위치에 파일이 존재하는 경우 덮어쓰는 옵션 입니다.
-i 복사될 파일의 이름이 이미 존재한다면 사용자에게 덮어쓰기 여부를 묻는다
-r 원본파일의 하위 파일까지 복사하는  옵션 입니다.(재귀적으로 처리하도록 하는 옵션)
-u 원본 파일이 복사본 파일보다 최신이거나 파일 및 디렉토리가 없을 경우 복사하는 옵션 입니다.
-v 현재 작업을 표시하는 옵션 입니다.
-b 파일이 이미 있는경우 백업파일을 생성하는 옵션입니다.
-S [name] -b 옵션을 통해 백업 옵션을 사용할 경우 '~' 대신 입력된 내용을 지정하는 옵션입니다.

✨ 명령어 앞에 \(역슬러시)를 해주면 alias를 무시하고 진행 합니다. 

✨ 재귀적

  • 함수 또는 프로세스가 자기 자신을 호출하는 특성
  • 디렉토리 복사에서 "재귀적"은 하위 디렉토리와 그 내용물까지 포함하여 전체 디렉토리 구조를 복사한다는 개념
  • 재귀적으로 디렉토리를 처리하면 해당 디렉토리 내에 다른 디렉토리가 존재하더라도 그 하위 디렉토리도 모두 복사됩니다.

내가 사용할 옵션은 

-auf 

 

=> 원본 파일의 속성, 링크정보도 함께 복사 하면서 복사본 파일보다 최신이거나 파일 및 디렉토리가 없을 경우 복사

복사위치에 파일이 존재하는 경우 덮어쓰는 옵션

cp -auf [원본] [복사할곳]

2-1. 파일 시스템 포멧

mkfs 명령어를 이용하여 포멧하기

 

# mkfs -t [파일 시스템] [장치이름]

# mkfs.[파일시스템]  [장치이름]

파일시스템을 xfs로 하고 싶을땐 -f옵션을 추가 해주어야합니다. 

 

mkfs에서 지원하는 파일시스템의 종류 

  1. ext2, ext3, ext4: Linux에서 흔히 사용되는 확장 파일 시스템으로, 각각 세대별로 업그레이드되어왔습니다.
    • ext2: 파일과 디렉토리에 대한 간단한 기능을 제공합니다.
    • ext3: ext2를 확장하여 저널링(journaling) 기능을 추가한 파일 시스템입니다.
    • ext4: ext3를 확장하고 개선한 파일 시스템으로, 대용량 파일 및 디렉토리 지원, 성능 향상 등이 있습니다.
  2. XFS: SGI에서 개발한 고성능 파일 시스템으로, 대용량 파일과 디렉토리를 처리하는 데 특히 효과적입니다.
  3. Btrfs: 복사본(Copy-on-Write) 및 스냅샷과 같은 고급 기능을 제공하는 파일 시스템으로, 파일 시스템 검사와 수리 기능도 갖추고 있습니다.
  4. FAT: Windows와의 호환성을 위해 사용되는 파일 시스템으로, 주로 USB 플래시 드라이브와 같은 이동식 저장 장치에 사용됩니다.
  5. NTFS: Windows NT 계열 운영 체제에서 사용되는 파일 시스템으로, Linux에서도 읽기 전용 또는 일부 쓰기 지원을 통해 사용할 수 있습니다.
  6. exFAT: FAT 파일 시스템을 확장하여 대용량 파일 지원과 플래시 드라이브와 같은 이동식 저장 장치에 적합한 파일 시스템입니다.

mkfs -t xfs -f 명령어

[root@localhost /]# mkfs -t xfs -f /dev/sdb2
meta-data=/dev/sdb2              isize=512    agcount=4, agsize=1831040 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=7324160, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=3576, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost /]#

 

mkfs.xfs -f 명령어

[root@localhost /]# mkfs.xfs -f /dev/sdb3
meta-data=/dev/sdb3              isize=512    agcount=4, agsize=1220672 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=4882688, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost /]#

 

이렇게하면 포멧까지 완료 됩니다.

 

💢 parted에서 파티션을 나눌때 선택하는 파일시스템은 "우리가 앞으로 사용할 파일시스템을 선택, 준비만 해줄뿐"

mkfs를 이용하여 다시 한번더 포멧 작업을 해주어야 합니다. 


2-2. 마운트하기 

 

일반적으로 우리가 알고 있는 방식대로 

1. mkdir을 이용 폴더 생성

2. mount 명령어를 이용 장치와 디렉토리 마운트 하기 

3. 마운트가 잘 되었는지 확인하기 

 

1. mkdir을 이용 폴더 생성

mkdir /sdb/usr

여러 폴더 한번에 만들기 

 

2. mount 명령어를 이용 장치와 디렉토리 마운트 하기 

mount -t xfs /dev/sdb2 /sdb/usr

3. 마운트가 잘 되었는지 확인하기 

df -Th

 

4. 한번에 마운트 

mount /dev/sdb1 /sdb
mount /dev/sdb2 /sdb/usr
mount /dev/sdb3 /sdb/var
mount /dev/sdb6 /sdb/scr

3. pipe와 grep, xargs를 이용한 파일 복사 하기(cp) 

3-1. ls 명령어를 이용

 ls -d /* | grep -v -E '(proc|sys|dev|run|tmp|sdb|usr|var|scr)$' | xargs -i cp -auf {} /sdb

 => ls를 이용하여 -d옵션으로 / 이하에 있는 모든 디렉토리를 찾아내서 grep을 이용하여 제외할 폴도명을 적어줍니다. 

  • 여기서 나는 다른 컴퓨터에서 사용할것이기 때문에 가상 파일 시스템인 /proc, /sys, /dev, /run, /tmp 디렉토리들이 필요하지않다.
  • sdb는 sdb1을 마운트시킬 디렉토리라 필요하지 않음
  • usr, var,scr은 각각 /sdb하위에 디렉토리를 만들고 sdb2,sdb3,sdb6에 마운트 할것이기 때문에 필요하지 않음 

    💢가상 파일 시스템이란  
    • 일반적으로 가상 파일 시스템 디렉터리들은 시스템이 부팅될 때 생성되며, 시스템이 종료될 때 제거됩니다. 가상 파일 시스템시스템 상태동적 정보를 제공하는 데 사용되며, 부팅 중커널이 초기화될 때 해당 디렉토리들이 생성됩니다.

      시스템이 부팅 중에 해당 디렉토리들이 생성되고 초기화되는 과정은 다음과 같습니다:
      1. 커널 부팅: 시스템이 부팅되면 커널 메모리에 로드됩니다.
      2. 가상 파일 시스템 초기화: 커널은 가상 파일 시스템을 초기화하고, 필요한 디렉터리 및 파일을 생성합니다.
      3. 부팅 완료: 시스템이 부팅이 완료되면 사용자 및 시스템 프로세스가 시작되며, 해당 디렉토리들에 접근하여 필요한 정보를 읽거나 쓸 수 있게 됩니다.
      ✨ 따라서, 전원이 켜질 때마다 이러한 초기화 및 생성 프로세스가 발생하며, 전원이 꺼질 때 해당 디렉토리들과 그 안의 정보는 손실됩니다.

✔ 결론적으로, 전원이 켜질 때마다 가상 파일 시스템 디렉토리들이 새로 생성되는 것은 일반적인 동작입니다.

이 디렉토리들은 시스템이 시작될 때 동적으로 생성되는 가상 파일 및 디렉토리들을 포함하며, 시스템 종료 시에는 이 정보들이 제거됩니다.


3-2. find명령어를 이용

find / -maxdepth 1 -mindepth 1 -type d | grep -E -v '^/(proc|sys|dev|run|tmp|sdb)$'| xargs -i cp -auf {} /sdb

 

find 표현식(expression)

표현식  의미
-maxdepth [n]  검색 시 주어진 정수값 n만큼의 서브 디렉터리만 검색. (현재 내 폴더에서부터 n 깊이까지만)
-mindepth [n] max와 반대 의미입니다. 

*sda1은 두가지 방법*
/dev/sda1 마운트 / -> /dev/sdb1 마운트 /sdb : ls -d /* | grep -v -E '(proc|sys|dev|run|tmp|sdb|usr|var|scr)$' | xargs -i cp -auf {} /sdb
/dev/sda1 마운트 / -> /dev/sdb1 마운트 /sdb: find / -maxdepth 1 -mindepth 1 -type d | grep -E -v '^/(proc|sys|dev|run|tmp|sdb)$'| xargs -i cp -auf {} /sdb

/dev/sda2 마운트 /usr -> /dev/sdb2 마운트 /sdb/usr : cp -auf /usr /sdb/usr
/dev/sda3 마운트 /var -> /dev/sdb3 마운트 /sdb/var : cp -auf /var /sdb/var
/dev/sda6 마운트 /scr -> /dev/sdb6 마운트 /sdb/scr : cp -auf /scr /sdb/scr
장치명 마운트위치 -> 장치명 마운트위치 명령어
/dev/sda1  / -> /dev/sdb1  /sdb find / -maxdepth 1 -mindepth 1 -type d | grep -E -v '^/(proc|sys|dev|run|tmp|sdb)$'| xargs -i cp -auf {} /sdb
/dev/sda2 /usr -> /dev/sdb2 /sdb/usr cp -auf /usr /sdb/usr
/dev/sda3  /var -> /dev/sdb3 /sdb/var cp -auf /var /sdb/var
/dev/sda6  /scr -> /dev/sdb6 /sdb/scr cp -auf /scr /sdb/scr

✨ xargs는 내용이 많아 따로 포스팅 하겠습니다. 

https://sangdal91.tistory.com/123


4. 마운트가 잘되었는지와 용량 확인해보기 

 

 

lsblk 명령어 

  • 리눅스 시스템에서 블록 장치(block device)에 대한 정보를 보기 위해 사용되는 유틸리티입니다.
  • 블록 장치는 주로 디스크, 파티션, 루트 파일 시스템 등을 포함하는 블록 단위의 저장 장치를 의미합니다.
  • ✨ 간단하게 lsblk를 실행하면, 시스템에 연결된 블록 장치들의 계층적인 트리 구조 간단한 정보를 보여줍니다.

[root@localhost /]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 465.8G  0 disk
├─sda1   8:1    0   9.3G  0 part /
├─sda2   8:2    0    28G  0 part /usr
├─sda3   8:3    0  18.6G  0 part /var
├─sda4   8:4    0     1K  0 part
├─sda5   8:5    0  14.9G  0 part [SWAP]
└─sda6   8:6    0   395G  0 part /scr
sdb      8:16   0 465.8G  0 disk
├─sdb1   8:17   0   9.3G  0 part
├─sdb2   8:18   0    28G  0 part
├─sdb3   8:19   0  18.6G  0 part
├─sdb4   8:20   0     1K  0 part
├─sdb5   8:21   0  14.9G  0 part
└─sdb6   8:22   0   395G  0 part


mount 로 마운트 되어있는거 상세확인하기 

  • grep에 있는 ^는 starts with 즉, 해당 본문에서 찾고 하는 문자열로 시작되는 행을 찾아줍니다. 

[root@localhost /]# mount | grep ^/dev
/dev/sda1 on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sda2 on /usr type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sda6 on /scr type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
/dev/sda3 on /var type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)


 

환경 만들기 

- 새로운 디스크를 포맷하기 

 

1. 장착된 디스크 확인하기 

 - ls -l /dev/sd*

 - fdisk -l

[root@localhost ~]# fdisk -l
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x06641fba

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048  19531775  19529728   9.3G 83 Linux
/dev/sda2        19531776  78125055  58593280    28G 83 Linux
/dev/sda3        78125056 117186559  39061504  18.6G 83 Linux
/dev/sda4       117186560 976773119 859586560 409.9G  f W95 Ext'd (LBA)
/dev/sda5       117188608 148436991  31248384  14.9G 82 Linux swap / Solaris
/dev/sda6       148439040 976773119 828334080   395G 83 Linux


Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xe4c2f9f3

 

2.parted에서 mklabel을 이용하여 파티션 포맷하기 

 - msdos로 포멧하기

[root@localhost ~]# parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1075MB  1074MB  primary  xfs          boot
 2      1075MB  500GB   499GB   primary               lvm

(parted) mklable
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices, free space, all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resizepart NUMBER END                    resize partition NUMBER
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  disk_set FLAG STATE                      change the FLAG on selected device
  disk_toggle [FLAG]                       toggle the state of FLAG on selected device
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright information of GNU Parted

(parted) mklabel
New disk label type? msdos
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? y
Error: Partition(s) 2 on /dev/sdb have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use.  As a result, the old partition(s) will remain in use.
You should reboot now before making further changes.
Ignore/Cancel? i

(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start  End  Size  Type  File system  Flags

(parted) q
Information: You may need to update /etc/fstab.

 

/dev/sdb 파티션 구성하기

✔sdb 1~3 주파티션(Primary) 잡기 

(parted) mkp
Partition type?  primary/extended? p
File system type?  [ext2]? xfs
Start? 1
End? 10G
(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  10.0GB  9999MB  primary  xfs          lba

(parted) mkp
Partition type?  primary/extended? p
File system type?  [ext2]? xfs
Start? 10G
End? 40G

(parted) mkp
Partition type?  primary/extended? p
File system type?  [ext2]? xfs
Start? 40G
End? 60G

(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  10.0GB  9999MB  primary  xfs          lba
 2      10.0GB  40.0GB  30.0GB  primary  xfs          lba
 3      40.0GB  60.0GB  20.0GB  primary  xfs          lba

 

✔sdb4번 확장파티션(Extended)잡기

(parted) mkp
Partition type?  primary/extended? e
Start? 60G
End? 100%
(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  10.0GB  9999MB  primary   xfs          lba
 2      10.0GB  40.0GB  30.0GB  primary   xfs          lba
 3      40.0GB  60.0GB  20.0GB  primary   xfs          lba
 4      60.0GB  500GB   440GB   extended               lba

 

✔sdb5번에 swap잡기 (시스템타입을 linux-swap로 해줘야한다)

(parted) mkpart
Partition type?  [logical]?
File system type?  [ext2]? linux-swap
Start? 60G
End? 76G

(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system     Flags
 1      1049kB  10.0GB  9999MB  primary   xfs
 2      10.0GB  40.0GB  30.0GB  primary   xfs
 3      40.0GB  60.0GB  20.0GB  primary
 4      60.0GB  500GB   440GB   extended                  lba
 5      60.0GB  76.0GB  16.0GB  logical   linux-swap(v1)  lba

 

✔sdb6번에 남은 모든 용량 모아두기 

(parted) mkp
Partition type?  [logical]?
File system type?  [ext2]? xfs
Start? 76G
End? 100%
(parted) p
Model: ATA TOSHIBA DT01ACA0 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type      File system     Flags
 1      1049kB  10.0GB  9999MB  primary   xfs             lba
 2      10.0GB  40.0GB  30.0GB  primary   xfs             lba
 3      40.0GB  60.0GB  20.0GB  primary   xfs             lba
 4      60.0GB  500GB   440GB   extended                  lba
 5      60.0GB  76.0GB  16.0GB  logical   linux-swap(v1)  lba
 6      76.0GB  500GB   424GB   logical   xfs             lba

 

파티셔닝은 완료 !


728x90

댓글