लिनक्स - एक फाइल के भीतर कई फाइल सिस्टम को फॉर्मेट कैसे करें?


9

मुझे दो खाली फ़ाइल सिस्टम के साथ एक डिस्क छवि बनाने की आवश्यकता है। मैंने इसका उपयोग करके बनाया है

dd if=/dev/zero of=./disk.img bs=1MiB count=1024

अगला, मैंने 2 प्राथमिक विभाजनों का उपयोग करके बनाया है fdisk disk.img; एक है FAT32 और दूसरा है EXT3। अब, मुझे फाइल-सिस्टम बनाने के लिए दोनों विभाजनों को प्रारूपित करना होगा -o loop devices। लेकिन मैं समझ नहीं पा रहा हूं कि उन्हें कैसे प्रारूपित किया जाए? मैं उपयोग नहीं कर सकते mkfs.vfatपर disk.img। इसलिए मैं पूरी तरह से भ्रमित हूं।

समाधान: @ pjc50 से जवाब देने के लिए धन्यवाद मुझे बहुत सरल समाधान मिला:

sudo aptitude install multipath-tools
sudo kpartx -a disk.img   #it maps (mounts) found partitions to /dev/mapper/loop...
sudo mkfs.vfat -F 32 -n boot /dev/mapper/loop0p1
sudo mkfs.ext3 -L rootfs /dev/mapper/loop0p2

इस समाधान की एक कमी सुपरयुसर अधिकारों की आवश्यकता है।


मुझे संदेह है कि वे सभी प्रोग्राम एक फ़ाइल के अंदर विभाजन का उपयोग करने में सक्षम होंगे। क्या आप दो फाइल सिस्टम को अलग-अलग फाइलों में बना सकते हैं और फिर उन्हें dd वाली बड़ी फाइल में मर्ज कर सकते हैं?
गोलिमार

@ गोलिमार: लेकिन मुझे ऐसे ड्राइव पर एमबीआर की आवश्यकता होगी, मुझे नहीं पता कि अलग-अलग फ़ाइलों के रूप में अलग-अलग बनाई गई अलग-अलग फाइलसिस्टम को मर्ज करना कैसे संभव है
साइहोडेलिया

आपके द्वारा कहे गए मूल फ़ाइल के एमबीआर का उपयोग कर सकते हैं। dd 'साइज' और 'स्किप' कमांड के साथ ऑफसेट की अनुमति देता है। आपको दो बच्चों के साथ बड़ी फ़ाइल के सटीक भाग को ढूंढना होगा और फिर बड़ी फ़ाइल को
लिखना होगा

मुझे माफ कर दो अगर मैं यहां भोली बन रही हूं, लेकिन सिर्फ दो अलग-अलग फाइलों का इस्तेमाल क्यों नहीं करती?
गैरेट

जवाबों:


9

ऐसा लगता है कि आप kpartx टूल्स का उपयोग कर सकते हैं: http://robert.penz.name/73/kpartx-a-tool-for-mounting-partitions-within-an-image-file/

किसी भी विभाजन ब्लॉक डिवाइस के विभाजन के लिए डिवाइस मैपिंग सेट करने के लिए Kpartx का उपयोग किया जा सकता है। यह लिनक्स मल्टीपाथ-टूल्स का हिस्सा है। Kpartx -l imagefile के साथ आपको छवि फ़ाइल में विभाजन का अवलोकन मिलता है और kpartx -a imagefile के साथ विभाजन / dev / mapper / loop0pX (X विभाजन की संख्या) के माध्यम से सुलभ होगा। आप इसे अब माउंट / देव / मैपर / लूप 0 एक्सएक्सएक्स / एमएनटी / -ओ लूप, आरओ के साथ माउंट कर सकते हैं। अनमाउंट करने के बाद आप kpartx -d इमेजफाइल के साथ मैपर डिवाइस को डिस्कनेक्ट कर सकते हैं।

हालांकि, इस समाधान की एक कमी सुपरयुसर अधिकारों की आवश्यकता है।
Psihodelia

1
मुझे संदेह है कि एक समाधान मौजूद है जिसे सुपरयुसर अधिकारों की आवश्यकता नहीं है! यही है, यह उस तरह का ऑपरेशन है जिसकी मुझे उम्मीद नहीं है कि सामान्य उपयोगकर्ता सुपर उपयोगकर्ता द्वारा अग्रिम में स्थापित एक विशिष्ट तंत्र के बिना कर सकेंगे (जैसे कि sudo के माध्यम से)
pjc50

2
@ pjc50: सुपरसुअर अधिकारों के बिना ऐसा करना संभव है: पहले प्रत्येक विभाजन को एक अलग फ़ाइल के रूप में बनाना होगा, फिर डिस्क छवि को मैन्युअल रूप से बनाना होगा और डिस्क छवि में विभाजन तालिका बनाने के बाद डिस्क छवि में विभाजन की प्रतिलिपि बनाएँ।
मिकको रैंटलैनेन

1
@ मायको रेंटालैनेन बिल्कुल। यहाँ एक न्यूनतम चल उदाहरण है: superuser.com/a/1367534/128124
Ciro Santilli 审查 n n n 法轮功

7

आप अपने विभाजन को बढ़ते हुए अपने विभाजन के लिए एक उपयुक्त ऑफसेट को निर्दिष्ट करने के विकल्प के साथ /dev/loop?उपयोग करके ऐसा कर सकते हैं । ( ) ( ) के आउटपुट के आधार पर ऑफसेट की गणना की जा सकती है ।losetup-ofdisk -l disk.imgstart_sector * sector_size

उदाहरण के लिए:

losetup -o32256 /dev/loop1 ./disk.img   # mount first partition

एक बार माउंट होने के बाद, आप विभाजन का उपयोग करने के लिए आगे बढ़ सकते हैं mkfs.*:

mkfs.vfat -F32 /dev/loop1

अधिक जानकारी और उदाहरणों के लिए, निम्नलिखित लेख देखें:


खैर, यह काम नहीं करता है :(
psihodelia

@psihodelia यह होना चाहिए। यदि आप ऐसा करते हैं तो परिणाम क्या है?
डैनियल बेक

यह कैसे काम नहीं करता है? क्या आपको कोई त्रुटि मिलती है? कौन सा कदम फेल?
शॉन चिन

$ sudo mkfs.vfat -F32 / dev / loop1 mkfs.vfat 3.0.9 (31 जनवरी 2010) लूप डिवाइस एक फ्लॉपी आकार से मेल नहीं खाता, डिफ़ॉल्ट hd params का उपयोग कर
psihodelia

1
यदि आप कॉल करते समय ब्लॉक आकार निर्दिष्ट करते हैं, तो मदद कर सकते हैं mkfs.vfat। पहला लिंक देखें जो मैंने प्रदान किया है। लेख में भी उल्लेख किया गया है, फ्लॉपी चेतावनी अपेक्षित है और इसे नजरअंदाज किया जा सकता है
शॉन चिन

1

मैं उन उपकरणों के साथ जाऊंगा जो मेरे दिमाग में हैं:

  • वर्चुअलबॉक्स में एक डिस्क के साथ एक नया वीएम बनाएं, जो आमतौर पर होगा /dev/sda
  • एक GParted लाइव सीडी के साथ VM में बूट करें
  • विभाजन और अपनी आवश्यकताओं के लिए VM में डिस्क को प्रारूपित करें (2 विभाजन, विभिन्न फ़ाइल सिस्टम, आदि)
  • फिर एक फ़ाइल ddको निर्यात /dev/sdaकरने के लिए उपयोग करें

एक शिक्षित अनुमान के साथ, इसमें लगभग 15 मिनट लगेंगे।


स्मार्ट मुश्किल समाधान :) लेकिन मुझे विश्वास नहीं है कि यह 15 मिनट से कम समय लेता है। वैसे, इसे स्वचालित करना कठिन है, क्योंकि इसके लिए ग्राफिक इंटरफ़ेस में उपयोगकर्ता की आवश्यकता होती है (इसलिए, कोई स्क्रिप्टिंग संभव नहीं है = यूनिक्स तरीका नहीं है)।
साइहोडेलिया

वर्चुअल डिस्क छोटा होने के कारण इसमें लंबा समय नहीं लगता है, और कोई OS इंस्टॉलेशन नहीं किया जाता है। सबसे लंबा हिस्सा GParted बूट समय है।
१२:११ को

1

न्यूनतम रननीय sfdisk+ mke2fsउदाहरण के बिनाsudo

इस उदाहरण में, हम, बिना sudoया setsuid, एक छवि फ़ाइल बनाएंगे, जिसमें दो ext2 विभाजन होते हैं, प्रत्येक एक होस्ट निर्देशिका से फ़ाइलों के साथ पॉपुलेटेड होता है।

हम तब sudo losetupविभाजन का उपयोग करने के लिए परीक्षण करने के लिए उपयोग करेंगे कि लिनक्स कर्नेल वास्तव में उन्हें समझा सकते हैं: /programming/1419489/how-to-mount-one-partition-from-an-image -file-कि-शामिल-बहु-विभाजन / 39675265 # 39675265

अधिक जानकारी के लिए, देखें:

उदाहरण:

#!/usr/bin/env bash

# Input params.
root_dir_1=root1
root_dir_2=root2
partition_file_1=part1.ext2
partition_file_2=part2.ext2
partition_size_1_megs=32
partition_size_2_megs=32
img_file=img.img
block_size=512

# Calculated params.
mega="$(echo '2^20' | bc)"
partition_size_1=$(($partition_size_1_megs * $mega))
partition_size_2=$(($partition_size_2_megs * $mega))

# Create a test directory to convert to ext2.
mkdir -p "$root_dir_1"
echo content-1 > "${root_dir_1}/file-1"
mkdir -p "$root_dir_2"
echo content-2 > "${root_dir_2}/file-2"

# Create the 2 raw ext2 images.
rm -f "$partition_file_1"
mke2fs \
  -d "$root_dir_1" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_1" \
  "${partition_size_1_megs}M" \
;
rm -f "$partition_file_2"
mke2fs \
  -d "$root_dir_2" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_2" \
  "${partition_size_2_megs}M" \
;

# Default offset according to
part_table_offset=$((2**20))
cur_offset=0
bs=1024
dd if=/dev/zero of="$img_file" bs="$bs" count=$((($part_table_offset + $partition_size_1 + $partition_size_2)/$bs)) skip="$(($cur_offset/$bs))"
printf "
type=83, size=$(($partition_size_1/$block_size))
type=83, size=$(($partition_size_2/$block_size))
" | sfdisk "$img_file"
cur_offset=$(($cur_offset + $part_table_offset))
# TODO: can we prevent this and use mke2fs directly on the image at an offset?
# Tried -E offset= but could not get it to work.
dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_1))
rm "$partition_file_1"
dd if="$partition_file_2" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_2))
rm "$partition_file_2"

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing, the image is completely ready at this point.

# losetup automation functions from:
# /programming/1419489/how-to-mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
loop-mount-partitions() (
  set -e
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev" | sed -E 's/.*[^[:digit:]]([[:digit:]]+$)/\1/g'
  for part in "${dev}p"*; do
    if [ "$part" = "${dev}p*" ]; then
      # Single partition image.
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst" 1>&2
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
loop-unmount-partitions() (
  set -e
  for loop_id in "$@"; do
    dev="/dev/loop${loop_id}"
    for part in "${dev}p"*; do
      if [ "$part" = "${dev}p*" ]; then
        part="${dev}"
      fi
      dst="/mnt/$(basename "$part")"
      sudo umount "$dst"
    done
    sudo losetup -d "$dev"
  done
)

loop_id="$(loop-mount-partitions "$img_file")"
sudo cmp /mnt/loop0p1/file-1 "${root_dir_1}/file-1"
sudo cmp /mnt/loop0p2/file-2 "${root_dir_2}/file-2"
loop-unmount-partitions "$loop_id"

उबंटू 18.04 पर परीक्षण किया गया। गिटहब ऊपर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.