Bagaimana cara membuat file gambar partisi yang diformat dari awal?

16

Saya perlu membuat filesystem hanya dengan satu partisi dari nothing ( /dev/zero). Saya mencoba urutan perintah ini:

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

Pada dasarnya, saya perlu membuat file gambar 64MB diisi dengan nol. Kemudian saya gunakan fdiskuntuk menambahkan partisi baru untuk sistem file baru (yang akhirnya harus menjadi FAT32), mulai dari sektor 2048dan menggunakan semua sektor yang tersisa.

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

Tapi di sini saya memukul masalah. Jika saya mengatur loopperangkat dan memformatnya menggunakan mkfs -t vfat, tabel partisi ditimpa dan filesystem (FAT32) ditempatkan ke disk. Saya tidak perlu seluruh disk diformat dengan FAT32, saya hanya perlu partisi primer saya jadi.

Adakah yang tahu bagaimana saya bisa memformat hanya satu partisi gambar disk mentah, bukan seluruh gambar?

pengguna35443
sumber
Harap jelaskan apa yang Anda maksud dengan mengatur perangkat putaran dan memposting seluruh mkfspanggilan Anda. Saya harus membaca posting Anda 3 kali untuk memahami masalah Anda. Meskipun saya tidak dapat membantu Anda, saya tertarik mengapa Anda membuat file gambar (!) Tetapi masih ingin meninggalkan "sektor" pertama yang tidak digunakan.
Bananguin
Oke, sudah diedit. Saya ingin meninggalkan n sektor pertama (apa yang salah dengan sektor?) Tidak digunakan, karena saya harus meletakkan bootloader di suatu tempat.
user35443
Crossposted
Michael Mrozek
@MichaelMrozek Ada pertimbangan yang berlaku untuk beberapa distribusi Linux tetapi tidak untuk Ubuntu (itu penting apakah loopitu modul atau dibangun ke dalam kernel), jadi saya pikir ini berguna untuk setiap situs untuk memiliki versi pertanyaannya dan saya memilih untuk membuka kembali.
Gilles 'SO- stop being evil'
@MichaelMrozek Secara pribadi, saya merasa AskUbuntu lebih spesifik daripada Unix & Linux, jadi jika sebuah pertanyaan di-posting silang ke keduanya, kecuali ada alasan khusus untuk menutup di sini, itu adalah pada AskUbuntu yang harus ditutup sebagai cross-post jika mereka diposting berdekatan dalam waktu satu sama lain, terlepas dari mana itu diposting "pertama" (mungkin dengan menyebutkan jawaban Ubuntu / non-Ubuntu di sini). Di sini ia memiliki jawaban yang diterima, yang tidak ada pada AskUbuntu, yang sangat membantu menjaga IMO terbuka ini. Saya tidak memiliki perwakilan untuk memilih untuk menutup di AskUbuntu tetapi saya memberikan suara untuk membuka kembali pertanyaan di sini.
CVn

Jawaban:

20

Jika di Linux, saat memuat loopmodul, pastikan Anda meneruskan max_partopsi ke modul sehingga perangkat loop dapat dipartisi.

Periksa nilai saat ini:

cat /sys/module/loop/parameters/max_part

Jika 0:

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

Untuk membuat pengaturan ini tetap ada, tambahkan baris berikut ke /etc/modprobe.confatau ke file /etc/modprobe.djika direktori itu ada di sistem Anda:

options loop max_part=31

Jika modprobe -r loopgagal karena “Modul loop dibangun”, Anda harus menambahkan loop.max_part=31ke baris perintah kernel dan reboot. Jika bootloader Anda adalah Grub2, tambahkan ke nilai GRUB_CMDLINE_LINUXin etc/default/grub.

Sekarang, Anda dapat membuat perangkat loop dipartisi:

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/

(perhatikan bahwa Anda memerlukan versi Linux yang relatif baru).

Stéphane Chazelas
sumber
FATAL: Modul loop dibangun, dapatkah ini diselesaikan menginstal versi terbaru dari Ubuntu (Saya punya 12,04)?
user35443
Jika builtin tidak diperlukan untuk melakukan modprobe, operasikan loop.max_part=31ke baris perintah kernel
Alex
1
Ah saya mengerti, jika Anda memiliki kernel baru dan Anda memberikan max_part, offset dan sizelimit tidak diperlukan sama sekali
Alex
Hmm, baris perintah kernel, terlalu sulit bagi saya. Masih terima kasih, terima.
user35443
Apakah itu loop.maxpart=31atau loop.max_part=31pada baris perintah kernel?
Cristian Ciupitu
4

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

Offset yang ditentukan harus dalam byte (1048576 = 2048 sektor * 512 byte per sektor).

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

Untuk informasi lebih lanjut, lihat losetup dan mount .

Alex
sumber
Hmm, offset, ini harusnya berfungsi. Dan bagaimana jika saya memiliki lebih banyak partisi?
user35443
Saya kira satu loop = satu partisi = satu offset.
Alex
uhm, dan apakah ada opsi untuk menentukan juga ukurannya, jadi saya bisa membatasi dan menempatkan lebih banyak partisi di sana?
user35443
Maaf kesalahan saya untuk membuat jawaban baru dengan solusi parsial, jawaban yang tepat adalah dari @ "Stephane Chazelas", dia bisa menambahkan opsi offset dan sizelimit (maka saya akan menghapus milik saya)
Alex
Jangan biarkan itu ada di sini, atau +1 saya akan kemana-mana.
user35443
2

Prosedur berikut memungkinkan Anda untuk memasang partisi gambar untuk memodifikasinya.

losetup 2.21 -P opsi

losetup -P -f --show my.img

Membuat satu /dev/loopXpYper partisi.

Keuntungan: executable pra-instal di banyak distro (paket util-linux).

Kerugian: opsi yang sangat baru, tidak ada di Ubuntu 14.04.

losetup -P otomatisasi

Pemakaian:

$ 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

Sumber:

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

Keluaran:

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

di mana loop0p1partisi pertama, jadi kita bisa melakukan:

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

Keuntungan dari metode ini: bekerja di Ubuntu 14.04 tanpa me-reboot.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber