[FS] 가상 디스크 생성
🫧 1. 환경 세팅
✨ 1.0 환경 설정
- 가상머신 활용
- 디스크를 고정 사이즈로 고정 (동적 할당 X) :
Pre-allocate disk space
- SSD TRIM 기능 비활성화
- 스냅샷 기능 비활성화
- 디스크를 고정 사이즈로 고정 (동적 할당 X) :
- OS: Ubuntu 22.04 LTS
- FS: ext4
- Partition: 4GB
- File Type: .jpg
✨ 1.1. 현재 디스크/파티션 조회
fdisk -l
실제 동작하는 하드디스크 환경과 유사하게 하려면 다음과 같은 방식으로 진행하면 된다.
- dd로 가상 디스크 생성
- 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
- 루프백 디바이스에 연결된 디스크 이미지 안에 있는 파티션을 자동으로 감지하여 설정하는 옵션
- 실제 디스크 내 파티션이 여러 개일 수 있으므로, -P 옵션을 사용해 내부에 있는 파티션을 자동으로 할당해야 한다.
- 💡 다만, 모든 세팅이 완료된 후 파티션을 추가하려고 할 때는 자동 할당이 되지 않으므로 다시 이 명령어를 사용하거나 다른 방법으로 파티션을 할당해줘야 함을 잊지 말자!
✨ 1.4. fdisk로 파티션 만들기
sudo fdisk -l
아까 생성된 디스크를 확인하자.
/dev/loop8로 이미지가 잘 들어간 모습이다!
이제 만들어진 가상 디스크로 파티션을 만들 차례이다.
sudo fdisk /dev/loop8
Command 창이 떠도 놀라지 말 것.. (fdisk 유틸리티 시작)
n
: 새 파티션 생성-
p
: 기본 파티션 선택
-> 이 또한 기본값으로 1을 선택해준다. enter
: 처음 섹터 설정 (변경할 필요 없음)enter
: 끝 섹터 설정 (변경할 필요 없음)w
: 변경사항 저장- fdisk 종료
그리고 다시 sudo fdisk -l
명령어로 확인해보면 파티션이 제대로 들어갔음을 확인할 수 있다.
✨ 1.5. 파일 시스템 생성 & 마운트
이제 우리가 만든 장치를 사용하기 위해 마운트(mount)를 할 차례이다.
💡 mount : 특정 디바이스를 사용하기 위해 하드웨어 장치와 특정 디렉터리를 연결하는 작업
우리가 만든 장치는 디스크 이미지로, 실제 하드웨어 장치는 아니지만 루프백을 통해 실제 하드웨어 장치처럼 사용 가능하게 해 주었으므로 마운트 또한 그대로 진행해주면 문제 없이 된다!!
- df -h
- 마운트 상태 확인 명령어
아까 전 확인한 우리의 파티션 이름은 loop8p1이었다. (사진 마지막 확인)
따라서, 우리는 우리가 만든 디스크 내 ext4로 파일 시스템을 설정하기 위해 다음과 같은 명령어를 사용할 예정이다.
sudo mkfs.ext4 /dev/loop8p1
- fdisk로 생성한 파티션(/dev/loop8p1) 에 ext4 파일 시스템을 생성하는 명령어
sudo mkdir /mnt/test_disk
- 마운트할 디렉터리 생성
- 리눅스는 파일 시스템을 마운트할 때 마운트 포인트라는 디렉터리가 필요하다.
- 이 디렉터리는 우리가 만든 디스크와 파일 시스템을 연결할 위치가 된다.
sudo mount /dev/loop8p1 /mnt/test_disk
- 파티션(/dev/loop8p1)을 기존에 만든 디렉터리(/mnt/test_disk)에 마운트하는 명령어
다시 df -h
로 마운트 여부를 확인해보면 다음과 같이 우리가 만든 디스크가 정상적으로 마운트되었음을 알 수 있다.
이제 /mnt/test_disk 경로에서 파일 생성 및 삭제 테스트를 진행할 수 있다.
✨ SSD TRIM 기능 비활성화
-
sudo vim /etc/fstab
-> etc/fstab 파일에서 해당 디스크(/dev/loop8, /mnt/test_disk)의 discard 옵션을 제거한다. -
/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로 주면 된다.
- 재부팅 or 다시 마운트하기
- 수정 후 변경 사항을 적용하기 위해서는 재부팅하거나 다시 마운트를 해야 한다. ```
- sudo reboot (재부팅)
또는
- sudo umount /mnt/test_disk
- sudo mount /dev/loop8p1 /mnt/test_disk ```
- 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