Sıfırdan biçimlendirilmiş bir bölüm görüntü dosyası nasıl oluşturulur?


16

Hiçbir şey ( /dev/zero) sadece bir bölüm ile dosya sistemi oluşturmak gerekiyor . Bu komut dizisini denedim:

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

Temel olarak, sıfırlarla dolu 64MB görüntü dosyası oluşturmam gerekiyor. Daha sonra fdisksektörden başlayıp 2048kalan tüm sektörleri kullanarak yeni dosya sistemi (nihayet FAT32 olmalıdır) için yeni bir bölüm eklemek için kullanıyorum.

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

Ama burada sorunlara çarpıyorum. Bir loopaygıt kurar ve kullanarak biçimlendirirsem mkfs -t vfat, bölüm tablosunun üzerine yazılır ve dosya sistemi (FAT32) diske yerleştirilir. FAT32 ile biçimlendirilmiş tüm diske ihtiyacım yok, sadece birincil bölümüme ihtiyacım var.

Herkes tüm görüntüyü değil, ham disk görüntüsünün yalnızca bir bölümünü nasıl biçimlendirebileceğimi biliyor mu?


Lütfen bir döngü cihazı ayarlayarak ne demek istediğinizi açıklayın ve tüm mkfsçağrınızı gönderin . Sorununuzu anlamak için yayınınızı 3 kez okumak zorunda kaldım. Sana yardım edemesem de, neden bir görüntü dosyası (!) Oluşturduğuna dair bir fikrim var ama yine de ilk n "sektörü" kullanılmadan bırakmak istiyorum.
Bananguin

Tamam, düzenledi. Önyükleyicilerimi bir yere yerleştirmem gerektiğinden, ilk n sektörü (sektörlerde sorun nedir?) Kullanılmadan bırakmak istiyorum.
user35443


@MichaelMrozek Bazı Linux dağıtımları için geçerli olan ancak Ubuntu için geçerli olmayan ( loopmodül ya da çekirdeğe yerleştirilmiş olması önemli değil ) düşünceler var, bu yüzden her sitenin kendi sürümüne sahip olması yararlı olduğunu düşünüyorum ve yeniden açmaya oy verdim.
Gilles 'SO- kötü olmayı bırak'

@MichaelMrozek Şahsen, AskUbuntu'nun Unix ve Linux'tan daha spesifik olduğunu hissediyorum, bu yüzden bir soru her ikisine de çapraz gönderilirse, burada kapatmak için belirli nedenler yoksa, AskUbuntu'da çapraz gönderimli olarak kapatılması gereken sorundur "ilk" nerede yayınlandığına bakılmaksızın birbirine yakın zamanda yayınlanmıştır (muhtemelen burada Ubuntu / Ubuntu olmayan cevaplardan bahsederek). Burada, AskUbuntu'daki cevabın kabul etmediği, bu açık IMO'yu tutmayı güçlü bir şekilde destekleyen bir cevabı var. AskUbuntu'yu kapatmak için oy verecek temsilcim yok ama buradaki soruyu yeniden açmak için oy veriyorum.
CVn

Yanıtlar:


20

Linux'taysanız, loopmodülü yüklerken max_part, döngü aygıtlarının bölümlenebilir olması için modüle bir seçenek ilettiğinizden emin olun .

Mevcut değeri kontrol edin:

cat /sys/module/loop/parameters/max_part

0 ise:

modprobe -r loop # unload the module
modprobe loop max_part=31

Bu ayarı kalıcı yapmak için, sisteminizde bu dizin varsa /etc/modprobe.confbir dosyaya veya dosyasına aşağıdaki satırı ekleyin /etc/modprobe.d:

options loop max_part=31

Eğer modprobe -r loop“Modül döngü yerleşiğidir” çünkü başarısız, eklemek gerekir loop.max_part=31sizin çekirdek komut satırı ve yeniden başlatma için. Önyükleyiciniz Grub2 ise, değerini GRUB_CMDLINE_LINUXin değerine ekleyin etc/default/grub.

Şimdi, bölümlenebilir bir döngü cihazı oluşturabilirsiniz:

truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

(nispeten yeni bir Linux sürümüne ihtiyacınız olduğunu unutmayın).


FATAL: Modül döngüsü yerleşiktir, bu ubuntu'nun en son sürümünü yükleyerek çözülebilir mi (12.04 var)?
user35443

Modprobe için sadece gerekli değilse, loop.max_part=31çekirdek komut satırına geçin
Alex

1
Ah, son çekirdeğiniz varsa ve max_part'ı ofseti geçerseniz ve sizelimit'e hiç ihtiyaç duymazsanız
Alex

Hmm, çekirdek komut satırı, benim için çok zor. Hala teşekkürler, kabul et.
user35443

Öyle mi loop.maxpart=31yoksa loop.max_part=31çekirdek komut satırında?
Cristian Ciupitu

4

losetup /dev/loop0 file -o 1048576 --sizelimit limit

Belirtilen ofset bayt cinsinden olmalıdır (1048576 = 2048 sektör * sektör başına 512 bayt).

mount -o loop,offset=1048576,sizelimit=limit

Daha fazla bilgi için bkz. Losetup ve mount .


Hmm, ofset, bu işe yaramalı. Ya daha fazla bölümüm olsaydı?
user35443 18:13

Sanırım bir döngü = bir bölüm = bir ofset.
Alex

uhm, ve boyutu da belirtmek için bir seçenek var, bu yüzden onu sınırlayabilir ve daha fazla bölüm yerleştirebilir miyim?
user35443

Üzgünüm kısmi bir çözüm ile yeni bir cevap oluşturmak için benim hatam, doğru cevap @ "Stephane Chazelas" dan, o sadece ofset ve sizelimit seçenekleri ekleyebilir (o zaman benim silerim)
Alex

Burada olmasına izin yok, yoksa benimki +1 hiçbir yere gitmeyecek.
user35443

2

Aşağıdaki prosedürler, görüntünün bölümlerini değiştirmek için monte etmenizi sağlar.

losetup 2.21 -P seçeneği

losetup -P -f --show my.img

/dev/loopXpYBölüm başına bir tane oluşturur .

Avantajı: birçok dağıtımda önceden yüklenmiş yürütülebilir (util-linux paketi).

Dezavantaj: Oldukça yeni bir seçenek, Ubuntu 14.04'te mevcut değil.

losetup -P otomasyon

Kullanımı:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Kaynak:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Çıktı:

/dev/mapper/loop0
/dev/mapper/loop0p1

loop0p1ilk bölüm nerede , bu yüzden yapabiliriz:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Bu yöntemin avantajı: Ubuntu 14.04 üzerinde yeniden başlatmadan çalışır.

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.