OpenWrt 시스템에서 SquashFS 펌웨어의 디스크 공간을 확장하는 과정은 때때로 복잡하게 느껴질 수 있습니다. 특히 X86_64 아키텍처 환경에서는 부팅 방식(BIOS 또는 UEFI)과 파일 시스템 유형(ext4 또는 f2fs)에 따라 접근 방식이 달라질 수 있습니다. 이 가이드에서는 Overlay 파티션을 확장하여 OpenWrt의 가용 저장 공간을 늘리는 방법을 자세히 설명합니다.
파일 시스템 및 부팅 방식 이해
최신 OpenWrt 펌웨어를 x86_64 장치에 설치할 때, 디스크의 파일 시스템 유형은 설치 과정에서 사용된 부팅 방식에 따라 달라질 수 있습니다.
- UEFI 부팅 방식 (GPT 파티션 테이블): 일반적으로
f2fs파일 시스템이 사용됩니다. 이 방식은 M.2 SSD와 같은 최신 저장 장치에서 흔히 볼 수 있습니다. - 레거시 BIOS 부팅 방식 (MBR 파티션 테이블): 일반적으로
ext4파일 시스템이 사용됩니다.
만약 UEFI 방식으로 부팅하여 펌웨어를 설치했음에도 불구하고 ext4 파일 시스템을 사용하고 싶다면, 파티션 분할 과정에서 GPT 파티션 테이블을 MBR로 변환하는 단계를 추가할 수 있습니다. 반대로 f2fs를 ext4로 또는 그 반대로 변환하는 것도 가능합니다.
현재 시스템의 파일 시스템 유형을 확인하려면 다음 명령어를 사용합니다:
df -Th
lsblk -f
필요한 소프트웨어 설치
파티션 및 파일 시스템 작업을 위해 필요한 유틸리티를 설치합니다.
opkg update
opkg install lsblk fdisk resize2fs losetup blkid f2fs-tools tree
설치 과정은 다음과 유사하게 진행됩니다:
root@ImmortalWrt:~# opkg install lsblk fdisk resize2fs losetup blkid f2fs-tools tree
Installing lsblk (2.39-2) to root...
...
Configuring tree.
diskman과 같은 도구는 OpenWrt 공식 저장소에서 제공되지 않으므로, 필요에 따라 수동 설치해야 합니다.
현재 디스크 파티션 상태 확인
디스크의 파티션 정보를 확인하여 작업할 디스크와 파티션 번호를 식별합니다.
root@ImmortalWrt:~# fdisk -l
Disk /dev/loop0: 291.06 MiB, 305201152 bytes, 596096 sectors
Units: sectors of 1 * 512 = 512 bytes
...
Disk /dev/sda: 58.69 GiB, 63023063040 bytes, 123091920 sectors
Disk model: SanDisk SSD i110
Units: sectors of 1 * 512 = 512 bytes
...
Disklabel type: gpt
Disk identifier: 20C60F33-AFC6-96E2-AE0B-E001AE609500
Device Start End Sectors Size Type
/dev/sda1 512 66047 65536 32M Linux filesystem
/dev/sda2 66048 680447 614400 300M Linux filesystem
/dev/sda128 34 511 478 239K BIOS boot
Partition table entries are not in disk order.
이 예시에서는 다음과 같은 정보를 확인할 수 있습니다:
- 전체 디스크는
/dev/sda이며, 총 용량은 58.69GB입니다. - 확장할 파티션은
/dev/sda2이며, 시작 섹터는66048이고 현재 크기는 300MB입니다.
디스크 파티션 재조정 (F2FS / GPT / UEFI 환경)
이제 fdisk 명령어를 사용하여 /dev/sda2 파티션을 확장합니다.
1. fdisk /dev/sda 명령으로 디스크 파티션 도구를 시작합니다.
2. p를 입력하여 현재 파티션 정보를 확인합니다. 확장할 파티션 번호(이 경우 2번)를 기억합니다.
root@ImmortalWrt:~# fdisk /dev/sda
Welcome to fdisk (util-linux 2.39).
...
Command (m for help): p
Disk /dev/sda: 58.69 GiB, 63023063040 bytes, 123091920 sectors
...
Device Start End Sectors Size Type
/dev/sda1 512 66047 65536 32M Linux filesystem
/dev/sda2 66048 680447 614400 300M Linux filesystem
/dev/sda128 34 511 478 239K BIOS boot
...
Command (m for help):
3. d를 입력하여 파티션을 삭제하고, 삭제할 파티션 번호 2를 입력합니다. 이는 파티션 테이블에서 논리적으로 해당 파티션을 삭제하는 것이며, 실제 데이터가 즉시 지워지지는 않습니다.
Command (m for help): d
Partition number (1,2,128, default 128): 2
Partition 2 has been deleted.
Command (m for help):
4. n을 입력하여 새로운 파티션을 생성합니다. 파티션 번호 2를 입력하고, 시작 섹터는 기존 파티션과 동일한 66048을 입력합니다. 마지막 섹터는 +8G와 같이 원하는 크기를 입력합니다 (예시에서는 8GB로 확장).
중요한 부분은 Partition #2 contains a squashfs signature. Do you want to remove the signature? [Y]es/[N]o: 메시지가 나타나면 반드시 n을 선택해야 합니다.
모든 설정이 완료되면 p를 다시 입력하여 파티션 테이블을 확인하고, w를 입력하여 변경 사항을 디스크에 저장합니다.
Command (m for help): n
Partition number (2-127, default 2): 2
First sector (66048-123091886, default 67584): 66048
Last sector, +/-sectors or +/-size{K,M,G,T,P} (66048-123091886, default 123090943): +8G
Created a new partition 2 of type 'Linux filesystem' and of size 8 GiB.
Partition #2 contains a squashfs signature.
Do you want to remove the signature? [Y]es/[N]o: n
Command (m for help): p
Disk /dev/sda: 58.69 GiB, 63023063040 bytes, 123091920 sectors
...
Device Start End Sectors Size Type
/dev/sda1 512 66047 65536 32M Linux filesystem
/dev/sda2 66048 16777151 16711104 8G Linux filesystem
/dev/sda128 34 511 478 239K BIOS boot
...
Command (m for help): w
The partition table has been altered.
Syncing disks.
새 파티션 상태 확인 및 Overlay 마운트 정보 파악
fdisk -l 명령으로 파티션 테이블이 8GB로 변경되었는지 확인합니다.
root@ImmortalWrt:~# fdisk -l
...
Device Start End Sectors Size Type
/dev/sda1 512 66047 65536 32M Linux filesystem
/dev/sda2 66048 16777151 16711104 8G Linux filesystem
/dev/sda128 34 511 478 239K BIOS boot
...
그러나 df -Th 명령으로 확인하면 파일 시스템의 가용 공간은 아직 변경되지 않았음을 알 수 있습니다. 이는 Overlay 파일 시스템의 특성 때문입니다.
root@ImmortalWrt:~# df -Th
Filesystem Type Size Used Available Use% Mounted on
/dev/root squashfs 9.0M 9.0M 0 100% /rom
tmpfs tmpfs 906.0M 1.1M 904.9M 0% /tmp
/dev/loop0 f2fs 289.1M 63.1M 226.0M 22% /overlay
overlayfs:/overlay overlay 289.1M 63.1M 226.0M 22% /
/dev/sda1 vfat 31.9M 7.9M 24.1M 25% /boot
...
현재 Overlay 파일 시스템의 루프 장치 정보를 확인합니다. OFFSET 값은 나중에 새 루프 장치를 생성할 때 필요하므로 기억해야 합니다.
root@ImmortalWrt:~# losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop0 0 9371648 1 0 /sda2 0 512
여기서 / 마운트 지점은 overlay 파일 시스템 기술을 사용하며, /dev/loop0는 /sda2 파일에 매핑되어 /overlay로 마운트됩니다. 이 Overlay 시스템은 squashfs의 읽기 전용 층(/dev/root)과 f2fs의 쓰기 가능한 층(/overlay)을 결합하여 동작합니다.
새 루프 장치 생성 및 데이터 확인
기존 /dev/loop0와 동일한 OFFSET 값을 사용하여 새 루프 장치(예: /dev/loop1)를 생성합니다. 이렇게 함으로써 이전에 Overlay 파티션에 저장된 데이터에 접근할 수 있습니다.
root@ImmortalWrt:~# losetup -f -o 9371648 /dev/sda2
root@ImmortalWrt:~# losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC
/dev/loop1 0 9371648 0 0 /dev/sda2 0 512
/dev/loop0 0 9371648 1 0 /sda2 0 512
데이터 무결성을 확인하기 위해 새로 생성된 /dev/loop1을 임시로 마운트하여 기존 Overlay 데이터가 잘 보존되어 있는지 확인합니다. 확인 후에는 반드시 언마운트하여 리소스를 해제합니다.
root@ImmortalWrt:~# mount /dev/loop1 /mnt
root@ImmortalWrt:~# tree -L 2 /mnt
/mnt
├── upper
│ ├── boot
│ ├── etc
│ ├── lib
│ ├── mnt
│ ├── sbin
│ └── usr
└── work
└── work
10 directories, 0 files
root@ImmortalWrt:~# umount /dev/loop1
파일 시스템 확장
lsblk -f 명령으로 /dev/loop1의 파일 시스템 유형을 다시 확인합니다.
root@ImmortalWrt:/# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop0 f2fs rootfs_data 297e8d5f-1a2b-3c4d-5e6f-7a8b9c0d1e2f 225.9M 22% /overlay
loop1 f2fs rootfs_data 297e8d5f-1a2b-3c4d-5e6f-7a8b9c0d1e2f
sda
├─sda1 vfat kernel 1234-ABCD 24.1M 25% /mnt/sda1
│ /boot
│ /boot
├─sda2 squashfs 0 100% /rom
└─sda128
파일 시스템 유형에 따라 적절한 확장 명령을 실행합니다.
F2FS 파일 시스템 확장
root@ImmortalWrt:/# resize.f2fs -f /dev/loop1
Info: Force to resize
Info: MKFS version
...
Done: 0.799958 secs
EXT4 파일 시스템 확장 (BIOS/MBR 환경)
만약 /dev/loop1이 ext4 파일 시스템이라면 다음 명령을 사용합니다:
root@ImmortalWrt:/# resize2fs -f /dev/loop1
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/sdb1 is mounted on /overlay; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 24
The filesystem on /dev/loop1 is now 52428539 (4k) blocks long.
EFI 부팅 환경에서 GRUB 설정 업데이트
펌웨어가 EFI(UEFI) 부팅을 사용하는 경우, 시스템이 새 파티션 정보를 올바르게 인식하도록 GRUB 부트로더 설정을 업데이트해야 합니다.
먼저 blkid 명령을 사용하여 /dev/sda2의 PARTUUID를 확인합니다:
root@ImmortalWrt:/# blkid
/dev/loop1: LABEL="rootfs_data" UUID="297e8d5f-1a2b-3c4d-5e6f-7a8b9c0d1e2f" BLOCK_SIZE="4096" TYPE="f2fs"
...
/dev/sda2: BLOCK_SIZE="262144" TYPE="squashfs" PARTUUID="d2a1c0f3-a1b2-3c4d-e5f6-7890abcdef12"
...
/dev/sda2의 PARTUUID 값을 (예: d2a1c0f3-a1b2-3c4d-e5f6-7890abcdef12) 기록합니다. 이제 /boot/grub/grub.cfg 파일을 vim 또는 다른 텍스트 편집기로 열어 root=PARTUUID=... 부분을 찾아서 이전에 확인한 PARTUUID 값으로 수정합니다. 일반적으로 두 군데에 나타납니다.
root@ImmortalWrt:/# vim /boot/grub/grub.cfg
수정 후 cat /boot/grub/grub.cfg 명령으로 변경 사항을 확인합니다.
root@ImmortalWrt:/# cat /boot/grub/grub.cfg
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1 --rtscts=off
terminal_input console serial; terminal_output console serial
set default="0"
set timeout="3"
search -l kernel -s root
menuentry "ImmortalWrt" {
linux /boot/vmlinuz root=PARTUUID=d2a1c0f3-a1b2-3c4d-e5f6-7890abcdef12 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
menuentry "ImmortalWrt (failsafe)" {
linux /boot/vmlinuz failsafe=true root=PARTUUID=d2a1c0f3-a1b2-3c4d-e5f6-7890abcdef12 rootwait console=tty0 console=ttyS0,115200n8 noinitrd
}
레거시 BIOS 부팅 방식을 사용하는 펌웨어의 경우 이 단계를 건너뛰고 바로 재부팅해도 됩니다.
시스템 재부팅 및 최종 확인
모든 변경 사항을 적용하기 위해 시스템을 재부팅합니다.
root@ImmortalWrt:/# reboot
재부팅 후 df -Th 명령을 사용하여 파일 시스템의 가용 공간이 올바르게 확장되었는지 확인합니다.
root@ImmortalWrt:~# df -Th
Filesystem Type Size Used Available Use% Mounted on
/dev/root squashfs 9.0M 9.0M 0 100% /rom
tmpfs tmpfs 906.0M 104.0K 905.9M 0% /tmp
/dev/loop0 f2fs 8.0G 162.8M 7.8G 3% /overlay
overlayfs:/overlay overlay 8.0G 162.8M 7.8G 3% /
tmpfs tmpfs 512.0K 0 512.0K 0% /dev
/dev/sda1 vfat 31.9M 7.9M 24.1M 25% /mnt/sda1
이제 /overlay 파티션의 크기가 8.0GB로 확장되었으며, OpenWrt 시스템에서 더 많은 저장 공간을 사용할 수 있게 되었습니다.
EXT4 파일 시스템 확장 (전통적인 BIOS/MBR 환경)
BIOS 부팅 및 MBR 파티션 테이블을 사용하는 EXT4 환경의 확장 과정은 다음과 같습니다.
1. 필요한 유틸리티를 설치합니다 (위와 동일).
2. fdisk -l 명령으로 현재 디스크 파티션 상태를 확인합니다. 예를 들어 /dev/sda2를 확장한다고 가정합니다.
root@OpenWrt:~# fdisk -l
Disk /dev/loop0: 99.81 MiB, 104660992 bytes, 204416 sectors
...
Disk /dev/sda: 58.69 GiB, 63023063040 bytes, 123091920 sectors
Disk model: SanDisk SSD i110
Units: sectors of 1 * 512 = 512 bytes
...
Disklabel type: dos
Disk identifier: 0x95a30341
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 33279 32768 16M 83 Linux
/dev/sda2 33792 246783 212992 104M 83 Linux
3. fdisk /dev/sda를 실행하여 /dev/sda2를 삭제하고 새로 생성합니다. 시작 섹터는 기존 /dev/sda2의 시작 섹터(33792)와 동일하게 유지하고, 크기는 예를 들어 +15G로 설정합니다. SquashFS 시그니처 제거 여부를 묻는 질문에는 반드시 n을 선택해야 합니다.
root@OpenWrt:~# fdisk /dev/sda
...
Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (33280-123091919, default 34816): 33792
Last sector, +/-sectors or +/-size{K,M,G,T,P} (33792-123091919, default 123091919): +15G
Created a new partition 2 of type 'Linux' and of size 15 GiB.
Partition #2 contains a squashfs signature.
Do you want to remove the signature? [Y]es/[N]o: n
Command (m for help): p
Disk /dev/sda: 58.69 GiB, 63023063040 bytes, 123091920 sectors
...
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 512 33279 32768 16M 83 Linux
/dev/sda2 33792 31490047 31456256 15G 83 Linux
Command (m for help): w
The partition table has been altered.
Syncing disks.
4. fdisk -l로 변경된 파티션 테이블을 확인하고 df -Th로 파일 시스템 공간이 아직 반영되지 않은 것을 확인합니다.
root@OpenWrt:~# df -Th
Filesystem Type Size Used Available Use% Mounted on
/dev/root squashfs 4.3M 4.3M 0 100% /rom
tmpfs tmpfs 910.1M 1.0M 909.1M 0% /tmp
/dev/loop0 ext4 88.0M 2.2M 78.8M 3% /overlay
overlayfs:/overlay overlay 88.0M 2.2M 78.8M 3% /
...
5. BIOS/MBR 환경에서는 grub.cfg 수정 없이 바로 재부팅할 수 있습니다.
root@OpenWrt:~# reboot
6. 재부팅 후 losetup 명령으로 루프 장치 상태를 확인합니다. OFFSET 값을 기록해둡니다.
root@OpenWrt:~# losetup
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
DIO LOG-SEC
/dev/loop0 0 4390912 1 0 /sda2 0 512
7. df -Th로 여전히 공간이 반영되지 않은 것을 확인합니다.
root@OpenWrt:~# df -Th
Filesystem Type Size Used Available Use% Mounted on
/dev/root squashfs 4.3M 4.3M 0 100% /rom
tmpfs tmpfs 910.1M 84.0K 910.1M 0% /tmp
/dev/loop0 ext4 88.0M 2.2M 78.8M 3% /overlay
overlayfs:/overlay overlay 88.0M 2.2M 78.8M 3% /
...
8. 이제 resize2fs -f /dev/loop0 명령으로 EXT4 파일 시스템을 확장합니다.
root@OpenWrt:~# resize2fs -f /dev/loop0
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/loop0 is mounted on /overlay; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 80
The filesystem on /dev/loop0 is now 10481984 (1k) blocks long.
9. 마지막으로 df -Th 명령으로 파일 시스템 공간이 15GB에 가깝게 확장된 것을 확인합니다.
root@OpenWrt:~# df -Th
Filesystem Type Size Used Available Use% Mounted on
/dev/root squashfs 4.3M 4.3M 0 100% /rom
tmpfs tmpfs 910.1M 84.0K 910.1M 0% /tmp
/dev/loop0 ext4 14.8G 2.2M 14.0G 0% /overlay
overlayfs:/overlay overlay 14.8G 2.2M 14.0G 0% /
...