🫧 1. 환경 세팅

✨ 1.0 환경 설정

  • 가상머신 활용
    • 디스크를 고정 사이즈로 고정 (동적 할당 X) : Pre-allocate disk space
    • SSD TRIM 기능 비활성화
    • 스냅샷 기능 비활성화
  • OS: Ubuntu 22.04 LTS
  • FS: ext4
  • Partition: 4GB
  • File Type: .jpg

✨ 1.1. 현재 디스크/파티션 조회

fdisk -l

image

실제 동작하는 하드디스크 환경과 유사하게 하려면 다음과 같은 방식으로 진행하면 된다.

  1. dd로 가상 디스크 생성
  2. losetup을 이용해 루프백 디바이스로 연결 (/dev/loopN), N은 양수를 의미

아래에서 더 자세하게 살펴보자.

✨ 1.2. dd로 가상 디스크 생성

dd if=/dev/zero of=test_disk.img bs=1M count=8192

: dd는 저수준 복사 및 변환을 위한 유닉스 기반의 명령어이다.

주로 디스크 복사, 파일 시스템 생성, 복사본 생성 등에 쓰인다.

해당 명령어를 자세하게 보자.

if=/dev/zero

  • if는 입력 파일(input file)을 지정한다.
  • /dev/zero/ 는 무한히 0으로 채워지는 특수 파일이다. 즉, 0x00으로 가득 찬 리눅스 장치 파일이다. 불필요한 로그 출력 등을 피하기 위해 null로 채운다고 생각하면 이해가 쉽다.

of=test_disk.img

  • of는 출력 파일(output file)을 지정한다.
  • test_disk.img는 생성될 가상 디스크 파일명으로, 이 파일에 입력 파일에서 입력해주었던 0x00으로 가득 찬 데이터가 저장된다.

bs=1M

  • bs는 블록 크기를 지정해준다. (한 번에 읽어들일 사이즈를 의미)
  • 1M은 1MB 크기를 의미하며, 1G는 1GB 데이터의 크기를 의미한다.

count=100

  • count는 몇 개의 블록을 읽고 쓸 건지를 지정한다.
  • 여기서 100은 100개의 블록을 사용한다는 의미이다.

가상 디스크의 크기는 bs * count 값에 의해 결정된다.

따라서, 현재 bs=1M, count=100이므로 최종 크기는 100MB가 될 것이다.

그러나 우리는 8GB로 세팅을 할 예정이기 때문에, bs=1M, count=8192로 세팅할 것이다.

!!! 너무 많이 잡으면 저장 공간이 부족하다…

✨ 1.3. losetup

sudo losetup -fP test_disk.img

루프백 디바이스로 연결

☁️ 루프백 디바이스 (loopback device)

: 루프백 장치는 파일을 가상 디스크처럼 사용할 수 있게 해 주는 장치이다.

즉, 루프백 장치를 이용하면 앞서 dd로 만든 디스크 이미지 파일(.img, .iso)을 실제 하드디스크처럼 파티션을 나누고 포맷하는 등의 작업을 거칠 수 있게 된다.

바로 파티션을 만들지 않는 이유도 이 때문인데, 디스크 이미지 파일을 실제 디스크처럼 다루기 위해서는 루프백 디바이스가 꼭 필요하다는 것이 그 이유다.

-f

  • 사용 가능한 첫 번째 루프백 장치를 자동으로 찾아서 설정하는 옵션
  • 루프백 장치(/dev/loop0, /dev/loop1 등) 여러 개가 있을 수 있기 때문에 -f 옵션을 사용해 빈 루프백 디바이스를 찾아주어야 한다.
  • 만일 이 옵션을 사용하지 않는다면 직접 루프백 디바이스를 지정해 주는 방법도 있다.
    => ex) losetup /dev/loop0 virtual_disk.img

-P

  • 루프백 디바이스에 연결된 디스크 이미지 안에 있는 파티션을 자동으로 감지하여 설정하는 옵션

image

  • 실제 디스크 내 파티션이 여러 개일 수 있으므로, -P 옵션을 사용해 내부에 있는 파티션을 자동으로 할당해야 한다.
  • 💡 다만, 모든 세팅이 완료된 후 파티션을 추가하려고 할 때는 자동 할당이 되지 않으므로 다시 이 명령어를 사용하거나 다른 방법으로 파티션을 할당해줘야 함을 잊지 말자!

✨ 1.4. fdisk로 파티션 만들기

sudo fdisk -l

아까 생성된 디스크를 확인하자.

image

/dev/loop8로 이미지가 잘 들어간 모습이다!

이제 만들어진 가상 디스크로 파티션을 만들 차례이다.

sudo fdisk /dev/loop8

image

Command 창이 떠도 놀라지 말 것.. (fdisk 유틸리티 시작)

image

  1. n : 새 파티션 생성
  2. p : 기본 파티션 선택
    -> 이 또한 기본값으로 1을 선택해준다.

  3. enter : 처음 섹터 설정 (변경할 필요 없음)
  4. enter : 끝 섹터 설정 (변경할 필요 없음)
  5. w : 변경사항 저장
  6. fdisk 종료

그리고 다시 sudo fdisk -l 명령어로 확인해보면 파티션이 제대로 들어갔음을 확인할 수 있다.

image

✨ 1.5. 파일 시스템 생성 & 마운트

이제 우리가 만든 장치를 사용하기 위해 마운트(mount)를 할 차례이다.

💡 mount : 특정 디바이스를 사용하기 위해 하드웨어 장치와 특정 디렉터리를 연결하는 작업

우리가 만든 장치는 디스크 이미지로, 실제 하드웨어 장치는 아니지만 루프백을 통해 실제 하드웨어 장치처럼 사용 가능하게 해 주었으므로 마운트 또한 그대로 진행해주면 문제 없이 된다!!

df -h
마운트 상태 확인 명령어

아까 전 확인한 우리의 파티션 이름은 loop8p1이었다. (사진 마지막 확인)

image

따라서, 우리는 우리가 만든 디스크 내 ext4로 파일 시스템을 설정하기 위해 다음과 같은 명령어를 사용할 예정이다.

sudo mkfs.ext4 /dev/loop8p1

image

  • fdisk로 생성한 파티션(/dev/loop8p1) 에 ext4 파일 시스템을 생성하는 명령어

sudo mkdir /mnt/test_disk

  • 마운트할 디렉터리 생성
  • 리눅스는 파일 시스템을 마운트할 때 마운트 포인트라는 디렉터리가 필요하다.
  • 이 디렉터리는 우리가 만든 디스크와 파일 시스템을 연결할 위치가 된다.

sudo mount /dev/loop8p1 /mnt/test_disk

  • 파티션(/dev/loop8p1)을 기존에 만든 디렉터리(/mnt/test_disk)에 마운트하는 명령어

다시 df -h로 마운트 여부를 확인해보면 다음과 같이 우리가 만든 디스크가 정상적으로 마운트되었음을 알 수 있다.

image

이제 /mnt/test_disk 경로에서 파일 생성 및 삭제 테스트를 진행할 수 있다.

✨ SSD TRIM 기능 비활성화

  1. sudo vim /etc/fstab
    -> etc/fstab 파일에서 해당 디스크(/dev/loop8, /mnt/test_disk)의 discard 옵션을 제거한다.

  2. /dev/loop8p1 /mnt/test_disk ext4 defaults 0 2

여기서 defaults 옵션은 다음과 같이 구성된다.

  • rw (읽기/쓰기 모드)
  • suid (set-user-identifier bits)
  • dev (디바이스 파일을 사용)
  • exec (실행 가능 파일을 사용)
  • auto (자동 마운트)
  • nouser (사용자가 마운트할 수 없음)
  • async (비동기적으로 파일 시스템 작업)

여기서 자세하게 봐야 할 점은, default 옵션이 discard 옵션을 포함하지 않는다는 점이다.

discard 옵션이 켜져 있으면 trim이 활성화되기 때문에 defaults 옵션을 켜서 trim을 비활성화 해줄 수 있기 때문에 trim을 비활성화시키기 위해서는 다음과 같은 /etc/fstab 파일에 해당 디스크의 옵션을 default로 주면 된다.

  1. 재부팅 or 다시 마운트하기
  • 수정 후 변경 사항을 적용하기 위해서는 재부팅하거나 다시 마운트를 해야 한다. ```
  • sudo reboot (재부팅)

또는

  • sudo umount /mnt/test_disk
  • sudo mount /dev/loop8p1 /mnt/test_disk ```
  1. trim 기능 비활성화 확인
sudo tune2fs -l /dev/loop8p1 grep “Filesystem features”

이때 has_journal과 ext_attr 등이 나올 수 있으며, 여기에 trim 관련 항목이 없다면 해당 디스크에서는 Trim이 비활성화되었음을 알 수 있다.

unmount가 아니라 umout이다…

✨ 스냅샷 기능 비활성화

✨ cf) 가상 디스크 제거

umount /mnt/test_disk losetup -d /dev/loop0