Làm thế nào để tạo một tập tin hình ảnh phân vùng định dạng từ đầu?


16

Tôi cần tạo hệ thống tập tin chỉ với một phân vùng từ nothing ( /dev/zero). Tôi đã thử chuỗi lệnh này:

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

Về cơ bản, tôi cần tạo tệp hình ảnh 64 MB chứa đầy số không. Sau đó, tôi sử dụng fdiskđể thêm một phân vùng mới cho hệ thống tập tin mới (cuối cùng phải là FAT32), bắt đầu từ sector 2048và sử dụng tất cả các sector còn lại.

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

Nhưng ở đây tôi đang gặp vấn đề. Nếu tôi thiết lập một loopthiết bị và định dạng thiết bị bằng cách sử dụng mkfs -t vfat, bảng phân vùng sẽ bị ghi đè và hệ thống tệp (FAT32) được đặt vào đĩa. Tôi không cần toàn bộ đĩa được định dạng bằng FAT32, tôi chỉ cần phân vùng chính của mình là như vậy.

Có ai biết làm thế nào tôi chỉ có thể định dạng một phân vùng của hình ảnh đĩa thô, không phải toàn bộ hình ảnh?


Vui lòng làm rõ ý của bạn bằng cách thiết lập một thiết bị lặp và gửi toàn bộ mkfscuộc gọi của bạn . Tôi đã phải đọc bài viết của bạn 3 lần để hiểu vấn đề của bạn. Mặc dù tôi không thể giúp bạn, tôi vẫn xen vào lý do tại sao bạn tạo một tệp hình ảnh (!) Nhưng vẫn muốn để n "sector" đầu tiên không được sử dụng.
Bananguin

Ok, chỉnh sửa nó. Tôi muốn không sử dụng n sector đầu tiên (có vấn đề gì với các sector?), Vì tôi cần đặt bộ tải khởi động của mình ở đâu đó.
dùng35443


@MichaelMrozek Có những cân nhắc áp dụng cho một số bản phân phối Linux nhưng không phải Ubuntu (vấn đề looplà mô-đun hoặc được tích hợp vào kernel), vì vậy tôi nghĩ rằng mỗi trang web đều có phiên bản câu hỏi và tôi đã bỏ phiếu để mở lại.
Gilles 'SO- ngừng trở nên xấu xa'

@MichaelMrozek Cá nhân, tôi cảm thấy AskUbfox cụ thể hơn Unix & Linux, vì vậy nếu một câu hỏi được đăng chéo cho cả hai, trừ khi có những lý do cụ thể để đóng ở đây, đó là câu hỏi trên AskUb Ubuntu nên được đóng lại khi đăng chéo được đăng gần đúng lúc với nhau, bất kể nó được đăng ở đâu "đầu tiên" (có thể có đề cập đến câu trả lời của Ubuntu / không phải Ubuntu ở đây). Ở đây, nó có một câu trả lời được chấp nhận, mà câu trả lời trên AskUbfox không có, nó rất ủng hộ việc giữ IMO mở này. Tôi không có đại diện để bỏ phiếu để đóng trên AskUbfox nhưng đang bỏ phiếu để mở lại câu hỏi ở đây.
một CVn

Câu trả lời:


20

Nếu trên Linux, khi tải loopmô-đun, hãy đảm bảo bạn chuyển một max_parttùy chọn cho mô-đun để các thiết bị lặp có thể phân vùng được.

Kiểm tra giá trị hiện tại:

cat /sys/module/loop/parameters/max_part

Nếu là 0:

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

Để duy trì cài đặt này, hãy thêm dòng sau vào /etc/modprobe.confhoặc vào tệp /etc/modprobe.dnếu thư mục đó tồn tại trên hệ thống của bạn:

options loop max_part=31

Nếu modprobe -r loopthất bại vì vòng lặp Module Module được tích hợp sẵn, bạn sẽ cần thêm loop.max_part=31vào dòng lệnh kernel và khởi động lại. Nếu bootloader của bạn là grub2, thêm vào đó với giá trị của GRUB_CMDLINE_LINUXtrong etc/default/grub.

Bây giờ, bạn có thể tạo một thiết bị vòng lặp phân vùng:

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/

(lưu ý rằng bạn cần một phiên bản Linux tương đối gần đây).


FATAL: Vòng lặp mô-đun được tích hợp sẵn, điều này có thể được giải quyết khi cài đặt phiên bản mới nhất của Ubuntu (tôi có 12.04) không?
dùng35443

Nếu được xây dựng chỉ là không cần thiết để sửa đổi, hãy chuyển loop.max_part=31dòng lệnh kernel
Alex

1
À tôi hiểu rồi, nếu bạn là một hạt nhân gần đây và bạn vượt qua max_part thì phần bù và siz006it hoàn toàn không cần thiết
Alex

Hmm, dòng lệnh kernel, quá khó đối với tôi. Vẫn cảm ơn, chấp nhận.
dùng35443

Là nó loop.maxpart=31hoặc loop.max_part=31trên dòng lệnh kernel?
Cristian Ciupitu

4

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

Độ lệch được chỉ định phải bằng byte (1048576 = 2048 sector * 512 byte cho mỗi sector).

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

Để biết thêm thông tin, xem losetupmount .


Hmm, bù đắp, điều này sẽ làm việc. Và nếu tôi có nhiều phân vùng hơn thì sao?
dùng35443

Tôi đoán một vòng lặp = một phân vùng = một bù.
Alex

uhm, và có một tùy chọn để chỉ định kích thước, vì vậy tôi có thể giới hạn nó và đặt ở đó nhiều phân vùng hơn?
dùng35443

Xin lỗi, tôi đã tạo ra một câu trả lời mới với một giải pháp một phần, câu trả lời đúng là từ @ "Stephane Chazelas", anh ta chỉ có thể thêm các tùy chọn bù và siz006it (sau đó tôi sẽ xóa của tôi)
Alex

Không để nó ở đây, hoặc +1 của tôi sẽ không đi đến đâu.
dùng35443

2

Các quy trình sau đây cho phép bạn gắn các phân vùng của hình ảnh để sửa đổi chúng.

tùy chọn losetup 2.21 -P

losetup -P -f --show my.img

Tạo một /dev/loopXpYcho mỗi phân vùng.

Ưu điểm: thực thi được cài đặt sẵn trong nhiều bản phát hành (gói linux-linux).

Nhược điểm: tùy chọn khá gần đây, không có trong Ubuntu 14.04.

losetup -P tự động hóa

Sử dụng:

$ 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

Nguồn:

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

Đầu ra:

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

nơi loop0p1là phân vùng đầu tiên, vì vậy chúng tôi có thể làm:

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

Ưu điểm của phương pháp này: hoạt động trên Ubuntu 14.04 mà không cần khởi động lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.