วิธีสร้างไฟล์อิมเมจพาร์ติชั่นที่จัดรูปแบบจากศูนย์


16

ฉันต้องการสร้างระบบไฟล์ด้วยพาร์ติชันเดียวจากอะไรเลย ( /dev/zero) ฉันลองลำดับของคำสั่งนี้:

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

โดยทั่วไปฉันจำเป็นต้องสร้างไฟล์ภาพ 64MB ที่เต็มไปด้วยเลขศูนย์ จากนั้นฉันก็ใช้fdiskเพื่อเพิ่มพาร์ติชันใหม่สำหรับระบบไฟล์ใหม่ (ซึ่งควรเป็น FAT32) เริ่มต้นที่เซกเตอร์2048และใช้เซกเตอร์ที่เหลือทั้งหมด

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

แต่ที่นี่ฉันกำลังตีปัญหา หากฉันตั้งค่าloopอุปกรณ์และจัดรูปแบบโดยใช้mkfs -t vfatตารางพาร์ติชันจะถูกเขียนทับและวางระบบไฟล์ (FAT32) ลงในดิสก์ ฉันไม่ต้องการดิสก์ทั้งหมดที่ฟอร์แมตด้วย FAT32 ฉันแค่ต้องการพาร์ติชันหลักของฉันให้เป็นเช่นนั้น

มีใครรู้บ้างว่าฉันจะฟอร์แมตพาร์ติชั่นเดียวของอิมเมจดิสก์ดิบได้อย่างไรไม่ใช่อิมเมจทั้งหมด?


โปรดอธิบายความหมายของคุณโดยการตั้งค่าอุปกรณ์วนรอบและโพสต์การmkfsโทรทั้งหมดของคุณ ฉันต้องอ่านโพสต์ของคุณ 3 ครั้งเพื่อเข้าใจปัญหาของคุณ แม้ว่าฉันจะไม่สามารถช่วยเหลือคุณได้ แต่ทำไมฉันถึงสร้างไฟล์รูปภาพ (!) ขึ้นมา แต่ยังคงไม่ต้องการใช้ n "sector"
Bananguin

ตกลงแก้ไขมัน ฉันต้องการออกจากเซกเตอร์ n แรก (มีอะไรผิดปกติกับเซกเตอร์) ไม่ได้ใช้เนื่องจากฉันต้องวาง bootloaders ของฉันไว้ที่อื่น
user35443


@MichaelMrozek มีข้อควรพิจารณาที่ใช้กับ Linux ดิสทริบิวชันบางอย่าง แต่ไม่ใช่ Ubuntu (มันสำคัญloopกับโมดูลหรือมีอยู่ในเคอร์เนล) ดังนั้นฉันคิดว่ามันมีประโยชน์สำหรับแต่ละไซต์ที่มีคำถามรุ่นและฉันโหวตให้เปิดใหม่อีกครั้ง
Gilles 'หยุดความชั่วร้าย'

@MichaelMrozek โดยส่วนตัวแล้วฉันรู้สึกว่า AskUbuntu นั้นมีความเฉพาะเจาะจงมากกว่า Unix & Linux ดังนั้นหากคำถามถูกข้ามไปยังทั้งสองเว้นแต่ว่ามีเหตุผลเฉพาะที่จะปิดที่นี่เป็นคำถามบน AskUbuntu ที่ควรปิดเป็น cross-posted โพสต์ในเวลาใกล้กันโดยไม่คำนึงถึงตำแหน่งที่โพสต์ "ครั้งแรก" (อาจกล่าวถึงคำตอบของ Ubuntu / ไม่ใช่ Ubuntu ที่นี่) ที่นี่มีคำตอบที่ได้รับการยอมรับซึ่งเป็นหนึ่งใน AskUbuntu ซึ่งไม่สนับสนุนการเปิด IMO นี้ ฉันไม่มีตัวแทนลงคะแนนให้ปิดบน AskUbuntu แต่ฉันกำลังลงคะแนนเพื่อเปิดคำถามอีกครั้งที่นี่
CVn

คำตอบ:


20

หากบน Linux เมื่อโหลดloopโมดูลตรวจสอบให้แน่ใจว่าคุณผ่านmax_partตัวเลือกไปยังโมดูลเพื่อให้อุปกรณ์ลูปสามารถแบ่งพาร์ติชันได้

ตรวจสอบค่าปัจจุบัน:

cat /sys/module/loop/parameters/max_part

ถ้าเป็น 0:

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

ในการทำให้การตั้งค่านี้คงอยู่ให้เพิ่มบรรทัดต่อไปนี้ลง/etc/modprobe.confในไฟล์หรือ/etc/modprobe.dถ้ามีไดเร็กทอรีนั้นอยู่ในระบบของคุณ:

options loop max_part=31

หากmodprobe -r loopล้มเหลวเนื่องจาก“ โมดูลวนรอบบิวด์อิน” คุณจะต้องเพิ่มลงloop.max_part=31ในบรรทัดคำสั่งเคอร์เนลและรีบูต หากคุณคือ bootloader Grub2 เพิ่มไปค่าของในGRUB_CMDLINE_LINUXetc/default/grub

ตอนนี้คุณสามารถสร้างอุปกรณ์วนรอบพาร์ติชันได้:

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/

(โปรดทราบว่าคุณต้องการ Linux เวอร์ชันล่าสุด)


FATAL: โมดูลลูปสร้างขึ้นภายในสามารถแก้ไขได้ด้วยการติดตั้ง Ubuntu รุ่นล่าสุด (ฉันมี 12.04) หรือไม่
user35443

หากมีอยู่แล้วภายในไม่จำเป็นต้อง modprobe ส่งผ่านloop.max_part=31ไปยังบรรทัดคำสั่งเคอร์เนล
อเล็กซ์

1
อ่าผมเห็นถ้าคุณได้เคอร์เนลที่ผ่านมาและคุณผ่าน max_part ที่ offset และ sizelimit จะไม่จำเป็นที่ทุกคน
อเล็กซ์

อืมบรรทัดคำสั่งเคอร์เนลยากเกินไปสำหรับฉัน ยังขอบคุณขอบคุณ
user35443

มันเป็นloop.maxpart=31หรือloop.max_part=31ในบรรทัดคำสั่งเคอร์เนล?
Cristian Ciupitu

4

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

ออฟเซ็ตที่ระบุควรเป็นไบต์ (1048576 = 2048 เซกเตอร์ * 512 ไบต์ต่อเซกเตอร์)

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

สำหรับข้อมูลเพิ่มเติมดูlosetupและติดตั้ง


อืมชดเชยสิ่งนี้น่าจะใช้ได้ และถ้าฉันมีพาร์ติชั่นมากกว่านี้ล่ะ?
user35443

ฉันเดาหนึ่งลูป = หนึ่งพาร์ติชัน = หนึ่งออฟเซ็ต
อเล็กซ์

อืมและมีตัวเลือกให้ระบุขนาดด้วยเช่นกันดังนั้นฉันจึงสามารถ จำกัด และวางพาร์ทิชันเพิ่มเติมได้หรือไม่
user35443

ขออภัยความผิดของฉันในการสร้างคำตอบใหม่ด้วยวิธีแก้ปัญหาบางส่วนคำตอบที่ถูกต้องคือจาก @ "Stephane Chazelas" เขาสามารถเพิ่มออฟเซ็ตและตัวเลือกขนาดย่อ (จากนั้นฉันจะลบของฉัน)
Alex

อย่าปล่อยให้มันอยู่ที่นี่มิเช่นนั้น +1 ของฉันจะไปไหน
user35443

2

ขั้นตอนต่อไปนี้ช่วยให้คุณสามารถเมานต์พาร์ติชันของรูปภาพเพื่อแก้ไข

ตัวเลือก losetup 2.21 -P

losetup -P -f --show my.img

สร้างหนึ่งรายการ/dev/loopXpYต่อพาร์ติชัน

ข้อได้เปรียบ: ปฏิบัติการติดตั้งล่วงหน้าในหลาย distros (แพคเกจ util-linux)

ข้อเสีย: ตัวเลือกล่าสุดค่อนข้างไม่มีใน Ubuntu 14.04

losetup -P ระบบอัตโนมัติ

การใช้งาน:

$ 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

ที่มา:

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

เอาท์พุท:

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

loop0p1พาร์ทิชันแรกอยู่ที่ไหนดังนั้นเราสามารถทำได้:

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

ข้อดีของวิธีนี้: ทำงานบน Ubuntu 14.04 โดยไม่ต้องบูตเครื่องใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.