1. 명령어 설명

리눅스 dd 명령어는 블록 단위로 파일복사, 파일변환을 수행하는 명령어이다.

리눅스 시스템에서는 디스크도 파일로 간주되므로, 디스크 및 디스크의 파티션을 복제하는데 사용 가능하다.

아래와 같은 용도로 자주 사용된다.

  • 파일 및 장치 복사
  • 디스크 및 파티션 백업/복원
  • 사이즈를 지정한 swap 파일 생성
  • 사이즈를 지정한 더미파일 생성
  • 디스크 I/O 성능 측정
Usage: dd [OPERAND]...
  or:  dd OPTION
Copy a file, converting and formatting according to the operands.

  bs=BYTES        read and write up to BYTES bytes at a time (default: 512);
                  overrides ibs and obs
  cbs=BYTES       convert BYTES bytes at a time
  conv=CONVS      convert the file as per the comma separated symbol list
  count=N         copy only N input blocks
  ibs=BYTES       read up to BYTES bytes at a time (default: 512)
  if=FILE         read from FILE instead of stdin
  iflag=FLAGS     read as per the comma separated symbol list
  obs=BYTES       write BYTES bytes at a time (default: 512)
  of=FILE         write to FILE instead of stdout
  oflag=FLAGS     write as per the comma separated symbol list
  seek=N          skip N obs-sized blocks at start of output
  skip=N          skip N ibs-sized blocks at start of input
  status=LEVEL    The LEVEL of information to print to stderr;
                  'none' suppresses everything but error messages,
                  'noxfer' suppresses the final transfer statistics,
                  'progress' shows periodic transfer statistics

N and BYTES may be followed by the following multiplicative suffixes:
c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M,
GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y.

 

2. 자주 사용하는 옵션

  • bs: 한번에 읽고 쓸 수 있는 최대 바이트 크기. 즉, block size
  • count: 복사할 block 수. 즉, bs * count 크기의 사이즈만큼 복사
  • if: 입력 파일 경로
  • of: 출력 파일 경로

3. 옵션에 사용되는 suffix 단위

  • c: 1byte (Character)
  • w: 2bytes (Word)
  • b: 512bytes (Block)
  • K: 1024bytes (Kibibyte, KiB)

4. 사용예시

[더미파일 생성]

# dd if=/dev/zero of=/dummyfile bs=1024 count=1024

=> 파일을 /dummyfile 경로에 생성하되, 0 문자(정확히는, ASCII NUL(0x00) 문자)를 복사해 채우며, 1024 byte 블록 단위로 1024번에 걸쳐 복사한다.

 

[디스크/파티션 복제]

# dd if=/dev/sdb1 of=/dev/sdc1 bs=1024

=> /dev/sdb1 파티션을 /dev/sdc1 파티션으로 복제하되, 1024byte 블록 단위로 복제한다.

 

[디스크/파티션 초기화]

# dd if=/dev/zero of=/dev/sdb1

=> /dev/sdb1 파티션을 초기화한다.

 

[파일을 복사하며 내용 중 소문자를 모두 대문자로 변환]

# dd if=/log1 of=/log1_upper bs=1024 conv=ucase

=> /log1 의 내용을 /log1_upper 로 1024byte 블록 단위로 복사하며, 모든 소문자를 대문자로 변환한다.

 

*/dev/zero 는 0을 무한히 반환하는 특수 파일

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. swap 파일 생성

명령어: dd if=/dev/zero of=/swapfile1 bs=1024 count=1048576

 

옵션 설명

  • bs: block size 로, byte 단위로 지정(1024byte == 1Kib)
  • count: block 갯수 지정
  • if: 빈 값으로 채우기 위해 /dev/zero 고정
  • of: 스왑파일경로 지정

 

2. swap 파일 권한 변경

명령어: chmod 600 {스왑파일명}

e.g) chmod 600 /swapfile1

 

3. swap 파일에 swap 파일 시스템 생성

swap 포멧으로 설정하는 행위

명령어: mkswap {스왑파일명}

e.g) mkswap /swapfile1

 

4. 부팅시 스왑파일 자동 활성화 설정 및 swap 활성화

/etc/fstab 에 아래 내용을 추가

/swapfile1 swap swap defaults 0 0

 

swapon -a

 

5. 확인

명령어: swapon -s

Type 이 file 인 스왑 생성 확인

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 추가

디스크 추가 후 lsblk 로 추가된 디스크 확인

 

2. 스왑용 파티션 생성

fdisk 또는 gdisk 명령어로 생성

명령어: gdisk {블록디바이스명}

e.g) gdisk /dev/sdc

 

안내된 커맨드에 따라 파티션 생성

스왑 파티션의 GUID 를 지정하는데, 이때 L 을 입력하여 스왑 파티션 코드를 확인하여 입력해야함

 

3. swap 파일 시스템 설정

스왑용 파티션을 스왑 타입으로 포멧하는 행위이다.

명령어: mkswap {파티션명}

e.g) mkswap /dev/sdc1

 

이제 blkid {파티션명} 으로 파티션 확인시 TYPE="swap" 으로 확인된다.

 

4. swap 활성화

명령어: swapon {파티션명}

e.g) swapon /dev/sdc1

 

5. swap 활성화 확인

swapon -s

 

6. 부팅시 스왑 파티션 자동 마운트 설정

/etc/fstab 파일에 아래 내용 등록

{스왑파티션명} swap swap defaults 0 0

 

7. /etc/fstab 에 등록된 내용 중 마운트되지 않은 스왑 파티션을 마운트

명령어: swapon -a

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

리눅스에서는 프로세스를 실행할 메모리 공간이 부족한 경우, 기존 프로세스 중 일부를 swap 공간(디스크 파티션 or 파일)으로 이동시켜 메모리 공간을 확보한다.

swap 공간으로 이동시키는 프로세스를 선택하는 기준은 아래와 같다.

  • 가장 오랫동안 사용되지 않은 프로세스(LRU)
  • priority 점수가 가장 높은(=우선순위가 낮음) 프로세스(0~39)

swap 공간으로 이동한 프로세스는 다시 호출될 때 메모리에 여유공간이 있다면 메모리로 다시 불러와진다.

 

1. swap 사용량 확인

  • free
  • top
  • swapon -s

e.g)

# free
              total        used        free      shared  buff/cache   available
Mem:        4017408      528376     2969828       13620      519204     3332876
Swap:       1048572           0     1048572

# top
top - 13:05:38 up 11:19,  0 users,  load average: 1.93, 1.98, 2.05
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   3923.2 total,   2896.2 free,    520.0 used,    507.1 buff/cache
MiB Swap:   1024.0 total,   1024.0 free,      0.0 used.   3250.7 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    1 root      20   0    3620   2432   2304 S   0.0   0.1   0:00.09 bash
    8 root      20   0    3884   2944   2560 S   0.0   0.1   0:00.21 bash
   92 root      20   0    1948   1024   1024 S   0.0   0.0   0:00.00 sleep
  102 root      20   0    5732   2560   2176 R   0.0   0.1   0:00.00 top
  
# swapon -s
Filename				Type		Size	Used	Priority
/var/lib/swap                          	file    	1048572	0	-2

 

2. swap 비활성화

swapoff {스왑파일경로}

  • 스왑파일경로: swapon -s 로 조회된 Filename 경로

 

3. swap 활성화

swapon {스왑파일경로}

  • 스왑파일경로: swapon -s 로 조회된 Filename 경로

 

4. 부팅시 자동 활성화

/etc/fstab 에 아래 내용 추가

{스왑장치명} none swap sw 0 0
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 용량 확장

 

2. 파티션 확장

growpart 패키지 사용

마지막 파티션을 확장하는 유틸리티. 마지막 파티션만 확장이 가능하며, 무조건 디스크의 마지막 섹터까지 모두 확장된다.

 

설치방법

  • centos: yum install -y cloud-utils-growpart
  • ubuntu: apt install -y cloud-guest-utils

 

사용방법

growpart {디스크명} {파티션번호}

e.g) growpart /dev/sdb 1

 

3. 파티션 내 파일시스템 확장

디스크 용량과 파티션 용량을 확장했더라도, 해당 파티션의 파일시스템을 포멧(타입 지정)해주지 않으면 파일시스템상에서 인식하지 못함.(df 명령어로 확인)

따라서, 파일시스템 확장을 수행해주어야 한다.

확장하려는 파일시스템 타입이 ext4 인지 xfs 인지에 따라 명령어가 다름

  • ext4: resize2fs {파티션명} {사이즈}
  • xfs: xfs_growfs {파티션명}

ext4 포멧인 경우는 파일시스템 확장/축소 모두 사이즈를 지정해서 가능하며, xfs 인 경우는 확장만 가능함

resize2fs 사이즈 파라미터 생략시 현재 파티션 사이즈를 사용

축소는 마운트 된 상태에서는 불가능하며, 확장은 마운트 된 상태에서도 가능하다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

디스크를 추가했다고 바로 사용할 수 있는게 아니라, 파일 시스템에 연결을 해 주어야 함.

즉, 특정 디렉토리와 추가한 디스크를 연결해준다고 이해하면 됨.

 

파티셔닝을 통해 1개의 물리적인 디스크를 2개 이상의 논리적인 블록 디바이스로 인식할 수 있음.(/dev/sdb1, /dev/sdb2, ...)

1개의 디스크 전체를 파티셔닝하지 않고 사용할 수도 있지만, 일반적으로 관리/확장성을 고려해 파티셔닝을 진행.

 

1. 추가 장착한 디스크 확인

명령어: lsblk

 

e.g) /dev/sdb 조회 확인

 

2. 파티셔닝

명령어: fdisk 또는 gdisk

fdisk {장치명}

 

e.g) fdisk /dev/sdb

입력 후 가이드에 커맨드를 입력하여 따라 파티션 조회/생성/수정/삭제 진행

 

자주 쓰는 파티셔닝 커맨드

  • p: 파티션 정보 출력
  • n: 새 파티션 생성
  • d: 파티션 삭제
  • t: 파티션 타입 변경
  • w: 저장 후 fdisk 종료
  • q: 저장 없이 fdisk 종료

 

3. 디스크 포멧(포멧타입 지정)

명령어: mkfs[ options] -t {파일시스템 타입} {장치명}

 

대표적인 filesystem 타입

  • ext4: ubuntu 배포판의 기본값
  • xfs: centos 배포판의 기본값
  • vfat: windows 와 호환됨
  • ntfs: windows 와 호환됨

 

참고

mkfs -t ext4 를 실행하면 실제로는 mkfs.ext4 로 동작함

mkfs -t xfs 를 실행하면 실제로는 mkfs.xfs 로 동작함

 

e.g) mkfs -t ext4 /dev/sdb1

실행하여 포멧을 지정하면 4Kib 크기의 블록들이 생성되고, 각각의 블록에는 index(inode) 가 붙어서 접근이 용이하게 된다.

blkid {장치명} 을 실행하면 파티션 id인 PARTUUID 이외에, 파일시스템상 id인 UUID 와 TYPE 정보도 출력된다.

 

4. 장치연결(mount)

디스크를 파일시스템의 특정 디렉토리에 연결하는 행위

명령어: mount {장치명} {마운트경로}

 

e.g) mount /dev/sdb1 /backup

 

mount 명령어를 인자 없이 실행하면 전체 마운트된 목록을 출력한다.

 

마운트 해제: umount {장치명 or 마운트경로}

 

5. 부팅시 자동마운트 되도록 설정

mount 설정파일인 /etc/fstab 파일에 설정

각 항목 설명

file system mount point type options dump fsck
장치명 or UUID 마운트 디렉토리 파일시스템 타입 마운트 옵션

defaults: rw, nouser, auto, exec, suid(일반적인 파일 시스템에 사용)
dump 명령어로 백업 허용 여부

0: 허용안함
1: 허용함
fsck 명령어로 부팅시 파일시스템 검사 여부

0: 검사안함
1: 1순위로 검사(root 파일 시스템)
2: 2순위로 검사(root 이외 파일 시스템)

 

e.g) /etc/fstab

# <file system> <mount point> <type> <options> <dump> <pass>
/dev/sdb1 /backup ext4 defaults 0 0

 

6. 자동마운트 설정 추가한 파일시스템을 마운트

명령어: mount -a

/etc/fstab 에 등록된 파일시스템 중 아직 마운트 안 된 파일시스템 전부 마운트 하는 명령어

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 디스크 확인

리눅스 시스템에서 디스크는 블록 디바이스로 취급되며, 이를 확인하는 명령어. 

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
vda    254:0    0  59.6G  0 disk
`-vda1 254:1    0  59.6G  0 part /etc/hosts
vdb    254:16   0   140M  1 disk
vdc    254:32   0 621.6M  1 disk

 

vda 블록 디바이스는 파티션이 vda1 하나로 이루어져 있음을 의미

vdb 블록 디바이스는 파티셔닝이 되어있지 않음을 의미

 

블록 디바이스(디스크) 이름 규칙

디스크 종류 디바이스 이름 규칙 파티션 이름 규칙 비고
플로피 디스크 /dev/fd0, /dev/fd1    
CDROM /dev/sr0, /dev/cdrom    
IDE 디스크 /dev/hda, /dev/hdb    
SCSI 디스크 /dev/sda, /dev/sdb /dev/sda1, /dev/sda2  
NVMe /dev/nvme0n1, /dev/nvme0n2 /dev/nvme0n1p1, /dev/nvme0n1p2 컨소시엄에서 SSD 전용으로 만든 표준

 

 

2. 블록 디바이스 id 확인

blkid

블록 디바이스의 uuid 와 파일 시스템 타입을 출력

 

 

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

1. 파티션 디스크 용량 확인

파티션 단위로 디스크 용량을 확인하는 명령어.

즉, 조회하려는 파일시스템이 속한 파티션에 대한 디스크 용량 정보를 나타낸다.

 

명령어: df [options] [디렉토리]

 

자주 쓰는 옵션

  • h: 용량을 읽기 좋은 형태로 출력(기본은 Kib)
  • T: 파일시스템 타입 포함
$ df -hT /

Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   59G  4.4G   51G   8% /

 

 

속성 설명

  • Type: 파일시스템 타입
  • Size: 전체 용량
  • Used: 현재 사용중인 용량
  • Avail: 남은 용량
  • Use%: 현재 사용률
  • Mounted on: 마운트된 경로

2. 특정 디렉토리/파일 용량 확인

하위 디렉토리를 포함한 용량 확인.

 

명령어: du [options] 경로

 

자주 쓰는 옵션

  • h: 용량을 읽기 좋은 형태로 출력(기본은 Kib)
  • s: 요약(디렉토리의 경우 기본적으로 디렉토리 하위 파일이 따로 출력됨)
$ du -sh /home
68K	/home
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

일반적으로 root 유저로 계정을 전환할 때 우리는

$ su -

명령을 사용하게 된다.

그런데, 

$ sudo -i

라는 명령을 사용해도 동일하게 root 유저가 되는데 어떤 차이가 있는건지 궁금해졌다.

 

1. sudo -i 의 동작

sudo -i 에서 "-i" 옵션은 대화형 모드 + root 계정의 *로그인 쉘 실행을 의미한다.(interactive mode + root login shell)

이때, root 계정의 쉘 환경과 환경변수를 모두 적용한다. sudo는 (당연하게도)사용자가 현재 sudo 권한을 가질 때만 작동한다.

sudo 명령 자체가 단일 명령어를 root 권한으로 실행하는 것이기 때문에, 현재 로그인 쉘(세션)은 유지된다.

sudo -i 는 실제로 root 계정의 로그인 쉘을 실행하며, 환경변수 $HOME, $PATH 등을 root 계정의 것으로 설정한다.

 

*로그인 쉘: 로그인 쉘은 사용자가 로그인할 때 실행되는 쉘로, 사용자 계정의 환경 변수($PATH, $HOME 등)와 셸 프로파일(.bash_profile, .bashrc 등)이 로드된다. sudo -i는 root 계정으로 로그인한 것처럼 로그인 쉘을 실행하는 것이다.

2. su - 의 동작

su 는 substitute user 의 약자로, 현재 로그인 쉘을 유지하면서 새로운 유저의 로그인 쉘로 변경하는 것이다. "-" 옵션을 주면 root 계정으로 전환되고, root 계정의 쉘 환경과 환경변수가 모두 적용된다. 

 

3. sudo -i 와 su - 의 차이점

su - 는 root 계정의 비밀번호가 필요하다.

반면, sudo -i 는 자신의 비밀번호가 필요하다. root 계정의 비밀번호는 필요하지 않다. sudo 권한을 통해 root 계정의 환경을 임시로 사용한다고 이해하면 쉽다.

 

즉, sudo 명령어의 -i 옵션은 "interactive login shell" 이라고만 알아도 두가지의 차이점을 이해할 수 있다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

file attribute 는 ls -l 명령에서 조회되지 않으며, 파일을 보호하거나 파일을 수정/삭제할 때 추가적인 동작을 설정하기 위한 속성이다.

이해하기 위해, 파일에 대한 자세한 상태를 조회해보자.

# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 89h/137d	Inode: 3028155     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-03-15 19:41:19.831013012 +0900
Modify: 2025-03-15 19:41:19.831013012 +0900
Change: 2025-03-15 19:41:19.831013012 +0900
 Birth: -
# cat file1
# stat file1
  File: file1
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 89h/137d	Inode: 3028155     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-03-23 13:36:24.020187004 +0900
Modify: 2025-03-15 19:41:19.831013012 +0900
Change: 2025-03-15 19:41:19.831013012 +0900
 Birth: -

stat 명령어로 파일에 대한 access time, modify time, change time 을 조회할 수 있다. 그런데, cat 명령어로 파일을 조회하면 access time 이 변경되는 것을 볼 수 있다.

  • access time: 파일 내용을 조회한 시점
  • modify time: 파일 내용을 수정한 시점
  • change time: 파일 속성정보를 수정한 시점(소유자, 권한 등)

이 파일에 접근하여도 access time 을 갱신하지 않도록 하려면 어떻게 해야 할까?

해당 파일의 file attribute 에 특정 attribute 를 추가해주면 된다.(여기서는 A 속성이 맞겠다.)

 

file attribute 주요 속성

속성명 의미 자세한 설명
A no atime updates 파일에 access가 발생해도 파일 시스템의 파일 해당 정보의 atime을 갱신하지 않음
a append only 파일에 내용 추가만 할 수 있음. vi 에디터로 파일 마지막에 내용을 붙이는 것도 불가능. append (>>) 하는 형태로만 가능.(파일보안을 위해 일반적으로 사용). 디렉토리에 설정하면 해당 디렉토리 내에 파일을 생성만 할 수 있음
i immutable 파일의 이름, 내용, 소유자, 권한 등 어떠한 것도 변경할 수 없음(삭제도 안됨. 변경되면 안되는 중요한 설정 파일에 사용하면 좋음)
C no copy on write 기록 중 복사 업데이트 안함
c compressed 커널에 의해 파일이 디스크에 자동으로 압축된 상태로 저장함
D synchronous directory updates 디렉토리의 변경사항을 동기화시킴
d no dumps dump 명령어로 백업되지 않음
e extent format 파일이 디스크 블록에 매핑될 때 extent를 사용함
j data journaling 파일에 데이터를 쓰기 전에 ext3 journal에 먼저 씀
S synchronous updates 파일이 변경되면 디스크에 동기적으로 저장됨
s secure deletion 파일이 삭제될 경우 해당 블록이 0이 되고, 디스크에 다시 쓰기가 됨. 삭제파일복구 불가능
T top of directory hierarchy 해당 디렉토리를 최상위 디렉토리로 인식함
t no tail-merging 파일에 partial block fragmentation(tail-merging)이 발생하지 않음. 즉, 파일에 t 속성이 설정되면 tail 명령어로 여러 파일을 병합하여 출력할 때, 해당 파일의 마지막 내용은 출력되지 않습니다.
u undeletable 파일을 삭제시 그 내용이 저장되어 다시 복구할 수 있게 됨(휴지통 같은 느낌?)

 

1. file attribute 확인하기

lsattr {파일명}

 

2. file attribute 변경하기

chattr[ -options] {속성변경자}{속성} {대상파일명}

 

options 설명

옵션 설명
-p 파일의 프로젝트 번호 설정하기
-R 하위 디렉토리까지 재귀적으로 변경
-V 변경한 속성 출력
-f 대부분의 오류 메시지 출력안함
-v {version} 버전 설정하기

 

속성변경자 설명

속성변경지 설명
+ 지정한 속성 추가
- 지정한 속성 제거
= 지정한 속성만 남기고 나머지 속성들은 제거

 

e.g.

# chattr +a file1

=> file1 에 append 만 가능하도록 속성을 설정한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,