একটি img ফাইলের ভিতরে একটি পার্টিশন ফর্ম্যাট কিভাবে?


12

আমি imgনিম্নলিখিত কমান্ডের মাধ্যমে একটি ফাইল তৈরি করেছি :

dd if=/dev/zero bs=2M count=200 > binary.img

এটি কেবল জিরো সহ একটি ফাইল, তবে আমি এটি ব্যবহার করে fdiskএকটি পার্টিশন টেবিল তৈরি করতে পারি :

# fdisk binary.img

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x51707f21.

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x51707f21

এবং, যাক, একটি বিভাজন:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-819199, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-819199, default 819199): 

Created a new partition 1 of type 'Linux' and of size 399 MiB.

Command (m for help): w
The partition table has been altered.
Syncing disks.

আমি যখন পার্টিশন টেবিলটি পরীক্ষা করি তখন আমি নিম্নলিখিত ফলাফলটি পাই:

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7f3a8a6a

Device      Boot Start    End Sectors  Size Id Type
binary.img1       2048 819199  817152  399M 83 Linux

সুতরাং বিভাজন বিদ্যমান। আমি যখন জিপিআর্টের মাধ্যমে এই পার্টিশনটি ফর্ম্যাট করার চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

এখানে চিত্র বর্ণনা লিখুন

কেন এটি সন্ধান করে তা আমি জানি না binary.img1, এবং কমান্ডটি লাইভ থেকে কীভাবে পার্টিশনটি ফর্ম্যাট করা যায় তা আমার কোনও ধারণা নেই।

এক্সট 4 ফাইল সিস্টেম ব্যবহার করে কী কী এটির বিন্যাস করতে হয় তা কি কেউ জানেন?


2
একটি বিকল্প হ'ল এই উত্তরটি থেকে হ্রাসআপ কৌশলটি করা এবং তারপরে লুপব্যাক ডিভাইসের বিপরীতে mkfs.ext4 চালানো।
মিক্কা

আমি এই লিঙ্কটি unix.stackexchange.com/a/87189/52763 খুঁজে পেয়েছি । এবং এটি আসলে আমি চেয়েছিলাম। সমস্যাটি হ'ল আমি যখন জিপিআর্টে ডিভাইসটি পরীক্ষা করি তখন আমি পাই Couldn't find valid filesystem superblock.। এখানে ছবিটি রয়েছে: i.imgur.com/dl7XAC4.png .এটি কি কোনও বাগ?
মিখাইল মরফিকভ

উত্তর:


13

আপনি লুপব্যাক বৈশিষ্ট্যের মাধ্যমে ডিস্ক চিত্র এবং এর পৃথক পার্টিশন অ্যাক্সেস করতে পারেন। আপনি ইতিমধ্যে আবিষ্কার করেছেন যে কিছু ডিস্ক ইউটিলিটিগুলি ডিস্ক চিত্রগুলিতে আনন্দের সাথে (যুক্তিসঙ্গত) কাজ করবে। তবে, তাদের মধ্যে mkfsএকটি নয় (তবে আশ্চর্যের বিষয় mountহল)।

এখানে থেকে আউটপুট fdisk -lu binary.img:

Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...

Device           Boot Start    End Sectors  Size Id Type
binary.img1            2048 819199  817152  399M 83 Linux

আপনার তৈরি করা পার্টিশনটি অ্যাক্সেস করতে আপনার কয়েকটি পছন্দ আছে have

  1. সুস্পষ্ট রুট

    losetup --offset $((512*2048)) --sizelimit $((512*817152)) --show --find binary.img
    /dev/loop0
    

    আউটপুট /dev/loop0বরাদ্দ করা লুপ ডিভাইসের নাম। --offsetপরামিতি মাত্র পার্টিশন অফসেট এর হয় ( Start) ক্ষেত্রে আকার দ্বারা গুন ( 512)। যেখানে --sizelimitপার্টিশনের মাপ, এবং আপনি নিম্নলিখিত পদ্ধতিতে এটি নিরূপণ করতে পারেন: শেষের শুরু +1, যা 819199-2048 +1 = 817152, এবং যে সংখ্যা খাতের আকার দ্বারা গুন করতে হবে।

    তারপরে আপনি /dev/loop0পার্টিশনের আপনার উল্লেখ হিসাবে ব্যবহার করতে পারেন :

    mkfs -t ext4 -L img1 /dev/loop0
    mkdir -p /mnt/img1
    mount /dev/loop0 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
  2. অন্তর্নিহিত রুট

    losetup --partscan --show --find binary.img
    /dev/loop0
    

    আউটপুটটি /dev/loop0প্রাথমিক লুপ ডিভাইসের নাম যা বরাদ্দ করা হয়েছে। এছাড়াও, --partscanবিকল্পটি কার্নেলকে পার্টিশন টেবিলের জন্য ডিভাইসটি স্ক্যান করতে এবং সহায়ক লুপ ডিভাইসগুলি স্বয়ংক্রিয়ভাবে নির্ধারণ করতে বলে। আপনার ক্ষেত্রে একটি পার্টিশনের সাথে আপনিও পাবেন /dev/loop0p1যা পার্টিশনের ক্ষেত্রে আপনার রেফারেন্স হিসাবে ব্যবহার করতে পারেন:

    mkfs -t ext4 -L img1 /dev/loop0p1
    mkdir -p /mnt/img1
    mount /dev/loop0p1 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    

@ মিখাইল কৌতূহল দেখার জন্য আপনাকে পার্টিশনের আকার গণনা করা হয়েছিল যখন এটি ইতিমধ্যে fdiskআউটপুটটির অংশ হিসাবে দেওয়া হয়েছিল ।
রোয়াইমা

2
কিছু গণিতে ভুল কী? এছাড়াও, এটা জেনে রাখা ভাল যে আপনি ঠিক সেই ক্ষেত্রে সঠিক খাত নম্বর পেতে পারেন ...
মিখাইল মরফিকভ

কেবলমাত্র একটি দ্রুত পর্যবেক্ষণ: "mkfs ফ্রন্টএন্ডটি ফাইল সিস্টেম নির্দিষ্ট mkfs এর পক্ষে অবমুক্ত করা হয়েছে <
gmagno

@gmagno এখনই সঠিক, অবশ্যই। তবে যতক্ষণ না আমি খুব দীর্ঘ বা খুব শক্ত খনন না করেই নির্ধারণ করতে পারি, সেই বিজ্ঞপ্তিটি প্রথমে ইউজার-লিনাক্স 2.25-আরসি 1 দিয়ে প্রকাশ করা হয়েছিল এবং এটি ২০১৫ সালের জুনের পরে বেশ কিছুক্ষণ অবধি দেবিয়ান স্থিতিশীল হয়ে উঠেনি free উত্তরটি বর্তমান তথ্যের সাথে আপডেট করার জন্য।
রোয়াইমা

11

অন্য উপায় জেনারেল ব্যবহারে এই কাজ করতে নেই kpartx( না KDE এর সাথে সম্পর্কিত)

sudo kpartx -a binary.img

এবং এখন আপনি সব পার্টিশন ডিভাইসের অধীনে সংজ্ঞায়িত থাকতে হবে /dev/mapperযেমন loop0p1 , loop0p2 ...

এবং তারপর

sudo mkfs.ext4 /dev/mapper/loop0p1

অপশনলি, আপনার কাজ শেষ হয়ে গেলে, আপনি চালাতেও পারেন

sudo kpartx -d binary.img

লুপ0p থেকে মুক্তি পেতে? deivce


2
নিশ্চিত কেন এটিতে বেশি ভোট নেই Not আইএমও এটি সেরা উত্তর ...!
জেরেমি ডেভিস

জিপিটি পার্টিশনগুলির সাথে কাজ করে, উদাহরণস্বরূপ, আপনি যদি একটি সম্পূর্ণ ডিস্ক ডিডি ছাড়াই EFI পার্টিশনটি পরিবর্তন করতে চান।
রাশ

3

কেন জানি এটি জানি না binary.img1

(… এবং পরে binary.img2ভাষ্যটিতে দাফনের জন্য ।)

এটি কারণ যে সরঞ্জামগুলি ফাইলের নামগুলি একটি নির্দিষ্ট প্যাটার্ন অনুসরণ করবে বলে আশা করছে। আপনার সিস্টেমে প্রকৃত ডিস্ক এবং ডিস্ক ভলিউমের জন্য সেই প্যাটার্নটি ডিভাইস ফাইল দ্বারা ব্যবহৃত হয়, যথা:

  • পুরো ডিস্ককে অন্তর্ভুক্ত একটি ডিভাইস ফাইলটির নাম দেওয়া হয়েছে sda(বা অন্য কিছু)। এটি fdiskব্যবহার করার প্রত্যাশা করে।
  • ডিস্ক, তার পার্টিশন দ্বারা বর্ণিত পৃথক টুকরা জন্য ডিভাইস ফাইল, নামকরণ করা হয় sda1, sda2, sda3, এবং তাই ঘোষণা। এই জাতীয় সরঞ্জামগুলি gpartedযখন তারা পৃথক ডিস্ক ভলিউমেmkfs জিনিস করতে বলবে তখন এটি ব্যবহার করার প্রত্যাশা করে ।

অবশ্যই, সাধারণ ফাইলগুলি ডিস্ক ডিভাইসগুলির ফাইলগুলি সেভাবে ওভারল্যাপ করে না। লুপব্যাক ফাইল সিস্টেম যে আপনার দেখেছি জড়িত আলোচনা একটি একক পুরো ডিস্ক ইমেজ ফাইল গ্রহণ এবং তৈরি করার লুপব্যাক ব্যবহার সম্পর্কে সব হয় 1, 2, 3এটি মধ্যে পৃথক টুকরা প্রতিফলিত এবং তাই ঘোষণা ফাইল, একবার কাঙ্খিত পার্টিশন বিন্যাস লেখা হয়েছে পার্টিশন টেবিল।


এটা বোধগম্য!
মিখাইল মরফিকভ

0

যদিও এই বিষয়টি সরাসরি সম্পর্কিত নয়, তবে এটি অনেকগুলি একই এবং সম্পর্কিত তথ্যের উল্লেখ করে।

দেবিয়ান উইকি | রাস্পবেরি পাই এবং কিমু-ব্যবহারকারী-স্ট্যাটিক

আপনি যদি aptএই পোস্টে উল্লিখিত কয়েকটি কমান্ড ইনস্টল করতে ব্যবহার না করতে পারেন তবে ব্যবহার করার চেষ্টা করুন apt-cache search [package_name]। কমান্ডটি যদি অন্য কোনও নামের প্যাকেজ থেকে আসে তবে এটি কোনও ফলাফল করতে পারে না।

উদাহরণস্বরূপ, losetupপূর্বে losetupব্যবহার হিসাবে ইনস্টল করা যেতে পারে apt install losetupতবে এটি এখন util-linuxউবুন্টুর সংগ্রহস্থলের অংশ । কীভাবে প্যাকেজটি অন্য প্যাকেজের ধারক হিসাবে কাজ করে তা আপনাকে খুঁজে বের করার জন্য, আপনাকে অবশ্যই লিনাক্স বিতরণের জন্য অনলাইন সংগ্রহস্থলের সন্ধানটি ব্যবহার করতে হবে। অথবা, যদি আপনাকে এটি অন্য উত্স থেকে ইনস্টল করতে হয় তবে একটি ওয়েব অনুসন্ধান ইঞ্জিন ব্যবহার করুন।

কিছু প্যাকেজ পরীক্ষা করে দেখুন ...

util-linux genisoimage dosfstools squashfs-tools fsarchiver xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-tools

প্রতিটি লিনাক্স বিতরণের নিজস্ব অনলাইন ম্যানপেজ থাকে। কখনও কখনও টিউটোরিয়ালের চেয়ে ম্যানপেজগুলি ব্যবহার করা সহজ। ম্যানুয়াল পৃষ্ঠাগুলি আপনাকে সমস্ত কমান্ড বিকল্প এবং প্যারামিটারগুলি বলবে। একটি টিউটোরিয়াল সাধারণত ব্যবহৃত ব্যবহৃত উপর দৃষ্টি নিবদ্ধ করা হবে।


0

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

কোনও চিত্রের মধ্যে বিদ্যমান কাঁচা ফাইল সিস্টেমটি মোড়ানোর জন্য সহায়ক

উপরের থেকে আহরণ, নিম্নলিখিত দরকারী হতে পারে:

# Put a raw filesystem file into a disk image with a partition table.
#
# /unix/209566/how-to-format-a-partition-inside-of-an-img-file/527132#527132
#
# Usage:
#
#     sfdisk-fs-to-img root.ext2
#
# Creates a file:
#
#     sfdisk-fs-to-img root.ext2.img
#
sfdisk-fs-to-img() (
  partition_file_1="$1"
  img_file="${partition_file_1}.img"
  block_size=512
  partition_size_1="$(wc -c "$partition_file_1" | awk '{print $1}')"
  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)/$bs)) skip="$(($cur_offset/$bs))"
  printf "
  type=83, size=$(($partition_size_1/$block_size))
  " | sfdisk "$img_file"
  cur_offset=$(($cur_offset + $part_table_offset))
  dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
  cur_offset=$(($cur_offset + $partition_size_1))
)

গিটহাব উজানের দিকে

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