Chinaunix首页 | 论坛 | 博客
  • 博客访问: 688577
  • 博文数量: 33
  • 博客积分: 10032
  • 博客等级: 上将
  • 技术积分: 1383
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-22 18:53
文章分类

全部博文(33)

文章存档

2011年(4)

2010年(10)

2009年(14)

2008年(5)

我的朋友

分类:

2009-07-11 12:19:19

ZFS文件系统是一个划时代的文件系统,OpenSolaris的默认文件系统就是ZFS。基于ZFS,利用OpenSolaris的beadm命令可以产生和管理多个zfs boot environments。

一台PC机可以装多个Linux,但是只有对磁盘分区和文件系统有一定认识的用户才可以做到。主分区的个数有严格的限制,扩展分区也不能随意多,不然会对磁盘空间会造成极大的浪费,因为一个分区的文件系统是绝不会和另外一个分区文件系统共享磁盘空间的。即使可以安装多块硬盘,在操作系统里用户也避免不了和/dev/sda, /dev/sdc1等底层的设备名称打交道。由于ZFS文件系统独特的设计,普通用户很少或基本不需要和底层设备打交道。想创建多少文件系统就创建多少文件系统,创建文件系统的代价和创建一个目录是一样的,每个文件系统大小可以自动动态调整,用多少空间就给多少空间,所以每个文件系统的空间绝不会浪费,反而由于ZFS文件系统内置的压缩选项极大的节省了磁盘空间。

这一切看似神秘,但是原理又非常简单。我们知道虚拟内存的出现极大的解脱了程序员,程序员再也不需要和物理内存打交道了。ZFS文件系统将所有存储设备放入pool中,如果要创建文件系统就从pool中拿,用多少拿多少,并且不需要和物理设备打交道,文件系统和具体的存储设备没有一一对应的关系。也就是说ZFS文件系统集成了卷管理器的功能。用户或管理员再也不需要fdisk/parted, mkfs, fsck, 手工编辑/etc/fstab。记得在实验室的时候,有一台PC机上面装了Red Hat 9,samba服务器。磁盘空间不够了,我又装了一块硬盘上去,然后格式化,设置挂载点,这活儿当时很多人干不了,还挺自豪的。在移动文件后发现导师和一师弟的个人目录莫名其妙的没有了,幸亏导师的目录里没什么重要的东西。后来由于小隔间里的空调坏了,硬盘在长时间的高温环境下彻底报废了,数据修复公司张嘴就上千的要,更可气的是中关村的数据修复公司二话不说就当FAT修,根本就没有听说过ext2。如果让我再管理一次服务器,我一定会用ZFS文件系统,添加一块硬盘一个命令就搞定,然后给每个人创建一个文件系统,再限定空间大小,这样再也不需要一个人一个人的检查警告,并且ZFS文件系统是一个内置copy-on-write功能的文件系统,ZFS的多级校验和检查到了每一个磁盘块,所以绝不会出现文件系统崩溃的情况。

传统文件系统的元数据是静态分配的,比如说一个刚刚创建的文件系统没有任何文件,其实inode磁盘块已经占据了相当的空间,并且由于原数据的提前静态分配,该文件系统能够创建的文件个数已经确定了。但是ZFS文件系统的元数据是动态创建的,所以就不存在上述问题。

Ubuntu Linux升级后,升级前的内核也可以启动。这看似和OpenSolaris的zfs boot environments一样,但是有本质的区别。Linux升级前和升级后的内核同在一个文件系统里,如果磁盘或者文件系统损坏,两个内核都不可用。OpenSolaris升级后,利用ZFS文件系统创建了新的文件系统,升级前和升级后的内核不在同一个文件系统里,两个文件系统都可以启动。更重要的是,OpenSolaris利用clone,也就是可写的snapshot来升级系统,所以这两个文件系统相同的磁盘块完全共享,只有不同的部分才会占用磁盘空间。

下面介绍一下普通用户会用到的一些命令:

升级之后,就会多出一个zfs boot environment
# pkg image-update
也可以指定BE名字
# pkg image-update --be-name 132

当前我系统有两个zfs boot environments
# beadm list
BE            Active Mountpoint Space   Policy Created          
--            ------ ---------- -----   ------ -------          
opensolaris   -      -          159.73M static 2009-06-24 09:54
opensolaris-1 NR     /          9.49G   static 2009-06-24 10:57
如果你想产生一个clone来调试新的内核驱动
# beadm create testbe
# beadm activate testbe
# beadm list
BE            Active Mountpoint Space   Policy Created          
--            ------ ---------- -----   ------ -------          
opensolaris   -      -          159.73M static 2009-06-24 09:54
opensolaris-1 N      /          31.5K   static 2009-06-24 10:57
testbe        R      -          9.49G   static 2009-07-11 11:52
重启之后就进入了测试环境,工作做完之后就可以将这个clone删掉了
# beadm activate opensolaris-1
# beadm destroy testbe
Are you sure you want to destroy testbe? This action cannot be undone(y/[n]): y

压缩
# zfs set compression=on rpool
# cd $ONNV/usr/src
# cscope -R -b -k
# ctags -R
# ls -lh tags cscope.out
-rw-r--r-- 1 mishuang staff 209M 2009-07-11 08:49 cscope.out
-rw-r--r-- 1 mishuang staff  76M 2009-07-11 08:53 tags
# du -sh tags cscope.out
  28M    tags
 110M    cscope.out

当前BE的内核是snv_116,你想将前一个BE(snv_110)的某个内核驱动拷出来,你大可不必重启。
# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
rpool                       46.8G  26.1G  80.5K  /rpool
rpool/ROOT                  9.59G  26.1G    19K  legacy
rpool/ROOT/opensolaris       160M  26.1G  3.49G  /
rpool/ROOT/opensolaris-1    9.43G  26.1G  7.84G  /
rpool/dump                   755M  26.1G   755M  -
rpool/export                35.7G  26.1G    21K  /export
rpool/export/home           35.7G  26.1G    21K  /export/home
rpool/export/home/mishuang  35.7G  26.1G  22.7G  /export/home/mishuang
rpool/swap                   755M  26.3G   553M  -
# mkdir /mnt/opensolaris
# zfs set mountpoint=/mnt/opensolaris rpool/ROOT/opensolaris
# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
rpool                       46.8G  26.1G  80.5K  /rpool
rpool/ROOT                  9.59G  26.1G    19K  legacy
rpool/ROOT/opensolaris       160M  26.1G  3.49G  /mnt/opensolaris
rpool/ROOT/opensolaris-1    9.43G  26.1G  7.84G  /
rpool/dump                   755M  26.1G   755M  -
rpool/export                35.7G  26.1G    21K  /export
rpool/export/home           35.7G  26.1G    21K  /export/home
rpool/export/home/mishuang  35.7G  26.1G  22.7G  /export/home/mishuang
rpool/swap                   755M  26.3G   553M  -
# zfs mount rpool/ROOT/opensolaris
# cd /mnt/opensolaris/
# ls
bin   cdrom  devices  export  kernel  lost+found  mnt  opt     proc  rpool  system  usr
boot  dev    etc      home    lib     media      net  platform  root  sbin   tmp     var
# cd
# zfs unmount rpool/ROOT/opensolaris
# zfs set mountpoint=/ rpool/ROOT/opensolaris
# zfs list
NAME                         USED  AVAIL  REFER  MOUNTPOINT
rpool                       46.8G  26.1G  80.5K  /rpool
rpool/ROOT                  9.59G  26.1G    19K  legacy
rpool/ROOT/opensolaris       160M  26.1G  3.49G  /
rpool/ROOT/opensolaris-1    9.43G  26.1G  7.84G  /
rpool/dump                   755M  26.1G   755M  -
rpool/export                35.7G  26.1G    21K  /export
rpool/export/home           35.7G  26.1G    21K  /export/home
rpool/export/home/mishuang  35.7G  26.1G  22.7G  /export/home/mishuang
rpool/swap                   755M  26.3G   553M  -
或者更简单一些,用beadm:
# beadm mount opensolaris /mnt/opensolaris
# beadm unmount opensolaris

主目录的文件系统是rpool/export/home/mishuang,挂载点是/export/home/mishuang,你想将这个文件系统拷贝到另外一台机器上,如果是Linux你估计得折腾一阵子了,OpenSolaris两个命令就搞定了,
# zfs snapshot rpool/export/home/mishuang@send
# zfs send rpool/export/home/mishuang@send | ssh leape "zfs recv rpool/export/home/mishuang"

开启cifs服务
# pkg install SUNWsmbs
# echo "other password required pam_smb_passwd.so.1 nowarn" >> /etc/pam.conf
# passwd mishuang
# svcadm enable -r smb/server
# zfs set sharesmb=on rpool/export/home/mishuang
# sharemgr set -P smb -p name=mishuang zfs/rpool/export/home/mishuang
# sharemgr show -vp

最近发现Solaris上用fat32格式的U盘拷贝东西速度有点慢,如果只在Solaris之间拷贝东西的话,可以将U盘格式化为ZFS文件系统,又快又方便。还有可以用ZFS将两个U盘格式化为一个文件系统,比如你有想拷贝一个DVD,但是你只有两个2G的U盘。

1. 利用rmformat查看设备名称
# rmformat
Looking for devices...
     1. Logical Node: /dev/rdsk/c7t0d0p0
        Physical Node: /pci@0,0/pci-ide@1f,1/ide@0/sd@0,0
        Connected Device: MATSHITA DVD+-RW UJ-857G  Z111
        Device Type: DVD Reader/Writer
    Bus: IDE
    Size:
    Label:
    Access permissions:
     2. Logical Node: /dev/rdsk/c9t0d0p0
        Physical Node: /pci@0,0/pci1028,209@1d,7/storage@1/disk@0,0
        Connected Device: TOSHIBA  TransMemory      PMAP
        Device Type: Removable
    Bus: USB
    Size: 7.7 GB
    Label:
    Access permissions: Medium is not write protected.

2. 创建文件系统mishuang
# zpool create mishuang c9t0d0
需要注意的是:系统会用最新的版本创建zpool,所以可以指定的版本低一点,这样import就不会出现版本不兼容的问题。
# zpool create -o version=14 mishuang c9t0d0
如果要想升级,可以用如下命令:
# zpool upgrade mishuang
This system is currently running ZFS pool version 19.

Successfully upgraded 'mishuang' from version 14 to version 19

U盘这时候就已经挂载到/mishuang下面了,拷贝完文件后,

3. 卸载
# zpool export mishuang

将U盘在另外的OpenSolaris上挂载

4. 挂载
# zpool import mishuang
U盘就又出现在了/mishuang下面

如果不想让U盘挂载到/mishuang下,可以设置新的挂载点:
zfs set mountpoint=/export/home/mishuang/usb mishuang
zfs文件系统挂载点的属性是放到dataset中的,不是在/etc/vfstab中集中管理的,所以上面的命令执行一次就行了,也就是说挂载文件系统时,系统会自动找到上次设置的挂载点。
如果再设置下面的alias,你会发现用ZFS文件系统格式化U盘,比用HAL又快又方便
alias z='zfs list mishuang > /dev/null 2>&1 && pfexec zpool export mishuang || pfexec zpool import mishuang'

另外可以用/usr/bin/chmod设置ACL,让NIS帐户可以像owner一样操作U盘。
[mishuang@kiev ~]$ ls -dv usb
drwxr-xr-x  25 mishuang staff         30 Feb 13 10:59 usb
     0:owner@::deny
     1:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     2:group@:add_file/write_data/add_subdirectory/append_data:deny
     3:group@:list_directory/read_data/execute:allow
     4:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     5:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
[mishuang@kiev ~]$ chmod A+user:sm207740:full_set:allow usb
[mishuang@kiev ~]$ ls -dv usb
drwxr-xr-x+ 24 mishuang staff         29 Feb 13 11:03 usb
     0:user:sm207740:list_directory/read_data/add_file/write_data
         /add_subdirectory/append_data/read_xattr/write_xattr/execute
         /delete_child/read_attributes/write_attributes/delete/read_acl
         /write_acl/write_owner/synchronize:allow
     1:owner@::deny
     2:owner@:list_directory/read_data/add_file/write_data/add_subdirectory
         /append_data/write_xattr/execute/write_attributes/write_acl
         /write_owner:allow
     3:group@:add_file/write_data/add_subdirectory/append_data:deny
     4:group@:list_directory/read_data/execute:allow
     5:everyone@:add_file/write_data/add_subdirectory/append_data/write_xattr
         /write_attributes/write_acl/write_owner:deny
     6:everyone@:list_directory/read_data/read_xattr/execute/read_attributes
         /read_acl/synchronize:allow
用'/usr/bin/chmod A- usb'可以去掉ACL。

参考资料:

intro/
docs/zfs_last.pdf
docs/zfsadmin.pdf


http://blogs.sun.com/observatory/entry/accessing_opensolaris_shares_from_windows

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