OpenWrt x86_64 SquashFS 펌웨어 저장 공간 확장: Overlay 파티션 재조정 가이드

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로 변환하는 단계를 추가할 수 있습니다. 반대로 f2fsext4로 또는 그 반대로 변환하는 것도 가능합니다.

현재 시스템의 파일 시스템 유형을 확인하려면 다음 명령어를 사용합니다:

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/loop1ext4 파일 시스템이라면 다음 명령을 사용합니다:

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/sda2PARTUUID를 확인합니다:

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/sda2PARTUUID 값을 (예: 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% /
...

태그: OpenWrt x86_64 SquashFS OverlayFS F2FS

5월 30일 05:54에 게시됨