Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160766
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-19 11:38
个人简介

A ZFS fan

文章分类
文章存档

2014年(17)

分类: 服务器与存储

2014-05-26 08:19:28

前段时间被网友问道一个问题:

一个存储磁盘连接到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标签

点击(此处)折叠或打开

  1. # format -e

  2. Searching for disks...done

  3. AVAILABLE DISK SELECTIONS:
  4.       0. c2d0 <SUN-DiskImage-33GB cyl 936 alt 2 hd 96 sec 768>
  5.          /virtual-devices@100/channel-devices@200/disk@0
  6.       1. c2d1 <Unknown-Unknown-0001-15.00GB>
  7.          /virtual-devices@100/channel-devices@200/disk@1
  8.       2. c2d2 <Unknown-Unknown-0001 cyl 424 alt 2 hd 96 sec 768>
  9.          /virtual-devices@100/channel-devices@200/disk@2

  10. Specify disk (enter its number): 1
  11. selecting c2d1

  12. [disk formatted, no defect list found] 

  13. format> label

  14. [0] SMI Label
  15. [1] EFI Label

  16. Specify Label type[1]: 1
  17. Ready to label disk, continue? y

  18. format> q

2)创建ZFS文件系统并写入测试文件

点击(此处)折叠或打开

  1. # zpool create -f tank c2d1 用这个EFI标签的磁盘创建一个ZPOOL

  2. # vi /tank/Testfile 在这个pool的文件系统中创建一个文件,为了后面测试用

  3. # cat /tank/Testfile

  4. Just Have a Test File

  5. # prtvtoc /dev/rdsk/c2d1 > EFI.label # 保留这个磁盘的分区信息,内容这里就不显示出来了

  6. # cat EFI.label

3)将磁盘Label成VTOC

点击(此处)折叠或打开

  1. # format –e

  2. Searching for disks...done

  3. AVAILABLE DISK SELECTIONS:

  4.       0. c2d0 <SUN-DiskImage-33GB cyl 936 alt 2 hd 96 sec 768>
  5.          /virtual-devices@100/channel-devices@200/disk@0
  6.       1. c2d1 <Unknown-Unknown-0001-15.00GB>
  7.          /virtual-devices@100/channel-devices@200/disk@1
  8.       2. c2d2 <Unknown-Unknown-0001 cyl 424 alt 2 hd 96 sec 768>
  9.          /virtual-devices@100/channel-devices@200/disk@2

  10. Specify disk (enter its number): 1
  11. selecting c2d1

  12. [disk formatted, no defect list found]

  13. format> label
  14. [0] SMI Label
  15. [1] EFI Label
  16. Specify Label type[1]: 0

  17. format> q

4)测试ZFS文件系统是否存在

# zpool import # 如果这时候import,将不会发现tank这个存储池

5)按照步骤1)的方法,将磁盘重新Label成EFI

6)测试ZFS文件系统是否存在

# zpool import #改完分区信息之后仍然无法发现 tank 存储池

7)将原始分区表写入磁盘并测试文件系统是否存在

点击(此处)折叠或打开

  1. # cat EFI.label | fmthard -s - /dev/rdsk/c2d1s0 # 将原始的EFI分区信息写回磁盘

  2. # zpool import # OK, tank 存储池回来了
  3.   pool: tank
  4.    id: 16111808129771633575
  5. state: ONLINE

  6. action: The pool can be imported using its name or numeric identifier.

  7. config:
  8.        tank ONLINE
  9.          c2d1 ONLINE

8)导入存储池并查看测试文件是否一致

点击(此处)折叠或打开

  1. # zpool import tank # 导入 tank pool
  2. # ls /tank # 之前写入的数据也在,信息也正确
  3. Testfile
  4. # cat /tank/Testfile
  5. 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进去没有问题。
当然,他没有采用我的方法,他们是这么做的:

点击(此处)折叠或打开

  1. 执行 format -e,当选择磁盘后,进入第一层菜单FORMAT MENU:,对问题磁盘做label时不出现SMI和EFI的选项,在下一层菜单FORMAT MENU:中打入label时出现了SMI和EFI的选项,于是,选择EFI,再将s0分区起始段从 34改为256,再次label,一切正常,退出format。再import到pool中,一切正常如前。


阅读(6466) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~