리눅스 ext4 이미지 만들때 문제점.

sootoo23의 이미지

임베디드 리눅스 시스템에서 Root filesystem 제작시
ext4를 사용하며 아래와 같이 Script를 구성하여 사용중입니다.

if=/dev/zero of=${OUTPUT} bs=1k count=${PARTCNT}
     mkfs.ext4 -F -m0 ${OUTPUT}
     mount -t ext4 ${OUTPUT} /mnt -o loop
     tar -C ${TARGET} -cf - . | tar -C /mnt -xf -

문제는....
항상 Rootfs ext4 이미지를 만들때 2GB 이미지로 만들어야
2GB Partition의 Rootfs가 생성됩니다.

실제 Rootfs 의 data size는 800MB밖에 안되는데
이걸 2GB로 만들어서 업데이트 해주려니 너무 오래걸립니다.

다른 File system (ubifs/jffs2/squashfs/etc..)처럼 ext4 FS도
해당 이미지의 크기만큼만 Write해도 지정한 파티션 용량만큼 사용할 수는 없을까요?

----------------------------------------------------------------------------------
Rootfs data 용량: 800MB
Flash Rootfs Partition 할당: 2GB
업데이트 ext4 이미지 800MB를 Write하여 2GB 파티션 사용하는 방법이 없을까요?

익명 사용자의 이미지

단순히 dd 할 때 count 값을 변경하면 안되는건가요?

sootoo23의 이미지

Data는 800MB이지만...
Flash의 Partition크기는 2GB라..

2GB의 용량을 확보하려면
ext 4의 이미지를 2GB만큼 만들어야 합니다..

저는 이걸 800MB이미지를 만들고 2GB 파티션을 사용할 수 있는 방법이 없는지 궁금합니다.

익명 사용자의 이미지

$ fallocate -l 2G 2g.img
또는
$ dd if=/dev/zero of=2G.img bs=1 count=0 seek=2G

로 테스트해 보시기 바랍니다.
익명 사용자의 이미지

문득 생각이 나서 추가로 테스트해 보았는데, mke2fs를 사용하면 말씀하신 dd, mkfs.ext4, mount, tar, umount 과정을 한번에 진행할 수 있습니다.

$ mke2fs -t ext4 -d rootfs_dir rootfs.img 2G
sootoo23의 이미지

위와 같이 해도 이미지 크기는 2GB로 생성됩니다.

제가 원하는건..
이미지 크기는 800MB로 ext4로 생성하고
실제 파티션 크기만큼인 2GB를 사용하게 하는 겁니다.

다른 파일시스템들은 (squashfs, ubifs, jffs2, yaffs2)
data 사이즈와 무관하게 파티션 크기만큼 사용할 수가 있는데..

ext4는 그게 안되는거 같습니다.

bushi의 이미지

파일 시스템 이미지를 작게 만들어서 일단 부팅한 다음 resize 하는 방식이 가능합니다.
ext4 는 online resizing 이 되므로 rootfs 에 대해서도 동작한다고 하는군요.

혹은, android 처럼 만들때 압축하고 저장장치에 기록할 때 압축을 풀어서 기록하는 방식이 가능합니다.
다만, 부트로더에도 libsparse 를 구겨넣거나, 부트로더와 통신하면서 데이터를 넘겨주는 클라이언트를 만들어 구겨넣어야 합니다.

+덧

써 본 적도 없고, 평이 썩 좋지도 않은 것 같긴 하지만, 어쩌면 f2fs 가 원하시는 그 방식으로 동작할 지도 모르겠습니다.

sootoo23의 이미지

답변 감사드립니다.

ext4는 online resizing이 되는군요!!

한가지 추가 여쭤볼게 있는데요..
MMC/eMMC에 올라가는 리눅스 파일시스템이
FAT,EXT 파일시스템 밖에 없나요?

bushi의 이미지

하드 디스크에 올릴 수 있는 파일 시스템들은 전부, 단 하나의 예외없이 올라갑니다.

다만, 몇몇 더 우월한 파일 시스템은 있을 수 있죠.
SSD 가 뜨기 시작하면서... 빙빙 돌아가는 판때기가 없는, 다시 말해 저 아랫쪽에 flash memory 로 구현된 저장소가 있는, 기술적으로 말하면 지우기(erase)를 좀 더 효율적(수명 연장과 처리 시간 감소)으로 해야하는, 구체적으로는 content remove 를 erase 와 discard 로 나눠서 처리하는 게 필요해졌습니다.
SATA 가 여기에 재빨리 편승해서 TRIM 이라는 프로코톨을 들고 나오긴 했는데, 근본적으로 erase 와 discard 를 구분하는 주체는 sata controller 의 드라이버가 아니라 file system 드라이버일 수 밖에 없다는 것이죠.
쉽게 말하면, 인간이 어느 디렉토리에서 파일을 지운다고 쳤을 때, 물리적인 저장소에 "이 파일은 지워짐" 이라는 새 정보를 기록할 것인지 아니면 물리적 저장소에 "이 블럭은 자유로워짐" 이라고 통보만 할 것인지는 파일 시스템만이 결정할 수 있습니다.
이 TRIM 을 지원하는 파일 시스템이 (아마도) 있을 겁니다.
일단은 f2fs 에서 지원한다고 광고하고 있고, ext4fs 의 마운트 옵션에도 realtime trim 을 켜고 끌 수 있는 옵션이 있네요.

아.. eMMC 에도 TRIM 비스무리한 프로토콜이 있습니다.
리눅스의 mmcsd block 드라이버에서 구현을 했는지는 모르겠지만...

myiun20의 이미지

이미지란게 디스크를 그대로 복사해서 뽑아낸건뎅 800MB이미지를 구워내면 2GB까지 리사이징 된 디스크가 나오게끔 할 수 있는건가요?? 혹시 해결이 되신건지 ㅠㅠ

sootoo23의 이미지

저도 아직은 시도 안해보았지만..?

일단은 800MB 이미지를 Write하면
리눅스에서 df -h로 확인하시면 800MB의 Partition이 잡혀 있을 겁니다.

이 상태에서 resize2fs 같은 툴을 이용하여 확장하시면 될 것 같습니다..

myiun20의 이미지

800MB짜리 부팅가능한 이미지를 추출하는것이 가능한가요?? Micro SD카드에 작업할 시에 800MB SD카드에 작업을 하신거면 모르겠지만.. 제가알기론 800MB짜리 SD카드가 있는지,, 그런게 아니라면 800MB 부팅가능한 이미지가 추출이 가능한지 모르겟네용.. 32GB짜리에 파티션을 5GB정도로 만들어서 작업을하시고 32GB짜리 이미지를 뽑아내신 후에 다른 SD카드에 구워보신후 df -h를 하면 5Gb로 잡혀서 파티션을 32Gb까지 resize를 할 수는 있지만.. 작성자님께서 하신말씀은 가능한지 의문이네용,, 800MB이미지를 구워냇는데 2GB resize가 흠..

myiun20의 이미지

그러고보니 우분투 배포판 이미지는 1.4GB이런것도 있넹 자체제작이라 가능한곤가,, ㅠㅠ 저는 dd로 추출해본적 바께없어서 힝

bushi의 이미지

리눅스 쓰신다면, 11줄 짜리 스크립트로 만들어서 원하는 작업하실 수 있습니다. (예외 처리 같은 거 상큼하게 무시한다면.)

1. dd 로 디스크 이미지를 추출한다
2. kparts 를 사용해서 1번에서 추출한 디스크 이미지의 파티션들을 적절한 loopback 장치에 배당한다
3. dd 로 원하는 크기의 파일을 만든다
4. losetup 을 사용해서 3번에서 만든 파일을 적당한 loopback 장치에 배당한다.
5. mkfs 로 4번에서 배당한 loopback 장치를 포맷한다.
6. 2 번에서 배당한 loopback 장치들 중 원하는 장치(파티션)을 적당한 곳에 마운트 한다
7. 5 번에서 포맷한 loopback 장치를 적당한 곳에 마운트 한다
8. cp 를 이용해서 6번에서 마운트한 곳의 파일들을 7번에서 마운트한 곳으로 복사한다
9. 모든 loopback 장치의 마운트를 해제한다
10. losetup 을 사용해서 4번에서 배당한 loopback 장치를 해제한다.
11. kparts 를 사용해서 2번에서 배당한 loopback 장치들을 해제한다.

새로 만들 디스크 이미지 파일에도 파티션을 만들어줘야한다면,
파일에 loopback 장치 배당하고, fdisk 등을 사용해서 파티션 나누고, loopback 장치 해제하고, kparts 로 다시 파티션별 loopback 장치 배당하고, 원하는 파티션에 해당하는 loopback 장치를 mkfs 로 포맷하고, 포맷한 놈을 mount 하고, 필요한 파일들 복사하세요.

sootoo23의 이미지

이미지 크기랑 SD카드랑 무슨상관인지... 모르겠네요..
이미지 크기는 개발자가 원하는데로 만들수가 있는거고

SD카드에는 해당이미지를 카피해서 넣는것 뿐인데요..

doraq의 이미지

2G 짜리 만드신 이미지를 DD로 파티션에 800MB만 write를 하시면 어떤가요?
(단, 이 방법은 개발중에 매번 업데이트가 너무 느려서 불편하다...이럴때만 적용하는게 좋겠죠)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.