前段时间被网友问道一个问题:
一个存储磁盘连接到Solaris 10系统上,通过Solaris 10将磁盘格式化成EFI标签并做成ZFS文件系统,但是该存储同时被连接到一台Solaris 8系统上。由于Solaris 8只能识别VTOC格式的标签,更无法识别ZFS文件系统。所以连接到Solaris 8之后提示是否要重新Label。
由于误操作,将磁盘格式化成了VTOC标签的磁盘。这样一来Solaris 10系统也无法读取该磁盘系统。怎样才能恢复磁盘上的信息?
其实,将磁盘的Label信息有EFI改变成VTOC并不会影响到磁盘上的ZFS文件系统以及文件系统中的数据。ZFS在设计时就已经为VTOC预留了空间:为了防止在创建存储池时覆盖了VTOC信息,ZFS在磁盘开始位置留下了8K的空间。当然EFI也一样。
有这样的保证,我们就可以放心地使用format -e来将磁盘的Label重新改成EFI。
但是,虽然可以重新Label,但是Label之后会给磁盘一个默认的分区表,所以为了恢复之前的文件系统,我们必须将原有系统的分区表写回到磁盘上才行(如果忘记了原始的分区表该如何处理?下面我们也将讨论)。
下面是我的实验步骤(将EFI标签改成VTOC之后改回EFI并恢复文件系统):
1)首先,我将一块磁盘标记为EFI标签
-
# format -e
-
-
Searching for disks...done
-
-
AVAILABLE DISK SELECTIONS:
-
0. c2d0 <SUN-DiskImage-33GB cyl 936 alt 2 hd 96 sec 768>
-
/virtual-devices@100/channel-devices@200/disk@0
-
1. c2d1 <Unknown-Unknown-0001-15.00GB>
-
/virtual-devices@100/channel-devices@200/disk@1
-
2. c2d2 <Unknown-Unknown-0001 cyl 424 alt 2 hd 96 sec 768>
-
/virtual-devices@100/channel-devices@200/disk@2
-
-
Specify disk (enter its number): 1
-
selecting c2d1
-
-
[disk formatted, no defect list found]
-
-
format> label
-
-
[0] SMI Label
-
[1] EFI Label
-
-
Specify Label type[1]: 1
-
Ready to label disk, continue? y
-
-
format> q
2)创建ZFS文件系统并写入测试文件
-
# zpool create -f tank c2d1 用这个EFI标签的磁盘创建一个ZPOOL
-
-
# vi /tank/Testfile 在这个pool的文件系统中创建一个文件,为了后面测试用
-
-
# cat /tank/Testfile
-
-
Just Have a Test File
-
-
# prtvtoc /dev/rdsk/c2d1 > EFI.label # 保留这个磁盘的分区信息,内容这里就不显示出来了
-
-
# cat EFI.label
3)将磁盘Label成VTOC
-
# format –e
-
-
Searching for disks...done
-
-
AVAILABLE DISK SELECTIONS:
-
-
0. c2d0 <SUN-DiskImage-33GB cyl 936 alt 2 hd 96 sec 768>
-
/virtual-devices@100/channel-devices@200/disk@0
-
1. c2d1 <Unknown-Unknown-0001-15.00GB>
-
/virtual-devices@100/channel-devices@200/disk@1
-
2. c2d2 <Unknown-Unknown-0001 cyl 424 alt 2 hd 96 sec 768>
-
/virtual-devices@100/channel-devices@200/disk@2
-
-
Specify disk (enter its number): 1
-
selecting c2d1
-
-
[disk formatted, no defect list found]
-
-
format> label
-
[0] SMI Label
-
[1] EFI Label
-
Specify Label type[1]: 0
-
-
format> q
4)测试ZFS文件系统是否存在
# zpool import # 如果这时候import,将不会发现tank这个存储池
5)按照步骤1)的方法,将磁盘重新Label成EFI
6)测试ZFS文件系统是否存在
# zpool import #)改完分区信息之后仍然无法发现 tank 存储池
7)将原始分区表写入磁盘并测试文件系统是否存在
-
# cat EFI.label | fmthard -s - /dev/rdsk/c2d1s0 # 将原始的EFI分区信息写回磁盘
-
-
# zpool import # OK, tank 存储池回来了
-
pool: tank
-
id: 16111808129771633575
-
state: ONLINE
-
-
action: The pool can be imported using its name or numeric identifier.
-
-
config:
-
tank ONLINE
-
c2d1 ONLINE
8)导入存储池并查看测试文件是否一致
-
# zpool import tank # 导入 tank pool
-
# ls /tank # 之前写入的数据也在,信息也正确
-
Testfile
-
# cat /tank/Testfile
-
Just Have a Test File
其他问题
1)不知道原始的EFI磁盘分区表
如果不知道原始的EFI磁盘分区表该怎么处理。这里如果使用了整张磁盘来做ZFS存储池(而不是使用其中的一个分区),问题就比较好解决了。只要按照以下方式来设置分区信息就好(这里的end指磁盘的总大小):
slice 0, tag usr, first sector: 256, last sector is at end - 8MB.
slice 8, tag reserved, first sector is last sector of slice 0 + 1, size 8MB.
其实,slice 8的信息默认的Label设置是没有问题的,只要将slice 0的开始位置设置成256就OK了。
另外,如果不是使用整张磁盘的话,是否可以使用dd或是od命令来直接读取磁盘上的分区表,我还没有测试过。
2)由于Label信息出错,不能使用dd命令读取磁盘信息,甚至无法重新Label,如何处理?
这也是提问网友的实际问题,我是这样处理的:往磁盘头写空数据,把label位置先清空。
# dd if=/dev/zero of=/dev/rdsk/xxxx bs=512 count=1
保险起见,count给1,多了可能会覆盖数据。由于zfs前面有8k的空闲空间。写512进去没有问题。
当然,他没有采用我的方法,他们是这么做的:
-
执行 format -e,当选择磁盘后,进入第一层菜单FORMAT MENU:,对问题磁盘做label时不出现SMI和EFI的选项,在下一层菜单FORMAT MENU:中打入label时出现了SMI和EFI的选项,于是,选择EFI,再将s0分区起始段从 34改为256,再次label,一切正常,退出format。再import到pool中,一切正常如前。
阅读(596) | 评论(0) | 转发(0) |