SD karta yazmadan önce bir görüntü dosyası nasıl yeniden boyutlandırılır?


13

Farklı bir çekirdeğe (CAN desteği ile) ve Python 3.3 yüklü yeni bir Raspbian görüntüsü oluşturmaya çalışıyorum. Tüm bunları Raspberry Pi'de yapmak yerine, bilgisayarda yapmanın ilginç olacağını düşündüm ( bu talimatları izleyerek ). Ancak, görüntüyü monte edip gitmeye hazır hale geldiğimde, hızlı bir şekilde disk alanım tükendi. Bunun, görüntünün bir SD karta yazıldıktan sonra kullanıcının dosya sistemini yeniden boyutlandıracağı beklentisiyle sadece yeterince büyük olması için olduğunu düşünüyorum.

SD kartına yazmadan önce görüntüyü ve dosya sistemini yeniden boyutlandırmak mümkün mü, böylece yer kalmadan daha fazla özelleştirme yapabilir miyim?


Bu soru muhtemelen size yardımcı olacaktır.
Jivings

1
@Jivings: Bu yanıtların tümü , SD karta yazıldıktan sonra görüntünün nasıl yeniden boyutlandırılacağını açıklar . Bunu nasıl yapacağımı biliyorum; SD karta yazmadan önce görüntüyü nasıl yeniden boyutlandıracağımı merak ediyorum .
DrAl

Yanıtlar:


8

Ham görüntü dosyasını nasıl yeniden boyutlandırabilirsiniz. Kulağa aptalca basit geldiğini biliyorum, ama işe yarayacak.

Orijinali genişletmek istediğiniz boyutta boş bir görüntü oluşturun (örneğimde 5GB kullanıyorum);

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

Orijinal görüntüye ekleyin:

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

Diskin sonunda bulunan dosya sistemini yeniden boyutlandırın (genellikle daha büyük olmasını istediğiniz dosyadır):

resize2fs -f /path/to/rasperrypi.img

Bitti! Diskiniz şimdi 5GB daha büyük olmalı!


Kulağa mükemmel geliyor, teşekkürler: Bu gece test edeceğim.
DrAl

5
Ben sadece denedim ve resize2fs aşamasına (dosyaya 1GB ekledikten sonra) aldığımda, "2012-12-16-wheezy-raspbian.img açmaya çalışırken süper blokta kötü sihirli numara alıyorum" t geçerli bir dosya sistemi süper bloğu bul. " Ne yaptığım konusunda herhangi bir öneriniz var mı?
DrAl

Bana, bölüm (/ dev / sda2 eşdeğeri) yerine tüm görüntüyü (/ dev / sda eşdeğeri) yeniden boyutlandırmaya çalıştığım bir sorun gibi görünüyor. Ancak, yanılmış olabilirim ve başarılı olamadan birkaç şey denedim (bölümün fdisk ile yeniden boyutlandırılması gibi, işe yarıyor ama dosya sistemini yeniden boyutlandırmama yardımcı olmuyor).
DrAl

3
Tamam, son bitin cevabını biraz googling ile buldum: Resimdeki bölüme işaret eden bir döngü cihazı oluşturmam gerekiyordu. Bunu ikinci bölümün başlangıç ​​sektörünü fdisk -l file.img(122880 idi) ve daha sonra alarak yaptım losetup --offset $((122880 * 512)) /dev/loop0 file.img. Sonra kullanabilirsiniz resize2fsüzerinde /dev/loop0ve ile çeki düzen losetup -d /dev/loop0. Cevabınızı bunu içerecek şekilde güncellerseniz, kabul edilen cevap olarak işaretlerim. Beni doğru yöne yönlendirdiğiniz için teşekkürler.
DrAl

1
Hey @DrAl, ben kullanarak çözüm çalıştı resize2fsüzerinde /dev/loop0ama süperblok boyutu ve bölüm boyutu uyuşmuyor diyerek açılışta çekirdek panik elde ediyorsun: The filesystem size (according to the superblock) is 483840 blocks The physical size of the device is 458240 blocksEğer böyle bir şey rastlamak mı mı?
GuySoft

4

Bu, yukarıdaki ve benim için çalışan başka yerlerin cevaplarının bir sentezidir - bir hata yapmanız durumunda resminizi yedekleyin:

Öncelikle resim dosyasını büyütün (burada sonuna 1GB ekliyoruz):

truncate -s +1G ./image.img

Daha sonra, bölüm tablosuna poke yapabilmemiz için görüntünün tamamını bir döngü cihazı olarak eşleyin

sudo losetup /dev/loop0 ./image.img

Gelecekte başvurmak için onu dökelim:

sudo fdisk -l /dev/loop0

Çıktı şöyle görünür:

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

Şimdi son bölümü silerek, ardından aynı başlangıç ​​konumunda, aynı türde ancak farklı bitiş konumunda yeniden oluşturacağız. Döngü0p2 (bölüm 2 - Linux bölümü) için "Başlat" sütununu not edin - daha sonra kullanacağız - 122880 burada.

sudo fdisk /dev/loop0

Aşağıdakileri girin - girmeleri güvenlidir - aşağıdaki açıklamamı okuyana kadar kalıcı bir şey olmaz:

  1. p
  2. d
  3. 2
  4. n
  5. p
  6. 2
  7. 122880
  8. varsayılanı kabul etmek için enter tuşuna basmanız yeterlidir
  9. p

Adım 1 - Geçerli tabloyu yazdırın. Adım 2-3 - bölüm 2'yi silin, Adım 4-8 - bölüm 2'yi yeni bitiş noktasıyla yeniden oluşturun (varsayılan görüntü sonu), Adım 9 - yeni tabloyu yazdırın.

Yeni yazdırılan tablonuzun, bitiş değeri ve Bloklar değeri (yani boyut değişti) hariç, orijinal tablo ile aynı olduğunu varsayarsak, işlemeye hazırsınız.

wDeğişikliğinizi yapmak için girin , ardından qçıkmak için girin .

Bu geri döngü cihazını silebilirsiniz, ikinci bölüm için başka bir tane yapacağız. Yukarıda not ettiğiniz ve kullandığınız başlangıç ​​ofsetini hatırlayın - tekrar kullanacağız:

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

Bu, /dev/loop0yalnızca 2. bölüme işaret etme konusunda yeni bir eşleme oluşturacaktır - referans 512 için ilk fdiskçıktıda görebileceğiniz sektör boyutu söz konusudur .

Şimdi boş alanı doldurmak için bölümü yeniden boyutlandırın:

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

Tamamlandı - şimdi temizleyin:

sudo losetup -d /dev/loop0

teşekkürler ... yukarıdaki talimatlar benim için işe yaramadı ama bu işe yaradı. Bölümleme tablosunu yazarken bazı uyarılar aldım: `` Komut (yardım için m): w Bölümleme tablosu değiştirildi. Bölüm tablosunu yeniden okumak için ioctl () çağrılıyor. Bölüm tablosunu yeniden okuma başarısız oldu.: Geçersiz argüman Çekirdek hala eski tabloyu kullanır. Yeni tablo bir sonraki yeniden başlatmada veya partprobe (8) veya kpartx (8) çalıştırıldıktan sonra kullanılacaktır. `` Sadece görmezden geldim ve bu iyiydi.
StFS

Mükemmel! Doğru cevabı veren tek kişi sensin! Teşekkürler.
yushulx

3

Oracle VM VirtualBox'ı çalıştıranlar için oldukça kolaydır.

Bir Windows makinesinde işler aşağıdaki gibidir:

input.imgburada boyutun küçültülmesi gereken output.imggörüntü ve son görüntü - bu örnekte 7000 MB büyük olarak tanımlanmıştır.

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

Umarım bu biraz yardımcı olur.


Bu çözüm için teşekkürler, çok kurnaz. Ücretsiz ve Windows'da mükemmel çalışan bulabildiğim tek kişi bu. 16GB kartlarla aynı boyutta olmayan ve resmimi yeniden boyutlandırmak için gereken bazı sorunlar yaşadım.
Josh

Çekirdek panik hatası aldım. Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(179,2)
JPX

Bunun görüntüyü kısalttığına dikkat edin - 7000MB işaretinden sonra veri kaybedersiniz - komutlar uyarılmaz veya şikayet etmez.
17'de Mike Redrobe

2

Ham görüntü dosyasını nasıl yeniden boyutlandırabilirsiniz. Kulağa aptalca basit geldiğini biliyorum, ama işe yarayacak.

Orijinali genişletmek istediğiniz boyutta boş bir görüntü oluşturun (örneğimde 5GB kullanıyorum);

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

Orijinal görüntüye ekleyin:

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

Sonraki bölüm ve dosya sistemini yeniden boyutlandırmak. İlk olarak, bölümün ofsetini alın;

fdisk -l /path/to/rpi.img

Bunun gibi bir tablodaki sonuçlar:

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

İkinci bölümün başlangıç ​​ofsetine dikkat edin

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

Son olarak bağlantısını kes / dev / loop

losetup -d /dev/loop0

Bitti! Diskiniz şimdi 5GB daha büyük olmalı!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.