linux格式化多路径分区,Linux-如何在一个文件中格式化多个文件系统?

最小可运行sfdisk+ mke2fs示例不带sudo

在此示例中,我们将创建不包含sudo或setsuid的映像文件,该映像文件包含两个ext2分区,每个分区都填充有主机目录中的文件。

有关更多详细信息,请参见:

这个例子:

#!/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"

在Ubuntu 18.04上测试。GitHub上游。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值