GPT分区相关的操作 ( 第二部分 )
###############################################
这部分不要单独看. 要先看完第一部分再看这个.
!!!
再次提醒. 命令操作有风险 !!!
!!!
我要建两个分区. 再把gpt 的main和backup 同时清掉.
查找第一和第二个分区的位置.
再用parted重建出分区表. 让一切再恢复正常.
fdisk -l $dev
Disk /dev/vdb: 3 TiB, 3298534883328 bytes, 6442450944 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: gpt
Disk identifier: 3F180574-1456-8549-8263-270DAA0EC382
Device Start End Sectors Size Type
/dev/vdb1 2048 2147485695 2147483648 1T Linux filesystem
/dev/vdb2 2147485696 6442450910 4294965215 2T Linux swap
mkfs.ext4 /dev/vdb1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 268435456 4k blocks and 67108864 inodes
Filesystem UUID: 4fe6a416-71e6-4621-a8e1-a5e01e23a006
mkfs.xfs /dev/vdb2
Setting up swapspace version 1, size = 2 TiB (2199022182400 bytes)
no label, UUID=c0760463-afac-4798-90be-91446bc984bd
parted $dev
GNU Parted 3.2
Using /dev/vdb
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) unit
Unit? [compact]? s
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6442450944s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2048s 2147485695s 2147483648s ext4
2 2147485696s 6442450910s 4294965215s linux-swap(v1)
###################### 清理掉.gpt main backup 数据.
dev="/dev/vdb"
#读出/proc/partitions里的块设备大小.计算共多少字节大.
#size=
(
(
3221225472
∗
1024
)
)
s
e
c
t
o
r
=
((3221225472*1024)) sector=
((3221225472∗1024))sector=((3221225472*2))
dd if=/dev/zero of=$dev bs=512 count=34
dd if= d e v o f = f 2 f 33. s e c b s = 512 c o u n t = 33 s k i p = dev of=f2_f33.sec bs=512 count=33 skip= devof=f2f33.secbs=512count=33skip=(($sector-33))
gdisk $dev
GPT fdisk (gdisk) version 1.0.3
Partition table scan:
MBR: not present
BSD: not present
APM: not present
GPT: not present
Creating new GPT entries.
Command (? for help): p
Disk /dev/vdb: 6442450944 sectors, 3.0 TiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 4F00BDF1-6BE3-48AF-A06F-28A620C9BED7
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 6442450910
Partitions will be aligned on 2048-sector boundaries
Total free space is 6442450877 sectors (3.0 TiB)
Number Start (sector) End (sector) Size Code Name
Command (? for help):
###############################
cat find.sh
#!/bin/bash
start=0
stop=5000
len=10
SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs) = 1
Linux rev 1.0 ext4 filesystem = 2
Linux swap > 20
dev="/dev/vdb"
for i in $(seq $start $stop )
do
tmp=
(
d
d
i
f
=
(dd if=
(ddif=dev bs=512 count=
l
e
n
s
k
i
p
=
len skip=
lenskip=i 2>/dev/null | file -)
d=$(echo
t
m
p
∣
g
r
e
p
d
a
t
a
tmp|grep data
tmp∣grepdata|wc -l)
if [ $d -lt 1 ]
then
echo " $i — $tmp "
fi
done
./find.sh
2048 — /dev/stdin: Linux rev 1.0 ext4 filesystem data, UUID=4fe6a416-71e6-4621-a8e1-a5e01e23a006 (extents) (64bit) (large files) (huge files)
losetup -o $((512*2048)) /dev/loop1 $dev
root@ldap:/home/gpt# file -s /dev/loop1
/dev/loop1: Linux rev 1.0 ext4 filesystem data, UUID=4fe6a416-71e6-4621-a8e1-a5e01e23a006 (extents) (64bit) (large files) (huge files)
文件看起来都正常.
dumpe2fs -h /dev/loop1
dumpe2fs 1.44.5 (15-Dec-2018)
Filesystem volume name:
Last mounted on: /home/gpt/0
Filesystem UUID: 4fe6a416-71e6-4621-a8e1-a5e01e23a006
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 67108864
Block count: 268435456
Reserved block count: 13421772
Free blocks: 263940708
Free inodes: 67108851
First block: 0
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 1024
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Flex block group size: 16
Filesystem created: Sun Oct 18 20:50:33 2020
Last mount time: Sun Oct 18 21:55:40 2020
Last write time: Sun Oct 18 21:55:54 2020
Mount count: 2
Maximum mount count: -1
Last checked: Sun Oct 18 20:50:33 2020
Check interval: 0 ()
Lifetime writes: 17 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: d759b7f2-e686-450f-92c2-6197d160748f
Journal backup: inode blocks
Checksum type: crc32c
Checksum: 0x6ff11364
Journal features: journal_64bit journal_checksum_v3
Journal size: 1024M
Journal length: 262144
Journal sequence: 0x00000108
Journal start: 0
Journal checksum type: crc32c
Journal checksum: 0x2e0b820a
=========
以下两个数相剩为 大约的 filesystem大小(字节为单位). 再除以512为扇区数.
Block size: 4096
Block count: 268435456
再加上之前第一个分区之前的部分. 2048扇区.
echo $((268435456*4096/512+2048))
2147485696
这个位置才是下一个分区可能出现的位置.
===========
cat find.sh
#!/bin/bash
#start=0
#stop=5000
len=10
SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs) = 1
Linux rev 1.0 ext4 filesystem = 2
Linux swap > 20
start=2147485696
stop=$((2147485696+5000))
dev="/dev/vdb"
for i in $(seq $start $stop )
do
tmp=
(
d
d
i
f
=
(dd if=
(ddif=dev bs=512 count=
l
e
n
s
k
i
p
=
len skip=
lenskip=i 2>/dev/null | file -)
d=$(echo
t
m
p
∣
g
r
e
p
d
a
t
a
tmp|grep data
tmp∣grepdata|wc -l)
if [ $d -lt 1 ]
then
echo " $i — $tmp "
fi
done
./find.sh
2147485696 — /dev/stdin: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
losetup -o $((512*2147485696)) /dev/loop2 $dev
file -s /dev/loop2
/dev/loop2: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
mount /dev/loop2 ./0
文件一切正常.
==================
看看能不能找到些数据. 计算出大小啥地.
xfs_info /dev/loop2
meta-data=/dev/loop2 isize=512 agcount=4, agsize=134217663 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=0
data = bsize=4096 blocks=536870651, imaxpct=5
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=262143, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
我实在是不知道xfs是什么样的结构. 算来算去.下面这两个数相乘再除以512比实际 的大小 小一点点.
bsize=4096 blocks=536870651
先这么对付着. 往下走. 好在最后一个分区可以一直分到尾.应该不会出错.
要是后面还有分区. 就再找到下一个分区的头. 也许可以确定尾应该标到哪儿.
先不查了.相信又有N多细节…
#echo $((536870651*4096/512))
4294965208
#echo $((4294965208+2147485696))
6442450904 这个是大约的数.
如果可能. 我标这个数
echo ( ( (( ((sector-33-1))
6442450910
################## 下面试试能不能重建个分区表.
我们从查找的数据已经知道如下这些情况.
分区1 ext4 起2048 止2147485696-1 长度 2147483648
长度计算 echo $((2147485696-2048)) = 2147483648
分区2 xfs 起2147485696 止 6442450910 长度 4294965215
长度计算eco $((6442450910 +1 -2147485696)) 4294965215
和之前的数对比一下.
Number Start End Size File system Name Flags
1 2048s 2147485695s 2147483648s ext4
2 2147485696s 6442450910s 4294965215s linux-swap(V1)
相信我! 我已经迷糊了!!!
############## 我用parted重建一下分区表
root@ldap:/home/gpt# parted $dev
GNU Parted 3.2
Using /dev/vdb
Welcome to GNU Parted! Type ‘help’ to view a list of commands.
(parted) mklabel
New disk label type? gpt
(parted) unit
Unit? [compact]? s
(parted) mkpart
Partition name? []? p1
File system type? [ext2]? ext4
Start? 2048
End? 2147485695
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6442450944s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2048s 2147485695s 2147483648s ext4 p1
(parted) mkpart
Partition name? []? p2
File system type? [ext2]? ext4
Start? 2147485696
End? 6442450910
(parted) p
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 6442450944s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 2048s 2147485695s 2147483648s ext4 p1
2 2147485696s 6442450910s 4294965215s ext4 p2
(parted) q
Information: You may need to update /etc/fstab.
partprobe
##########
file -s /dev/vdb1
/dev/vdb1: Linux rev 1.0 ext4 filesystem data, UUID=4fe6a416-71e6-4621-a8e1-a5e01e23a006 (extents) (64bit) (large files) (huge files)
file -s /dev/vdb2
/dev/vdb2: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)
mount操作一切正常.
希望出现这样的要求时. 我能正确操作吧…