Jak utworzyć sformatowany plik obrazu partycji od zera?

16

Muszę stworzyć system plików z tylko jedną partycją z niczego ( /dev/zero). Próbowałem tej sekwencji poleceń:

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

Zasadniczo muszę utworzyć plik obrazu 64 MB wypełniony zerami. Następnie używam, fdiskaby dodać nową partycję dla nowego systemu plików (który ostatecznie powinien być FAT32), zaczynając od sektora 2048i używając wszystkich pozostałych sektorów.

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

Ale tutaj mam problemy. Jeśli skonfiguruję loopurządzenie i sformatuję je mkfs -t vfat, tablica partycji zostanie zastąpiona, a system plików (FAT32) zostanie umieszczony na dysku. Nie potrzebuję całego dysku sformatowanego za pomocą FAT32, potrzebuję tylko mojej partycji podstawowej.

Czy ktoś wie, jak sformatować tylko jedną partycję surowego obrazu dysku, a nie cały obraz?

użytkownik35443
źródło
Wyjaśnij, co masz na myśli, konfigurując urządzenie pętlowe i opublikuj całe mkfspołączenie. Musiałem przeczytać twój post 3 razy, aby zrozumieć twój problem. Chociaż nie mogę ci pomóc, interesuje mnie, dlaczego tworzysz plik obrazu (!), Ale nadal chcę pozostawić pierwsze n „sektorów” nieużywanych.
Bananguin,
Ok, zredagowałem to. Chcę pozostawić pierwsze n sektorów (co jest nie tak z sektorami?) Nieużywane, ponieważ muszę gdzieś umieścić moje programy ładujące.
user35443,
Crossposted
Michael Mrozek
@MichaelMrozek Istnieją rozważania, które dotyczą niektórych dystrybucji Linuksa, ale nie Ubuntu (ważne loopjest, czy jest to moduł, czy wbudowane w jądro), więc myślę, że przydatne jest, aby każda strona miała swoją wersję pytania i głosowałem za jej ponownym otwarciem.
Gilles „SO- przestań być zły”,
@MichaelMrozek Osobiście uważam, że AskUbuntu jest bardziej szczegółowe niż Unix i Linux, więc jeśli pytanie jest skierowane do obu, chyba że istnieją konkretne powody, aby je tutaj zamknąć, to pytanie na AskUbuntu powinno zostać zamknięte, jeśli były opublikowano blisko siebie, niezależnie od tego, gdzie opublikowano je jako „pierwsze” (prawdopodobnie z podaniem tutaj odpowiedzi na Ubuntu / inne niż Ubuntu). Tutaj ma zaakceptowaną odpowiedź, której nie ma w AskUbuntu, co zdecydowanie sprzyja utrzymaniu tego otwartego IMO. Nie mam przedstawiciela, który zagłosuje za zamknięciem AskUbuntu, ale głosuję za ponownym otwarciem pytania tutaj.
CVn

Odpowiedzi:

20

Jeśli w systemie Linux, podczas ładowania loopmodułu, upewnij się, że przekazujesz max_partopcję do modułu, aby urządzenia pętlowe mogły być partycjonowane.

Sprawdź aktualną wartość:

cat /sys/module/loop/parameters/max_part

Jeśli to 0:

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

Aby to ustawienie pozostało trwałe, dodaj następujący wiersz do /etc/modprobe.confpliku lub do pliku, /etc/modprobe.djeśli ten katalog istnieje w systemie:

options loop max_part=31

Jeśli się modprobe -r loopnie powiedzie, ponieważ „Pętla modułu jest wbudowana”, musisz dodać loop.max_part=31do linii poleceń jądra i zrestartować komputer. Jeśli twój bootloader to Grub2, dodaj do niego wartość GRUB_CMDLINE_LINUXin etc/default/grub.

Teraz możesz utworzyć partycjonowane urządzenie pętli:

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/

(pamiętaj, że potrzebujesz stosunkowo najnowszej wersji systemu Linux).

Stéphane Chazelas
źródło
FATAL: Pętla modułu jest wbudowana, czy można to rozwiązać instalując najnowszą wersję ubuntu (mam 12.04)?
user35443,
Jeśli jest wbudowany, po prostu nie trzeba go modprobe, przekazać loop.max_part=31do wiersza poleceń jądra
Alex
1
Ach, rozumiem, jeśli masz ostatnie jądro i zdałeś max_part, offset i sizelimit wcale nie są potrzebne
Alex
Hmm, linia poleceń jądra, dla mnie zbyt trudna. Wciąż dziękuję, zaakceptuj.
user35443,
Czy to loop.maxpart=31czy loop.max_part=31w wierszu poleceń jądra?
Cristian Ciupitu
4

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

Określone przesunięcie powinno być w bajtach (1048576 = 2048 sektorów * 512 bajtów na sektor).

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

Aby uzyskać więcej informacji, zobacz losetup i mount .

Alex
źródło
Hmm, offset, to powinno działać. A jeśli miałbym więcej partycji?
user35443,
Chyba jedna pętla = jedna partycja = jedno przesunięcie.
Alex,
uhm i czy istnieje opcja określenia również rozmiaru, więc mógłbym go ograniczyć i umieścić tam więcej partycji?
user35443,
Przepraszam za mój błąd w utworzeniu nowej odpowiedzi z częściowym rozwiązaniem, poprawna odpowiedź pochodzi z @ „Stephane Chazelas”, może on po prostu dodać opcje przesunięcia i sizelimit (następnie usunę moje)
Alex
Nie, niech tu będzie, bo moja +1 nie pójdzie nigdzie.
user35443,
2

Poniższe procedury umożliwiają zamontowanie partycji obrazu w celu ich modyfikacji.

opcja losetup 2.21 -P

losetup -P -f --show my.img

Tworzy jeden /dev/loopXpYna partycję.

Zaleta: plik wykonywalny preinstalowany w wielu dystrybucjach (pakiet util-linux).

Wada: całkiem nowa opcja, nieobecna w Ubuntu 14.04.

losetup -P automatyzacja

Stosowanie:

$ 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

Źródło:

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

Wynik:

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

gdzie loop0p1jest pierwsza partycja, dzięki czemu możemy:

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

Zaletą tej metody: działa na Ubuntu 14.04 bez ponownego uruchamiania.

Ciro Santilli
źródło