네트워크 || 서버/도커(Docker)

Docker SSD에서 HDD로 저장소 변경하는 방법 with 리눅스 우분투

토끼C 2023. 6. 28. 12:28
반응형

Docker를 사용하다 보면 저장소가 ssd로 되어있어서 장치공간이 부족할 때가 있습니다. ssd는 hdd와 비교했을 때 상대적으로 빠르지만 가격이 비싸기 때문에 ssd의 저장공간은 hdd에 비해 매우 작은 편입니다.
 
이러한 이유로 Docker를 사용할 때 사용하는 저장소를 ssd에서 hdd로 바뀌는 방법에 대해 공유하고자 합니다.
현재 사용 중인 Docker의 저장소를 조회하는 명령어입니다.

root@LYJ:~# docker info | grep "Docker Root Dir"
WARNING: No swap limit support
 Docker Root Dir: /var/lib/docker

default값이 /var/lib/docker로 저장공간이 설정되어 있는 것을 알 수 있습니다.
 
현재 컴퓨터에서 사용 중인 device 정보를 먼저 확인해 줍니다.

root@LYJ:~#  fdisk -l
Disk /dev/loop0: 73 MiB, 76537856 bytes, 149488 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/loop1: 140 MiB, 146841600 bytes, 286800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

.
.
.

Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbbf8e3ad

Device     Boot Start       End   Sectors   Size Id Type
/dev/sda1  *     2048 500117503 500115456 238.5G 83 Linux

Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 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: gpt
Disk identifier: B42E8EA7-C44A-4245-8698-94CF0759F10D

Device          Start        End    Sectors   Size Type
/dev/sdb1          34     262177     262144   128M Microsoft reserved
/dev/sdb2      264192 1952412389 1952148198 930.9G Microsoft basic data
/dev/sdb3  1952413696 1953521663    1107968   541M Windows recovery environment

위의 조회된 결과를 보면 /dev/sda1이 256GB짜리인 ssd, /dev/sdb가 1TB인 hdd인 것을 예측할 수 있습니다.
 
ssd와 hdd를 좀 더 확실히 알고 싶다면 아래의 명령어로 device 중 어떤 것이 ssd이고, 어떤 것이 hdd인지 확인해 줍니다.
 
위에서 fdisk명령어로 조회했던 장치의 이름을 sdb, sda 자리에 넣어주면 됩니다. 조회했을 때 hdd이면 1, SSD 이면 0이 출력됩니다.

root@LYJ:~# cat /sys/block/sda/queue/rotational
0

root@LYJ:~# cat /sys/block/sdb/queue/rotational
1

위의 결과로 sda가 ssd이고, sdb가 hdd라는 것을 확실히 알 수 있게 되었습니다.
 
사용할 hdd의 파티션을 나눠서 사용해도 되지만 저는 docker를 사용이 목적이기 때문에 파티션을 추가로 분리하지 않고 이미 나눠져 있는 sdb1, sdb2, sdb3중 용량이 제일 큰 sdb2를 사용하겠습니다.
 
현재 리눅스에서는 ext4라는 파일 시스템을 사용하는데, /dev/sdb2를 ext4파일시스템으로 지정하기 전, lsblk 명령어로 현재 ext4라는 파일 시스템으로 사용 중인 장치를 조회해 봅니다.

root@LYJ:~# lsblk -f | grep ext4
└─sda1 ext4             be25863c-5198-4538-928a-34d07d8c082f

/dev/sda1 파티션이 ext4의 타입으로 지정된 것을 확인할 수 있습니다.
 
 
다음은 사용할 /dev/sdb2 파티션을 ext4라는 파일 시스템으로 생성하는 명령어입니다.

root@LYJ:~# mkfs.ext4 /dev/sdb2
mke2fs 1.44.1 (24-Mar-2018)
/dev/sdb2 contains a ntfs file system labelled '새 볼륨'
Proceed anyway? (y,N) y
Creating filesystem with 244018524 4k blocks and 61005824 inodes
Filesystem UUID: 35147e72-949f-4670-962b-29aa33e68009
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

 
파티션 생성 후 다시 조회해 보면 sdb2가 ext4 파일시스템으로 설정된 것을 확인할 수 있습니다.

root@LYJ:~# lsblk -f | grep ext4
└─sda1 ext4           be25863c-5198-4538-928a-34d07d8c082f /
├─sdb2 ext4           35147e72-949f-4670-962b-29aa33e68009 /var/lib/docker

 
 
파일 시스템으로 설정이 완료되었다면, docker 저장소를 /dev/sdb2에 마운트 해줍니다.
 
마운트를 하기 전 마운트 설정이 되어있는 ext4 파일시스템을 조회해 봅니다.

root@LYJ:~# mount | grep ext4
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

/dev/sda1이 /와 마운트 되어 있는 것을 확인할 수 있습니다.
 
 
다음 명령어를 통해 /dev/sdb2와 /var/lib/docker를 마운트 해줍니다.

root@LYJ:~# mount /dev/sdb2 /var/lib/docker

 
 
마운트가 성공적으로 되면 아까 조회됐던 /dev/sda1뿐만 아니라 방금 추가한 /dev/sdb2도 확인할 수 있습니다.

root@LYJ:~# mount | grep ext4
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sdb2 on /var/lib/docker type ext4 (rw,relatime,data=ordered)

성공적으로 마운트 된 것을 확인할 수 있습니다.
 
df -l 명령어 사용으로 사용 가능한 용량과 마운트 상태를 확인할 수 있게 됩니다.

root@LYJ:~# df -l
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             8117888       0   8117888   0% /dev
tmpfs            1629460    1948   1627512   1% /run
/dev/sda1      245084444 8557184 224007992   4% /
tmpfs            8147288       0   8147288   0% /dev/shm
tmpfs               5120       4      5116   1% /run/lock
tmpfs            8147288       0   8147288   0% /sys/fs/cgroup
tmpfs            1629456      52   1629404   1% /run/user/1000
/dev/loop1        143488  143488         0 100% /snap/gnome-3-26-1604/59
/dev/loop2          1664    1664         0 100% /snap/gnome-calculator/154
/dev/loop3         12544   12544         0 100% /snap/gnome-characters/69
/dev/loop4         21504   21504         0 100% /snap/gnome-logs/25
/dev/loop5          3456    3456         0 100% /snap/gnome-system-monitor/36
/dev/loop6        119680  119680         0 100% /snap/core/14946
tmpfs            1629456       0   1629456   0% /run/user/0
/dev/sdb2      959705520   77852 910807580   1% /var/lib/docker

 

저장소 변경 후 docker 사용중 다음과 같은 에러가 발생하면

failed to register layer: symlink ../5daf8075602e0f3829f30e27571ce6c2f756f5536dcdad04306219ae5415aaaa/diff /var/lib/docker/overlay2/l/S64WBARIFPTTZJPO5OJ4IA3AAA: no such file or directory
root@LYJ:~# service docker restart

를 사용해 Docker 데몬을 재시작 해주면 됩니다.

 


여기까지 ssd에서 hdd로 저장소 변경하는 방법이었습니다! 감사합니다~

반응형