Làm cách nào để tạo ảnh đĩa nhỏ với các phân vùng lớn


7

Tôi đang xây dựng hình ảnh đĩa cho một hệ thống nhúng (sẽ được đặt trên thẻ SD 4GB). Tôi muốn hệ thống có hai phân vùng. Phân vùng 'Root' (200Mb) và phân vùng 'Dữ liệu' (800Mb).

Tôi tạo một tệp 1GB trống với dd. Sau đó, tôi sử dụng parted để thiết lập các phân vùng. Tôi gắn kết chúng trong một thiết bị lặp sau đó định dạng chúng; ext2 cho 'Root' ext4 cho 'Dữ liệu'. Thêm hệ thống tệp gốc của tôi vào phân vùng 'Root' và để trống 'Dữ liệu'.

Đây là vấn đề. Tôi hiện đang bị mắc kẹt với hình ảnh 1GB, chỉ có 200 MB dữ liệu trên đó. Về lý thuyết, tôi có nên cắt bớt hình ảnh xuống để nói .. 201MB và vẫn có thể gắn kết hệ thống tệp không? Thật không may, tôi đã không tìm thấy điều này là trường hợp.

Tôi nhớ lại trong quá khứ đã sử dụng môi trường xây dựng từ Freescale đã sử dụng để tạo hình ảnh 30Mb, sẽ có các phân vùng để sử dụng toàn bộ sdcard 4GB. Thật không may, tại thời điểm này, tôi không thể tìm thấy cách họ đang làm điều đó.

Tôi đã đọc định dạng trên đĩa cho hệ thống tệp ext và nếu không có dữ liệu trong bất kỳ khối nào qua siêu khối đầu tiên (ngoại trừ các siêu khối dự phòng và các bảng khối không sử dụng) tôi nghĩ rằng tôi có thể cắt bớt ở đó.

Thật không may, khi tôi làm điều này, hệ thống lắp đặt bị hỏng. Sau đó tôi có thể chạy FSCK, khôi phục các siêu khối và chặn các bảng và có thể gắn kết nó sau đó không có vấn đề gì. Tôi chỉ không nghĩ rằng điều đó là cần thiết.

Có lẽ một hệ thống tập tin khác nhau có thể làm việc? Có ý kiến ​​gì không?

cảm ơn,

biên tập

thay đổi phân vùng để đọc hệ thống tập tin. Phân vùng vẫn ở đó và không thay đổi, nhưng hệ thống tệp đang bị phá hủy sau khi cắt bớt hình ảnh.

biên tập

Tôi đã phát hiện ra trường hợp là khi tôi cắt tệp với kích thước chỉ lớn hơn bộ siêu khối phân vùng 'Dữ liệu' đầu tiên và bảng inode / khối, (Một nơi nào đó trong phạm vi khối dữ liệu), hệ thống tệp sẽ không thể thực hiện được. một fsck để khôi phục phần còn lại của các siêu khối và bảng khối / inode


Tôi không hiểu tiêu đề. Tôi nghĩ rằng nó nên đọc Làm thế nào để tôi thu nhỏ một hệ thống tệp và phân vùng.
ctrl-alt-delor

Bạn có phiền khi làm rõ khi bạn nói ... * Tôi chưa thấy đây là trường hợp ... * Bạn đã phát hiện ra trường hợp nào? Và có lẽ bạn nên ngừng sử dụng parted- chương trình đó không phải là về các bảng phân vùng, mà là về một số hỗn hợp kỳ lạ của các bảng phân vùng + hệ thống tệp. Nói chung, cố gắng kết hợp cả hai là juju xấu - bảng phân vùng và hệ thống tệp tồn tại hoàn toàn độc lập với nhau.
mikeerv 16/07/2015

Bạn có muốn tạo hình ảnh này với dung lượng 800 MB, vì vậy bạn có thể sao chép vào thẻ sd. Nhưng không muốn lãng phí không gian khi lưu trữ hình ảnh.
ctrl-alt-delor 16/07/2015

Bảng phân vùng nằm ở đầu đĩa - không phải nơi nào khác. Bạn có thể lấy bảng phân vùng với wipefsddbạn chỉ có thể tartăng dữ liệu fs hoặc bất cứ thứ gì và giải nén khi tạo hình ảnh.
mikeerv 16/07/2015

@richard Tôi không tìm cách thu nhỏ hệ thống tập tin. chỉ là hình ảnh của nó. Tôi muốn nó vẫn giữ nguyên kích thước thực tế, nhưng vì không có gì trong 800 meg của nó, nên không có lý do gì để chuyển thêm 800 MB
AllenKll 16/07/2015

Câu trả lời:


4

Đầu tiên, việc ghi một hình ảnh thưa thớt vào một đĩa sẽ không dẫn đến bất cứ điều gì ngoài toàn bộ kích thước của tệp hình ảnh đó - các lỗ hổng và tất cả - bao trùm lên đĩa. Điều này là do việc xử lý các tập tin thưa thớt là chất lượng của hệ thống tập tin - và một thiết bị thô (chẳng hạn như một mà bạn viết hình ảnh) không có điều như vậy chưa . Một tệp thưa có thể được lưu trữ an toàn và bảo mật trên một phương tiện được kiểm soát bởi một hệ thống tệp hiểu các tệp thưa (chẳng hạn như thiết bị ext4) nhưng ngay khi bạn viết nó ra, nó sẽ bao trùm tất cả những gì bạn dự định. Và vì vậy, những gì bạn nên làm là:

  1. Đơn giản chỉ cần lưu trữ nó trên một fs hiểu các tệp thưa thớt cho đến khi bạn chuẩn bị viết nó.

  2. Làm cho nó sâu hai lớp ...

    • Có nghĩa là, viết ra hình ảnh chính của bạn vào một tệp, tạo một hình ảnh gốc khác với một fs hiểu các tệp thưa thớt, sau đó sao chép hình ảnh của bạn vào hình ảnh gốc và ...

    • Khi đến lúc viết hình ảnh, đầu tiên hãy viết hình ảnh cha mẹ của bạn, sau đó viết hình ảnh chính của bạn.

Đây là cách làm 2:

  • Tạo một tệp thưa 1GB ...

    dd bs=1kx1k seek=1k of=img </dev/null
  • Viết hai ext4phân vùng vào bảng phân vùng của nó: 1 200MB, 2 800 MB ...

    printf '%b\n\n\n\n' n '+200M\nn\n' 'w\n\c' | fdisk img
  • Tạo hai ext4hệ thống tập tin trên một -Pthiết bị lặp có khớp nối và đặt một bản sao thứ hai vào ...

    sudo sh -c '
        for p in "$(losetup --show -Pf img)p"*        ### the for loop will iterate
        do    mkfs.ext4 "$p"                          ### over fdisks two partitions
              mkdir -p ./mnt/"${p##*/}"               ### and mkfs, then mount each
              mount "$p" ./mnt/"${p##*/}"             ### on dirs created for them
        done; sync; cd ./mnt/*/                       ### next we cp a sparse image
        cp --sparse=always "$p" ./part2               ### of part2 onto part1
        dd bs=1kx1k count=175 </dev/zero >./zero_fill ### fill out part1 w/ zeroes
        sync; cd ..; ls -Rhls .                       ### sync, and list contents
        umount */; losetup -d "${p%p*}"               ### last umount, destroy
        rm -rf loop*p[12]/ '                          ### loop devs and mount dirs
    

    mke2fs 1.42.12 (29-Aug-2014)
    Discarding device blocks: done
    Creating filesystem with 204800 1k blocks and 51200 inodes
    Filesystem UUID: 2f8ae02f-4422-4456-9a8b-8056a40fab32
    Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    mke2fs 1.42.12 (29-Aug-2014)
    Discarding device blocks: done
    Creating filesystem with 210688 4k blocks and 52752 inodes
    Filesystem UUID: fa14171c-f591-4067-a39a-e5d0dac1b806
    Superblock backups stored on blocks:
        32768, 98304, 163840
    
    Allocating group tables: done
    Writing inode tables: done
    Creating journal (4096 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    175+0 records in
    175+0 records out
    183500800 bytes (184 MB) copied, 0.365576 s, 502 MB/s
    ./:
    total 1.0K
    1.0K drwxr-xr-x 3 root root 1.0K Jul 16 20:49 loop0p1
       0 drwxr-xr-x 2 root root   40 Jul 16 20:42 loop0p2
    
    ./loop0p1:
    total 176M
     12K drwx------ 2 root root  12K Jul 16 20:49 lost+found
     79K -rw-r----- 1 root root 823M Jul 16 20:49 part2
    176M -rw-r--r-- 1 root root 175M Jul 16 20:49 zero_fill
    
    ./loop0p1/lost+found:
    total 0
    
    ./loop0p2:
    total 0
    
  • Bây giờ đó là rất nhiều đầu ra - chủ yếu là từ mkfs.ext4- nhưng đặc biệt chú ý các lsbit ở phía dưới. ls -ssẽ hiển thị -size thực tế của một tệp trên đĩa - và nó luôn được hiển thị trong cột đầu tiên.

  • Bây giờ về cơ bản chúng ta có thể giảm hình ảnh của mình xuống chỉ phân vùng đầu tiên ...

    fdisk -l img

    Disk img: 1 GiB, 1073741824 bytes, 2097152 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: 0xc455ed35
    
    Device Boot  Start     End Sectors  Size Id Type
    img1          2048  411647  409600  200M 83 Linux
    img2        411648 2097151 1685504  823M 83 Linux
    
  • Ở đó fdiskcho chúng ta biết có 411647 +1 512 byte trong phân vùng đầu tiên của img...

    dd seek=411648 of=img </dev/null
  • Điều đó cắt imgtập tin thành phân vùng đầu tiên của nó. Xem?

    ls -hls img

    181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 21:37 img
    
  • ... nhưng chúng ta vẫn có thể gắn kết phân vùng đó ...

    sudo mount "$(sudo losetup -Pf --show img)p"*1 ./mnt
  • ... và đây là nội dung của nó ...

    ls -hls ./mnt

    total 176M
     12K drwx------ 2 root root  12K Jul 16 21:34 lost+found
     79K -rw-r----- 1 root root 823M Jul 16 21:34 part2
    176M -rw-r--r-- 1 root root 175M Jul 16 21:34 zero_fill
    
  • chúng ta có thể nối hình ảnh được lưu trữ của phân vùng thứ hai vào ...

    sudo sh -c '
        dd seek=411648 if=./mnt/part2 of=img
        umount ./mnt; losetup -D
        mount "$(losetup -Pf --show img)p"*2 ./mnt
        ls ./mnt; umount ./mnt; losetup -D'
    

    1685504+0 records in
    1685504+0 records out
    862978048 bytes (863 MB) copied, 1.96805 s, 438 MB/s
    lost+found
    
  • Bây giờ đã phát triển imgtệp của chúng tôi : nó không còn thưa thớt ...

    ls -hls img

    1004M -rw-r--r-- 1 mikeserv mikeserv 1.0G Jul 16 21:58 img
  • ... nhưng loại bỏ nó đơn giản như lần thứ hai như lần đầu tiên, dĩ nhiên ...

    dd seek=411648 of=img </dev/null
    ls -hls img
    

    181M -rw-r--r-- 1 mikeserv mikeserv 201M Jul 16 22:01 img
    

Tôi đã phải đọc bốn lần này để hiểu đầy đủ những gì bạn đã trình bày. và tôi nghĩ rằng nó tuyệt vời, và tài liệu tốt. Vì đây sẽ là một hình ảnh trên thiết bị, tôi có thể kiểm tra tập lệnh khởi động để xem có phân vùng được định dạng thứ hai hay không, trong trường hợp khởi động lần đầu, câu trả lời là không, vì vậy Nó sẽ trích xuất phân vùng. Trong trường hợp nâng cấp, bạn nên để nó một mình ... và sau đó cũng có khả năng bổ sung buộc phải trích xuất trên hệ thống tệp Dữ liệu hiện có để đặt lại về mặc định của nhà sản xuất. Một lần nữa ... Rực rỡ!
AllenKll

1
Không chính xác những gì tôi đã yêu cầu nhưng nó chắc chắn giải quyết vấn đề tôi có ... vì vậy tôi đang đánh dấu vấn đề này đúng. Kudos cho bạn.
AllenKll

@ ALLenKll - Tôi hài lòng nó làm bạn hài lòng. Nếu bạn sẽ kết hợp điều này vào quy trình nâng cấp tự động, hãy xem xét tối ưu hóa một chút ddkích thước khối. Khi thực hiện việc cắt ngắn, điều đó không thành vấn đề - ddtìm kiếm ngay phần bù và cắt bớt tệp ngay tại đó. Nhưng khi thực hiện nối thêm, kích thước khối 512 byte sẽ khá chậm. Trên thực tế, có lẽ là cách nhanh nhất để làm điều đó là để cho phép ddđể seekvà cho phép catđể ghi. { dd if=/dev/null seek=411648; cat; } <part2 1<>/dev/mmcblk1hoặc một cái gì đó, nếu bạn có được sự trôi dạt của tôi.
mikeerv

6

Cách dễ nhất để làm điều này là tạo tệp sao lưu của bạn dưới dạng tệp thưa; nghĩa là tạo thành 1GB truncate -s 1G disk.imgthay vì dd if=/dev/zero bs=1048576 count=1024 of=disk.img(hoặc bất cứ thứ gì). Độc đáo, truncatecũng nhanh hơn nhiều.

Nếu bạn thực hiện ls -ltrên tệp, nó sẽ hiển thị dưới dạng 1GB, nhưng đó chỉ là kích thước rõ ràng. du disk.imgsẽ cho kích thước thực tế.

(Lưu ý, bạn sẽ cần phải có hình ảnh của mình trên một hệ thống tệp hỗ trợ các tệp thưa thớt. Tất cả những cái Unix thông thường đều làm được.

LƯU Ý: Các tệp thưa vẫn còn, về mặt logic, kích thước đầy đủ. Chỉ là những phần không bao giờ được viết không được lưu trữ trên đĩa. Đối với hầu hết các phần, phần không thực sự được lưu trữ bị ẩn khỏi các chương trình. Một vài tiện ích có hỗ trợ cho nó, mặc dù. (Ví dụ, dd conv=sparse, cp --sparse=auto/always, vv). Một thanh USB thực tế không thể thưa thớt. Và nếu bạn sử dụng dd conv=sparseđể viết nó, nó có thể sẽ nhanh hơn nhiều, nhưng bạn sẽ để lại bất kỳ dữ liệu nào ở đó trước đó, thay vì các khối đầy NUL (0x00) dự kiến. Nên hoạt động tốt (vì không gian trống của nó), nhưng sẽ để lại dữ liệu cũ trên thanh USB có thể là một vấn đề bảo mật.


1
@mikeerv yep, tôi nhận ra điều đó và thêm một ghi chú về nó. Bạn có thể đã thấy một phiên bản cũ hơn ...
derobert

Tôi đã làm một số thử nghiệm. và vâng du hiển thị nó với kích thước nhỏ hơn nhiều, nhưng DD vào thẻ vẫn hiển thị 1GB được sao chép và scp-ing sang một hệ thống khác hiển thị 1 Gig được sao chép. Tôi không chắc chắn những gì cắt ngắn thực sự làm nhưng trong khi nó có thể trông nhỏ hơn trên đĩa, bất kỳ việc sử dụng tệp nào cũng để nó ở kích thước ban đầu.
AllenKll 16/07/2015

@mikeerv bạn đúng, ý tôi là viết /dev/zerokhông null. Giáo sư! Sẽ sửa chữa.
derobert

Ồ, vâng, / dev / zero chắc chắn sẽ không làm một tập tin thưa thớt.
mikeerv

1
@DavidFavor - thời gian cần thiết là ngay lập tức với bất kỳ fallocate -l... img, truncate -s... img, dd seek=... of=img </dev/null, tất cả trong số đó là tương đương.
mikeerv

0

Bạn có muốn tạo hình ảnh này với dung lượng 800 MB, vì vậy bạn có thể sao chép vào thẻ sd. Nhưng không muốn lãng phí không gian khi lưu trữ hình ảnh. Nếu vậy tôi có thể đề nghị nén, chẳng hạn như bzip. Nó sẽ phụ thuộc vào các khối không sử dụng được khởi tạo về 0 mặc dù.


Có chủ yếu. Tôi đã thấy nó được thực hiện mà không cần nén, tôi chỉ muốn biết làm thế nào để làm điều đó. Ngoài ra để chuyển sang thẻ, để tiết kiệm thời gian. cũng như thực hiện nâng cấp từ xa. để tiết kiệm băng thông.
AllenKll 16/07/2015

-1

Hy vọng tôi hiểu đúng câu hỏi:

Để thu nhỏ một hệ thống tập tin và phân vùng. Sử dụng gparted.


Điều này sẽ thay đổi kích thước của phân vùng. Tôi không muốn điều đó. Tôi muốn phân vùng giữ nguyên kích thước. chỉ cần hình ảnh của phân vùng đó là nhỏ hơn. Thêm vào đó tôi cần một cách tự động để làm điều đó. Các công cụ GUI sẽ không hoạt động.
AllenKll 16/07/2015

Sau đó, chỉ cần bạn thu nhỏ hệ thống tệp (sử dụng gparted / parted). Nhưng tại sao chúng ta muốn hầu hết các phân vùng trống?
ctrl-alt-delor 16/07/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.