লিনাক্স - এক ফাইলের মধ্যে একাধিক ফাইল সিস্টেম কীভাবে ফরম্যাট করবেন?


9

আমাকে দুটি খালি ফাইল সিস্টেমের সাথে একটি ডিস্ক চিত্র তৈরি করতে হবে। আমি এটি ব্যবহার করে তৈরি করেছি

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

এরপরে, আমি ব্যবহার করে দুটি প্রাথমিক পার্টিশন তৈরি করেছি 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

এই সমাধানটির একটি অপূর্ণতা হ'ল সুপার-রাইটার রাইটস।


আমি সন্দেহ করি যে এই সমস্ত প্রোগ্রামগুলি কোনও ফাইলে অভ্যন্তরীণ পার্টিশন ব্যবহার করতে সক্ষম হবে। আপনি কি দুটি ফাইল সিস্টেম আলাদা আলাদা ফাইলগুলিতে তৈরি করতে পারেন এবং তারপরে তাদেরকে ডিডির সাথে একটি বড় ফাইলে মার্জ করতে পারেন?
golimar

@ গলিমার: তবে এ জাতীয় ড্রাইভে আমার এমবিআর লাগবে, আমি জানি না কীভাবে পৃথক পৃথক পৃথক পৃথক ফাইল সিস্টেম তৈরি করা সম্ভব হয়েছে
psihodelia

আপনি যে মূল ফাইলটি বলেছেন তার এমবিআর ব্যবহার করতে পারেন। dd 'আকার' এবং 'স্কিপ' কমান্ডের সাহায্যে অফসেটগুলিকে অনুমতি দেয়। আপনাকে এক্সেফেস অফসেটগুলি খুঁজে বের করতে হবে এবং তারপরে দুটি ছোট ফাইলের সাথে বড় ফাইলটির অংশটি ওভাররাইট করতে হবে
golimar

যদি আমি এখানে নিরীহ হয়ে থাকি তবে আমাকে ক্ষমা করুন, তবে কেন কেবল দুটি পৃথক ফাইল ব্যবহার করবেন না?
গ্যারেট

উত্তর:


9

দেখা যাচ্ছে আপনি কে-পার্টেক্স সরঞ্জামগুলি ব্যবহার করতে পারেন: http://robert.penz.name/73/kpartx-a-tool-for-mounting-partitions-within-an-image-file/

কোনও পার্টিশনযুক্ত ব্লক ডিভাইসের পার্টিশনের জন্য ডিভাইস ম্যাপিংস সেটআপ করতে কে-পার্টেক্স ব্যবহার করা যেতে পারে। এটি লিনাক্স মাল্টিপ্যাথ-সরঞ্জামগুলির একটি অংশ। কে-পার্টেক্স-এল ইমেজফাইলে আপনি ইমেজ ফাইলের পার্টিশনের একটি ওভারভিউ পাবেন এবং কে-পার্টেক্স -a ইমেজফাইলে পার্টিশনগুলি / dev / mapper / loop0pX (এক্স পার্টিশনের সংখ্যাটি) এর মাধ্যমে অ্যাক্সেসযোগ্য হবে। আপনি এটিকে এখন মাউন্ট / ডেভ / ম্যাপার / লুপ0 পিএক্স / এমএনটি / -ও লুপ, রো দিয়ে মাউন্ট করতে পারেন। আনমাউন্ট করার পরে আপনি ম্যাপার ডিভাইসগুলি কে-পার্টেক্স-ডি ইমেজফাইলে সংযোগ বিচ্ছিন্ন করতে পারেন।

তবে, এই সমাধানটির একটি অপূর্ণতা হ'ল সুপার-রাইটার রাইটস।
psihodelia

1
আমি সন্দেহ করি এমন একটি সমাধান রয়েছে যা সুপারসারের অধিকারের প্রয়োজন নেই! এটি হ'ল এই অপারেশনটিই আমি আশা করি না যে সাধারণ ব্যবহারকারীরা সুপার ব্যবহারকারী দ্বারা
আগত

2
@ পিজেসি 50: সুপারজারের অধিকার ছাড়াই এটি করা সম্ভব: প্রথমে প্রত্যেকটি পার্টিশন পৃথক ফাইল হিসাবে তৈরি করতে হবে, তারপরে ডিস্কের চিত্রটি নিজে নিজে তৈরি করতে হবে এবং ডিস্ক চিত্রটিতে পার্টিশনটি ডিস্ক চিত্রে নকল করতে হবে copy
মিক্কো রেন্টালাইনেন

1
পুনঃটুইট এখানে একটি সর্বনিম্ন
চলমান

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

@ পিএসহোডেলিয়া এটি করা উচিত আপনি যদি এটি করেন তবে ফলাফল কী?
ড্যানিয়েল বেক

এটা কিভাবে কাজ করে না? আপনি যদি কোনো ত্রুটি পেতে পারি? কোন পদক্ষেপ ব্যর্থ?
শন চিন

do sudo mkfs.vfat -F32 / dev / loop1 mkfs.vfat 3.0.9 (31 জানুয়ারী 2010) লুপ ডিভাইস একটি ফ্লপি আকারের সাথে মেলে না, ডিফল্ট এইচডি
প্যারাম

1
কল করার সময় আপনি যদি ব্লকের আকার নির্দিষ্ট করেন তবে সহায়তা করুন mkfs.vfat। আমি সরবরাহ করা প্রথম লিঙ্ক দেখুন। নিবন্ধে আরও উল্লেখ করা হয়েছে, ফ্লপি সতর্কতা প্রত্যাশিত এবং এড়ানো যেতে পারে
শন চিন

1

আমার মনে থাকা সরঞ্জামগুলি নিয়ে আমি যাব:

  • ভার্চুয়ালবক্সে একটি ডিস্ক সহ একটি নতুন ভিএম তৈরি করুন, এটি সাধারণত usually /dev/sda
  • জিপি স্টার্ট লাইভ সিডি দিয়ে ভিএম বুট করুন
  • আপনার প্রয়োজন অনুসারে ভিএম-তে ডিস্কটি বিভাজন এবং বিন্যাস করুন (২ পার্টিশন, বিভিন্ন ফাইল সিস্টেম ইত্যাদি)
  • তারপরে কোনও ফাইল ddরফতানি /dev/sdaকরতে ব্যবহার করুন

শিক্ষিত অনুমানের সাথে এটি 15 মিনিট সময় নেবে।


স্মার্ট কৌশলযুক্ত সমাধান :) তবে আমি বিশ্বাস করি না এটি 15 মিনিটেরও কম সময় নেয়। যাইহোক, এটি স্বয়ংক্রিয় করা শক্ত, কারণ এটির জন্য গ্রাফিক ইন্টারফেসে একজন ব্যবহারকারী প্রয়োজন (সুতরাং, কোনও স্ক্রিপ্টিং সম্ভব নয় = ইউনিক্স উপায় নয়)।
psihodelia

এটি বেশি সময় নেয় না :-) কারণ ভার্চুয়াল ডিস্কটি ছোট এবং কোনও OS ইনস্টলেশন সম্পন্ন হয়নি। দীর্ঘতম অংশটি হ'ল জিপিআরড বুট সময়।
কারাতেডোগ

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 এ পরীক্ষিত। গিটহাব উজানের দিকে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.