Bagaimana mengubah ukuran file gambar sebelum menulis ke kartu SD?

13

Saya sudah mencoba membuat gambar Raspbian baru dengan kernel yang berbeda (dengan dukungan CAN) dan dengan Python 3.3 diinstal. Daripada melakukan semua ini pada Raspberry Pi, saya pikir akan menarik untuk melakukannya di komputer sebagai gantinya (mengikuti instruksi ini ). Namun, begitu saya sudah memasang gambar dan siap untuk pergi, saya dengan cepat kehabisan ruang disk. Saya kira ini adalah karena gambar berukuran hanya cukup besar dengan harapan bahwa pengguna akan mengubah ukuran sistem file setelah itu telah ditulis ke kartu SD.

Apakah mungkin untuk mengubah ukuran gambar dan sistem file sebelum menulisnya ke kartu SD sehingga saya dapat melakukan lebih banyak penyesuaian tanpa kehabisan ruang?

DrAl
sumber
Pertanyaan ini mungkin akan membantu Anda.
Jivings
1
@Jivings: semua jawaban ini menjelaskan cara mengubah ukuran gambar setelah ditulis ke kartu SD. Saya tahu bagaimana melakukannya; Saya tertarik pada cara mengubah ukuran gambar sebelum menulisnya ke kartu SD.
DrAl

Jawaban:

7

Ini adalah cara mengubah ukuran file gambar mentah. Saya tahu itu terdengar sangat sederhana, tetapi itu akan berhasil.

Buat gambar kosong, dari ukuran yang Anda ingin memperluas aslinya (dalam contoh saya, saya menggunakan 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Tambahkan ini ke gambar asli:

cat /path/to/temp_image >> /path/to/rasperrypi.img

Ubah ukuran sistem file yang hidup di akhir disk (biasanya ini yang Anda inginkan lebih besar):

resize2fs -f /path/to/rasperrypi.img

Selesai! Disk Anda sekarang harus lebih besar 5GB!

Jivings
sumber
Kedengarannya sempurna, terima kasih: Saya akan menguji ini malam ini.
DrAl
5
Saya baru saja mencoba ini dan ketika saya sampai ke tahap resize2fs (setelah menambahkan 1GB ke file), saya mendapatkan "Angka ajaib buruk di super-blok ketika mencoba untuk membuka 2012-12-16-wheezy-raspbian.img Couldn ' t menemukan superblock sistem file yang valid. " Ada saran untuk apa yang saya lakukan salah?
DrAl
Bagi saya sepertinya ini adalah masalah dengan fakta saya mencoba mengubah ukuran2fs seluruh gambar (setara dengan / dev / sda) daripada partisi (setara dengan / dev / sda2). Namun, saya bisa saja salah dan saya sudah mencoba beberapa hal lain tanpa hasil (seperti mengubah ukuran partisi dengan fdisk, yang sepertinya berfungsi tetapi tidak membantu saya mengubah ukuran sistem file).
DrAl
3
Oke, saya telah menemukan jawaban untuk bit terakhir dengan sedikit googling: Saya perlu membuat perangkat loop yang menunjuk ke partisi di dalam gambar. Saya melakukan ini dengan mendapatkan sektor awal dari partisi kedua dari fdisk -l file.img(itu 122880) dan kemudian losetup --offset $((122880 * 512)) /dev/loop0 file.img. Saya kemudian bisa menggunakan resize2fspada /dev/loop0dan merapikan dengan losetup -d /dev/loop0. Jika Anda memperbarui jawaban Anda untuk memasukkan ini, saya akan menandainya sebagai jawaban yang diterima. Terima kasih telah menunjukkan saya ke arah yang benar.
DrAl
1
@DrAl Hei, aku mencoba solusi Anda menggunakan resize2fspada /dev/loop0tetapi mendapat saya mendapatkan kernel panik saat boot mengatakan ukuran superblok dan ukuran partisi tidak cocok: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksMemiliki Anda menemukan sesuatu seperti ini?
GuySoft
4

Ini adalah sintesis dari jawaban di atas dan di tempat lain yang berfungsi untuk saya - buat cadangan gambar Anda jika Anda melakukan kesalahan:

Pertama-tama buat file gambar lebih besar (di sini kami menambahkan 1GB sampai akhir):

truncate -s +1G ./image.img

Selanjutnya memetakan seluruh gambar sebagai perangkat loop sehingga kita dapat menyodok di tabel partisi

sudo losetup /dev/loop0 ./image.img

Untuk referensi di masa mendatang mari kita buang:

sudo fdisk -l /dev/loop0

Outputnya seperti:

Disk /dev/loop0: 2962 MB, 2962227200 bytes
255 heads, 63 sectors/track, 360 cylinders, total 5785600 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 identifier: 0x000c4661

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/loop0p2          122880     5785599     2831360   83  Linux

Sekarang kita akan membuat ulang partisi terakhir dengan menghapusnya, lalu membuatnya kembali di lokasi awal yang sama, jenis yang sama tetapi lokasi akhir yang berbeda. Jadi catat kolom "Start" untuk loop0p2 (partisi 2 - partisi Linux) - kita akan menggunakannya nanti - 122880 di sini.

sudo fdisk /dev/loop0

Masukkan yang berikut ini - mereka aman untuk masuk - tidak ada yang permanen terjadi sampai Anda telah membaca penjelasan saya yang berikut:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. tekan saja enter untuk menerima default
  9. p

Langkah 1 - cetak tabel saat ini. Langkah 2-3 - hapus partisi 2, Langkah 4-8 - buat ulang partisi 2 dengan titik akhir baru (standarnya adalah akhir gambar), Langkah 9 - cetak tabel baru.

Dengan asumsi tabel Anda yang baru dicetak identik dengan tabel asli kecuali untuk nilai Akhir dan nilai Blok (yaitu ukurannya telah berubah) Anda siap untuk melakukan.

Masukkan wuntuk melakukan perubahan Anda, lalu masukkan quntuk keluar.

Anda dapat menghapus perangkat loopback itu, kami akan membuat yang lain untuk partisi kedua. Ingat offset awal yang Anda catat dan gunakan di atas - kami akan menggunakannya lagi:

sudo losetup -d /dev/loop0     # delete the old loop setup
sudo losetup -o $((122880*512)) /dev/loop0 ./image.img

Itu akan membuat pemetaan baru pada /dev/loop0menunjuk hanya pada partisi 2 - untuk referensi 512 adalah ukuran sektor yang dapat Anda lihat di fdiskoutput pertama .

Sekarang ubah ukuran partisi untuk mengisi ruang yang tersedia:

sudo e2fsck -f /dev/loop0
sudo resize2fs /dev/loop0

Selesai - sekarang bersihkan:

sudo losetup -d /dev/loop0
Greg
sumber
terima kasih ... petunjuk di atas tidak bekerja untuk saya tetapi ini berhasil. Saya memang mendapatkan peringatan ketika menulis tabel partisi: `` `Command (m for help): w Tabel partisi telah diubah. Memanggil ioctl () untuk membaca kembali tabel partisi. Membaca ulang tabel partisi gagal .: Argumen tidak valid Kernel masih menggunakan tabel lama. Tabel baru akan digunakan pada reboot berikutnya atau setelah Anda menjalankan partprobe (8) atau kpartx (8). “Saya hanya mengabaikannya dan itu baik-baik saja.
StFS
Luar biasa! Anda adalah satu-satunya yang membuat jawaban yang benar! Terima kasih.
yushulx
3

Bagi yang menjalankan Oracle VM VirtualBox itu cukup mudah.

Pada mesin Windows, semuanya berjalan sebagai berikut:

input.imgdi sini gambar yang ukurannya harus dikurangi dan output.imgmerupakan gambar akhir - dalam contoh ini didefinisikan sebagai 7000 MB besar.

ECHO "========================================================================="
ECHO "input.img => output.img"

ECHO "========================================================================="

DEL  input.vdi

DEL  output.vdi

DEL  output.img

ECHO "========================================================================="
"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw input.img input.vdi -format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" createhd --filename output.vdi --size 7000 --format VDI --variant Standard

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd input.vdi output.vdi --existing

ECHO =========================================================================
"C:\Program Files\Oracle\VirtualBox\VBoxManage" clonehd output.vdi output.img --format RAW

Semoga ini bisa membantu sedikit.

Markus
sumber
Terima kasih atas solusi ini, sangat licik. Ini satu-satunya yang saya dapat temukan yang gratis dan bekerja dengan sempurna di Windows. Saya memiliki beberapa masalah dengan kartu 16GB yang ukurannya tidak cukup sama dan perlu mengubah ukuran gambar saya.
Josh
Saya mendapatkan kesalahan panik kernel. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX
Catatan ini memotong gambar - Anda akan kehilangan data jika ada melewati 7000MB tanda - perintah tidak akan memperingatkan atau mengeluh.
Mike Redrobe
2

Ini adalah cara mengubah ukuran file gambar mentah. Saya tahu itu terdengar sangat sederhana, tetapi itu akan berhasil.

Buat gambar kosong, dari ukuran yang Anda ingin memperluas aslinya (dalam contoh saya, saya menggunakan 5GB);

dd if=/dev/zero of=/path/to/temp_image bs=1 count=1 seek=5G

Tambahkan ini ke gambar asli:

cat /path/to/temp_image >> /path/to/rpi.img

Selanjutnya adalah mengubah ukuran partisi dan sistem file. Pertama, dapatkan offset partisi;

fdisk -l /path/to/rpi.img

Hasil dalam tabel seperti ini:

Device    Boot   Start      End   Sectors   Size  Id  Type
rpi.img1          8192   122879    114688    56M   c  W95 FAT32 (LBA)
rpi.img2       1122880  8447999   8325120     4G  83  Linux

Perhatikan offset mulai dari partisi kedua

losetup --offset $((122880 * 512)) /dev/loop0 /path/to/rpi.img
e2fsck -f /dev/loop0
resize2fs -f /dev/loop0

Terakhir unmount / dev / loop

losetup -d /dev/loop0

Selesai! Disk Anda sekarang harus lebih besar 5GB!

Jonas Stumph Stevnsvig
sumber