2008年12月5日星期五

emacs 文件搜索

一直都傻了, 通常用cscope 定位函数 类, 虽然写了生成cscope.files 的脚本, 但是必须按时执行才可以生成,在bsd 下可以通过 crontab 定期生成,但在windows下总要手动执行 烦不胜烦. 看来用grep 貌似是一个好的解决方案

转自:http://kyle.bloghome.cn/posts/181213.html

当偶厌倦了各个tag搜索工具的时候,发现grep才是偶的最爱。每每M-x grep RET输入一堆东西,才可以搜索到自己心仪的东东,确实麻烦。下面介绍下,在emacs中,各种grep相关的设置。如何可以让一位C++程序员比较方便的使用。

  • 基础命令设置

首先进入 Customize Group Grep 分组中,

名称数值说明
Grep Window Height14可以调整grep结果窗口的大小
Grep Commandgrep -rinH -e ../*设置grep的默认命令,使其默认从上一层目录开始递归搜索
Grep Find Commandfind ../* -iname "*.cpp" -type f -print0 | xargs -0 -e grep -nH -e从上一层目录开始递归搜索,所有cpp文件的内容,常用于搜索代码中被引用的变量或者函数
  • 高级命令用法

上面的只是一些雕虫小技。其实更好用的grep命令有如下几个。

命令使用简介特色说明
rgrepM-x rgrep RET后,首先输入的是需要搜索的内容,回车后,提示目标文件的类型,此时可以输入各个别名,比如ch,搜索所有的C++源码文件,随后输入的是搜索开始的目录。递归搜索目录中的内容,支持一些预定义的别名,比如ch表示所有的c++代码文件,hh表示所有的c++头文件等等。这个估计是写程序时,最好用的grep命令。
lgrepM-x lgrep RET后,提示内容与rgrep的都一样,唯一不同的是,lgrep只搜索当前指定目录中的内容,不会对子目录进行递归搜索。lgrep中的l应该是表示本层目录的(local)。对于在很大的,有很多子目录的文件夹中,只想搜索限定目录中,限定文件类型的时候,这个命令很方便。
igrepM-x igrep后,会自动根据当前所在文件的扩展名作为文件过滤条件(也可以修改),随后,会弹出UI提示选择目录(貌似在win32上,没有什么作用),一路回车,就可以搜索了。

emacs 专注模式

虽然emacs可以在一个窗口里工作的很好,可是否在某些情况下希望能够在一个不受干扰的独立窗口中打开某些文件,
这时可用到 专注frame.   例如某些帮助. 会让你很舒服 切换只需要用 c-x 5 o 就可以了

emacs 可以设置哪些文件可以定义为用专注窗口打开

(setq special-display-buffer-names '("*Help*" "*Apropos*"
                                     "*compilation*" "*grep*" "*igrep*")) 

  • sams-find-file-dedicated-frame, which asks for a filename, loads this file into a buffer, and shows this buffer in a dedicated frame.

  • sams-switch-buffer-dedicated-frame, which asks for a buffer name and loads this buffer into a dedicated frame.



自动调整 minibuffer大小

windows 环境下
(setq resize-mini-windows t)
之前应用 (setq resize-mini-windows t) 一直无效, 尚未确认此种写法是否应用于linux/unix 环境下

第五项修炼

《第五项修炼——学习型组织艺术与实务》

 

这是一本开拓性地倡导学习型组织管理思想的巨作。该书问世后不久,便以其革命性的创新获得了1992年世界企业学会最高荣誉的开拓者奖。同年,美国《商业周刊》将该书作者彼得·圣吉推崇为“当代最杰出的新管理大师”。

本书作者彼得·圣吉(PeterM.Senge)1947年出生于芝加哥,1970年于史丹福大学完成航空及太空工程学士学位后,进入麻省理工史隆管理学院读研究所,旋即被佛睿思特(JayForrester)教授的系统动力学整体动态搭配的管理新观念所吸引;1978年获得博士学位。彼得·圣吉在研究中发现,1970年名列美国《财富》杂志“500强”排行榜的大公司,到了20世纪80年代已有1/3销声匿迹。这些不寻常的现象引起了彼得·圣吉的思考。通过深入研究,他发现,是组织的智障妨碍了组织的学习和成长,并最终导致组织的衰败。组织智障,顾名思义,指的是组织或团体在学习及思维方面存在的障碍。这种障碍最明显地表现在:组织缺乏一种系统思考的能力。在思维中,人类总是习惯于将问题加以分解,把世界拆成片断来理解,但是无形中,我们付出了巨大的代价———全然失掉对整体的连属感。这个障碍对组织来说是致命的,许许多多的企业因此走向衰落。彼得·圣吉认为,要使企业茁壮成长,必须建立学习型组织,即将企业变成一种学习型的组织,以此来克服组织智障。至今十余年来,彼得·圣吉博士和麻省理工学院的一群工作伙伴及企业界人士,孜孜不倦地致力于将系统动力学与组织学习、创造原理、认知科学、群体深度对话与模拟演练游戏融合,发展出一种人类梦寐以求的组织蓝图,在其中,人们得以由工作中得出生命的意义、实现共同愿望的“学习型组织”。

  《第五项修炼——学习型组织艺术与实务》这部巨著便是他们研究成果的结晶。该书于1992年荣获世界企业学会(World Business Academy)最高荣誉的开拓者奖(PathfinderAward),以表彰其开拓管理新典范的卓越贡献。美国商业周刊也于同年推崇他为当代最杰出的新管理大师之一。美国《财富》杂志也由此认为,彼得·圣吉所致力探讨的管理科学新技术,是未来最具竞争力的管理技术,因为“学习型组织”概念的提出和一整套修炼单位的确立,使得整个管理范式已经发生了转移。由于其创新价值,并由于其已在无数美国企业中得到了成功的应用,如今愈来愈引起理论界及企业的浓厚兴趣,该书也被喻为“21世纪的管理圣经”。

目 录

 

序:一扇重新看世界的窗

序:伟大的时代先驱

中文版序:为人类找出一条新路

导读:再造组织的无限生机

第一部 全面体检你的组织

    第一章 重圆破镜

    第二章 你的组织有学习智障吗?

    第三章 从啤酒游戏看系统思考

第二部 新思考、新视野

    第四章 第五项修炼的微妙法则

    第五章 新眼睛看世界

    第六章 以简驭繁的智慧

附录 系统基模

    第七章 纵观全局掌握重点

    第八章 见树又见林的艺术

第三部 四项核心修炼

    第九章 自我超越

    第十章 心智模式

    第十一章 共同愿景

    第十二章 团体学习

第十三章 掌握修炼的进阶

第四部 进入学习时代

    第十四章 超越办公室政治

    第十五章 无为而为的有机管理

    第十六章 不再与时间为敌

    第十七章 工作与家庭之间

    第十八章 微世界:学习实验室巡礼

    第十九章 领导者新角色

第五部余响

    第二十章 第六项修炼?

第二十一章 重写思考法则

    第二十二章 不可分割的整体

2008年12月4日星期四

LANG,LC_ALL,local详解(转)

locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
2008-10-08 13:30
例如zh_CN.GB2312、zh_CN.GB18030或者zh_CN.UTF-8。很多人都不明白这些古里古怪的表达方式。这个外星表达式规定了什么东西呢?这个问题稍后详述,现在只需要知道,这是locale的表达方式就可以了。 

locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

[oracle@game ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[oracle@game ~]$ 

locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是: 

1、语言符号及其分类(LC_CTYPE) 
2、数字(LC_NUMERIC) 
3、比较和排序习惯(LC_COLLATE) 
4、时间显示格式(LC_TIME) 
5、货币单位(LC_MONETARY) 
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES) 
7、姓名书写方式(LC_NAME) 
8、地址书写方式(LC_ADDRESS) 
9、电话号码书写方式(LC_TELEPHONE) 
10、度量衡表达方式 (LC_MEASUREMENT) 
11、默认纸张尺寸大小(LC_PAPER) 
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。


所以说,locale就是某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据这几大类的习惯定义的,这些locale定义文件放在/usr/share/i18n/locales目录下面,例如en_US, zh_CN and de_DE@euro都是locale的定义文件,这些文件都是用文本格式书写的,你可以用写字板打开,看看里边的内容,当然出了有限的注释以外,大部分东西可能你都看不懂,因为是用的Unicode的字符索引方式。

[oracle@game ~]$ cd /usr/share/i18n/locales
[oracle@game locales]$ ls
aa_DJ        ar_YE       el_GR       es_ES       fr_CH           iso14651_t1 ne_NP       so_ET                  translit_hangul
aa_ER        az_AZ       el_GR@euro es_ES@euro fr_FR           it_CH        nl_BE       so_KE                  translit_narrow
aa_ER@saaho be_BY       en_AU       es_GT       fr_FR@euro      it_IT        nl_BE@euro so_SO                  translit_neutral
aa_ET        bg_BG       en_BW       es_HN       fr_LU           it_IT@euro   nl_NL       sq_AL                  translit_small
af_ZA        bn_BD       en_CA       es_MX       fr_LU@euro      iw_IL        nl_NL@euro sr_CS                  translit_wide
am_ET        bn_IN       en_DK       es_NI       ga_IE           ja_JP        nn_NO       st_ZA                  tr_TR
an_ES        br_FR       en_GB       es_PA       ga_IE@euro      ka_GE        no_NO       sv_FI                  tt_RU
ar_AE        br_FR@euro en_HK       es_PE       gd_GB           kk_KZ        oc_FR       sv_FI@euro             uk_UA
ar_BH        bs_BA       en_IE       es_PR       gez_ER          kl_GL        om_ET       sv_SE                  ur_PK
ar_DZ        byn_ER      en_IE@euro es_PY       gez_ER@abegede kn_IN        om_KE       ta_IN                  uz_UZ
ar_EG        ca_ES       en_IN       es_SV       gez_ET          ko_KR        pa_IN       te_IN                  uz_UZ@cyrillic
ar_IN        ca_ES@euro en_NZ       es_US       gez_ET@abegede kw_GB        pl_PL       tg_TJ                  vi_VN
ar_IQ        cs_CZ       en_PH       es_UY       gl_ES           lg_UG        POSIX       th_TH                  wa_BE
ar_JO        cy_GB       en_SG       es_VE       gl_ES@euro      lo_LA        pt_BR       ti_ER                  wa_BE@euro
ar_KW        da_DK       en_US       et_EE       gu_IN           lt_LT        pt_PT       ti_ET                  wal_ET
ar_LB        de_AT       en_ZA       eu_ES       gv_GB           lv_LV        pt_PT@euro tig_ER                 xh_ZA
ar_LY        de_AT@euro en_ZW       eu_ES@euro he_IL           mi_NZ        ro_RO       tl_PH                  yi_US
ar_MA        de_BE       es_AR       fa_IR       hi_IN           mk_MK        ru_RU       translit_circle        zh_CN
ar_OM        de_BE@euro es_BO       fi_FI       hr_HR           ml_IN        ru_UA       translit_cjk_compat    zh_HK
ar_QA        de_CH       es_CL       fi_FI@euro hu_HU           mn_MN        se_NO       translit_cjk_variants zh_SG
ar_SA        de_DE       es_CO       fo_FO       hy_AM           mr_IN        sid_ET      translit_combining     zh_TW
ar_SD        de_DE@euro es_CR       fr_BE       i18n            ms_MY        sk_SK       translit_compat        zu_ZA
ar_SY        de_LU       es_DO       fr_BE@euro id_ID           mt_MT        sl_SI       translit_font
ar_TN        de_LU@euro es_EC       fr_CA       is_IS           nb_NO        so_DJ       translit_fraction
[oracle@game locales]$ 

对于de_DE@euro的一点说明,@后边是修正项,也就是说你可以看到两个德国的locale:/usr/share/i18n/locales/de_DE@euro和/usr/share/i18n/locales/de_DE。打开这两个locale定义,你就会知道它们的差别在于de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯。 

上面我们说到了zh_CN.GB18030的前半部分,后半部分是什么呢?大部分Linux用户都知道是系统采用的字符集。 


zh_CN.GB2312到底是在说什么? Locale是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。一个locale的书写格式为: 语言[_地域[.字符集]]。所以说呢,locale总是和一定的字符集相联系的。下面举几个例子: 

1、我说中文,身处中华人民共和国,使用国标2312字符集来表达字符。zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。 

2、我说中文,身处中华人民共和国,使用国标18030字符集来表达字符。zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。 

3、我说中文,身处中华人民共和国台湾省,使用国标Big5字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 

4、我说英文,身处大不列颠,使用ISO-8859-1字符集来表达字符。 en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集 

5、我说德语,身处德国,使用UTF-8字符集,习惯了欧洲风格。
de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正,注意不是de_DE@euro.UTF-8,所以完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]。 

其中,与中文输入关系最密切的就是LC_CTYPE,LC_CTYPE规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。而locale定 义zh_CN中最最重要的一项就是定义了汉字(Class“hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统中成为合法的有效字符,而且不论它们是用什么字符集编码的。 

怎样设定locale呢? 

设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_* >LANG。可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。 

1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。 

2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale设定以LC_*=en_US.UTF-8。 

3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值zh_CN.UTF-8。 

4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话,那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。 

所以,locale是这样设定的: 

1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其他的locale设定,不要作无用功。 

2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。 

3、假如你高兴的话,可以把12个LC_*一一设定成你需要的值,打造一个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集) 罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。 

4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。


另外LANG和LANGUAGE有什么区别呢?

LANG - Specifies the default locale for all unset locale variables
LANGUAGE - Most programs use this for the language of its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值,

refer:http://blog.chinaunix.net/u2/60913/showart_1161340.html

2008年12月3日星期三

转:sambap配置

转载自:http://hi.baidu.com/hywangyc/blog/item/e1e7ae6469af0ef0f736548e.html
SAMBA服务器配置实例分析
2006年12月19日 星期二 15:24

实验一:配置带用户验证的共享目录
1、创建一个samba的共享目录,并将其权限设定为所有者、组用刻户和其他用户可对其进行读写::
#mkdir /samba
#ls -l
#chmod 777 /samb
2、修改/etc/samba/smb.conf配置文件
在[global]部分做如下修改:
security=user //如果是user,则通过windows访问将要求输入用户名与密码
encrypt passwdords=yes;如果默认是这样就不用改了。
smb passwd file = /etc/samba/smbpasswd(密码文件的位置)
在文件末尾添加如下内容:
[samba]
comment=This is my samba server;这是注释行,可以不写东西
path=/samba
read only=no
create mode=0664;这是文件权限
directory mode=0777;这是目录权限
3、创建一个samba用户[该用刻户在windows下有没有都无所谓]
#useradd smbuser
#passwd smbuser
然后创建samba帐户
#smbpasswd -a smbuser [-a必须加,为了生成密码文件smbpasswd],该密码是windows登陆Linux的smbuser用户密码
4、重新启动samba服务
#service smb restart
#pstree |grep smb;观察服务是否启动
5、进行测试
如果想从远程windows机器原“网上邻居”中访问/samba目录,就会要求输入用户名和密码。这里的用户是指上述第3步创建的samba用户当然也可以运行中输入
\\samba服务器ip地十进行访问

******************************************************************************************************************************
实验二:除了上述提到的设置外,进行目录共享时还可以有更多的选项。
如下:
[smb]
comment=This is the second samba
path=/smb
read only=no
create mode=0664
directory mode=0775
deny host=192.168.2.;拒绝所有2网段上的机器访问
allow host=192.168.2.11;允许这台机器访问
public=yes;连接时不需要用户名和密码,这和guest ok=yes等同,
这只应用于该目录,但如果把security=share,则会开放所有目录
browseable=no;禁止显示目录,相当于windows 2000下的隐藏目录
max connection=2;并发用户连接数

实验三:smbclient的使用
查看本机或者远程机器的共享情况
1、使用命令smbclient -L localhost杳看机共享情况:
#smbclient -L localhost
2、如果要在linux下访问windows下的共享资源,则使用命令:
#smbclient //192.168.1.100/share_dir -u administrator
如果成功则进入:smb:\>

实验四:smbmount的使用
#smbmount //win_ip/win_share /mnt/d -o username=administrator
将远程windows目录挂载到本地目录/mnt/d下

##############################################################################################################

Samba 服务器配置

以RedHat 8.0为例进行Samba 服务器配置:实现 windows98    windows2000    windowsxp    windowsme 与Linux系统在网络上的文件共享!
在安装RedHat 8.0系统后Samba 服务器软件包已经安装到你的系统中了,你可以直接使用!这里就不多说了

1.        建立想要共享的目录。如:/home/public     任何用户都可以进行读写操作
                           /home/software   任何用户只可以进行读操作
                           /home/support     目录只对指定用户可以访问
建立共享目录后要对目录进行系统权限的设定:
             chmod   777   public
                          chmod   777   software
                          chmod   777   support
2.        这一步是进行Samba系统文件的配置:/etc/samba/smb.conf
vi smb.conf  下面是smb.conf 文件的详细信息

[global]  这个段是控制整个samba服务器的参数
Netbios = linux  指定在windows网上邻居中显示的名字
Workgroup = workgroup  指定所属的工作组的名字,最好与windows系统在同一个工作组中,便于访问
Server string = %h Samba Server %v  指定本机的备注
hosts allow = 192.168.0.  192.168.1. 127.  指定允许访问samba的网段
guest account = nobody  访问都默认的登录用户,nobody 是系统自带的用户
Security = user  指定安全级别,一般用 user
encrypt passwords = yes  是否以加密的形式验证口令
smb passwd file = /etc/samba/smbpasswd  指定对samba 用户口令校验的密码文件


[homes]  当用户请求一个共享时,服务器将在存在的共享资源段中去寻找,如果找到匹配的共享资源段, 就使用这个共享资源段。如果找不到,就将请 求的共享名看成是用户的用户名,并在本地的 password文件里找这个用户,如果用户名存在且用户提供的密码是正确的,则以这个home段克隆出一个 共享提供给用户。这个新的共享的名称是用户的用户名,而不是homes,如果home段里没有指定共享路径,就把该用户的宿主目录 (home directory)作为共享路径。 

comment = weboa's home directories
browseable = no
writable = yes


[public]  在客房端显示的共享名
comment = public areas   注视
path = /home/public  指定共享的目录
browseable = yes  表示是否在浏览器中列出共享目录
guest ok = yes  以guest 用户身份访问
public = yes  是否允许公共访问
writable = yes  是否可以进行写操作,这里要提到的就是系统的目录权限永远大于samba设定的权限!这是设的是可写的权限,但这个目录权限是不可写的用户在访问的时候是不能写入的!


[software]
comment = software
path = /home/software
browseable = yes
guest ok =yes
public = yes
# writable = yes
read only = yes


[support]
comment = support
path = /home/software
valid users = userone usertwo userthree  指定可访问目录的用户名可以是多个用户
browseable = yes
public = no    不允许公共访问 
writable = yes


[cdrom] 
  comment = Server Cdrom 
  path = /mnt/cdrom 
  public = yes 
  browseable = yes 
  root preexec = /bin/mount -t iso9660 /dev/cd0 /mnt/cdrom 
  root postexec = /bin/umount /mnt/cdrom 


3.        建立samba用户
useradd userone
passwd userone    设置口令
smbpasswd -a userone  设置samba用户口令,最好与系统用户口令一样
4.启动samba服务器
 cd   /etc/rc.d/init.d/
  ./smb start    启动
  ./smb restart  重新启动
5.        Samba检测程序
Smbclient  -L  主机名
Testparm    自动查找配置文件中的错误  /etc/samba/smb.conf
Smbstatus   查看在线的用户

启动工作站的一台windows系统,在网上邻居里就可以看到 linux的机器了。
常见的问题:
a.        在win98中可以看到LINUX但击进入的时候要输入中令,b.        可是什么口令都提示口令错误!
98以上的系统默认的是以加密的形式发送口令,samba服务器必须以加密的形式接收口令。
要在[gloabl]中加入 encrypt passwords = yes

另一种可能就是,98在登录的时候要以要用samba用户的身份登录,这样访问的时候就不用输入口令了!
c.        在winxp 系统中进入samba服d.        务器一定有一个用户的身份进入,e.        否则不f.        能登录

好了,现在你可以从windows系统上登录samba了!

2008年12月2日星期二

jfs 小略

转:

JFS 概述

日志文件系统如何缩短系统重启时间

developerWorks
文档选项
将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送


级别: 初级

Steve Best (sbest@us.ibm.com)IBM

2000 年 1 月 01 日

如果发生系统崩溃,JFS 提供了快速文件系统重启。通过使用数据库日志技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态,而非日志文件系统却要花上几小时甚至几天才能完成。本白皮书对 JFS 体系结构作了概述,并且描述了可在 developerWorks 网站上找到的 JFS 技术的设计特性、潜在限制以及管理实用程序。

日志文件系统 (JFS) 提供了基于日志的字节级文件系统,该文件系统是为面向事务的高性能系统而开发的。它具有可伸缩性和健壮性,与非日志文件系统相比,它的优点是其快速重启能力:JFS 能够在几秒或几分钟内就把文件系统恢复到一致状态。

虽然 JFS 主要是为满足服务器(从单处理器系统到高级多处理器和群集系统)的高吞吐量和可靠性需求而设计的,JFS 还可用于想得到高性能和可靠性的客户机配置。

体系结构和设计

JFS 体系结构可从磁盘布局特性的角度进行说明。

逻辑卷 
所有文件系统讨论的基础是某种类型的逻辑卷。这可以是一个物理磁盘,或物理磁盘空间的某个子集,例如:一个 FDISK 分区。逻辑卷也称为磁盘分区。

聚集和文件集 
文件系统创建实用程序 mkfs,创建了完全包含在分区内的聚集。聚集是包含一种特定格式的磁盘块阵列,其格式包括超级块和分配映射表。超级块将分区标识成 JFS 聚集,而分配映射表描述聚集内每个数据块的分配状态。格式还包括描述它所必需的初始文件集和控制结构。文件集是可安装的实体。

文件、目录、inode 与寻址结构 
文件集包含文件和目录。文件和目录由 inode 持续表示;每个 inode 描述文件或目录的属性,并作为查找磁盘上文件或目录数据的起始点。JFS 还使用 inode 来表示其它文件系统对象,如描述文件集中每个 inode 的分配状态和磁盘位置的映射表。

目录将用户特定的名称映射到为文件和目录所分配的 inode 上,并且形成传统的命名层次。文件包含用户数据,用户数据中没有隐含任何限制或格式。也就是说,JFS 将用户数据看成是未解释的字节流。根植于 inode 基于盘区的寻址结构用来将文件数据映射到磁盘。聚集超级块和磁盘分配映射表、文件描述符和 inode 映射表、inode、目录以及寻址结构一起表示了 JFS 控制结构或元数据。

日志 
在每个聚集中维护 JFS 日志,并且用来记录元数据的操作信息。日志有一种同样由文件系统创建实用程序设置的格式。聚集内多个安装的文件集可以同时使用一个日志。





回页首


设计特性

JFS 从一开始就设计成完全集成了日志记录,而不是在现有文件系统上添加日志记录。JFS 的许多特性使之区别于其它文件系统。

日志处理 
JFS 提供了改进的结构化一致性和可恢复性,以及比非日志文件系统(例如:HPFS、ext2 和传统 UNIX 文件系统)快得多的系统重启时间。发生系统故障时非日志文件系统容易崩溃,是由于一个逻辑写文件操作通常占用多个媒体 I/O 来完成,且在任何给定时间,可能没有完全反映在媒体上。这些文件系统依靠重启实用程序(也就是 fsck),fsck 检查文件系统的所有元数据(例如:目录和磁盘寻址结构)以检测和修复结构完整性问题。这是一个耗时并且容易出错的过程,在最糟糕的情况下,它还可能丢失或放错数据。

相反,JFS 使用原来为数据库开发的技术,记录了文件系统元数据上执行的操作(即原子事务)信息。如果发生系统故障,可通过重放日志并对适当的事务应用日志记录,来使文件系统恢复到一致状态。由于重放实用程序只需检查文件系统最近活动所产生的运行记录,而不是检查所有文件系统的元数据,因此,与这种基于日志的方法相关的文件系统恢复时间要快得多。

基于日志恢复的其它几个方面也值得注意。首先,JFS 只记录元数据上的操作,因此,重放这些日志只能恢复文件系统中结构关系和资源分配状态的一致性。它没有记录文件数据,也没有将这些数据恢复到一致状态。因此,恢复后某些文件数据可能丢失或失效,对数据一致性有关键性需求的用户应该使用同步 I/O。

面对媒体出错,日志记录不是特别有效。特别地,在将日志或元数据写入磁盘的期间发生的 I/O 错误,意味着在系统崩溃后,要将文件系统恢复到一致状态,需要耗时并且有可能强加的全面完整性检查。这暗示着,坏块重定位是任何驻留在 JFS 下的存储管理器或设备的一个关键特性。

JFS 日志记录的语义如下:当涉及元数据更改的文件系统操作--例如,unlink()--返回成功执行的返回码时,操作的结果已经提交到文件系统,即使系统崩溃了也可以发现。例如,一旦成功删除了文件,即使系统崩溃然后重启,它仍然是删除的并且不会再重新出现。

日志记录风格将同步写入日志磁盘引入每个修改元数据的 inode 或 vfs 操作。(对数据库专家而言,这是一种使用非剥夺缓冲区策略的仅重做的、物理残留映象、提前写的日志记录协议。)在性能方面,与依赖(多个)谨慎的同步元数据写操作以获得一致性的许多非日志文件系统相比,这种方法较好。但是,与其它日志文件系统相比,它在性能上处于劣势。其它日志文件系统,如 Veritas VxFS 和 Transarc Episode,使用不同的日志风格并且缓慢地将日志数据写入磁盘。在执行多个并行操作的服务器环境中,通过将多个同步写操作组合成单一写操作的组提交来减少这种性能损失。JFS 日志记录风格随着时间推移而得到不断改进,现在提供了异步日志记录,异步日志记录提高了文件系统的性能。

基于盘区的寻址结构 
JFS 使用基于盘区的寻址结构,连同主动的块分配策略,产生紧凑、高效、可伸缩的结构,以将文件中的逻辑偏移量映射成磁盘上的物理地址。盘区是象一个单元那样分配给文件的相连块序列,可用一个由 <逻辑偏移量,长度,物理地址> 组成的三元组来描述。寻址结构是一棵 B+ 树,该树由盘区描述符(上面提到的三元组)填充,根在 inode 中,键为文件中的逻辑偏移量。

可变的块尺寸 
按文件系统分,JFS 支持 512、1024、2048 和 4096 字节的块尺寸,以允许用户根据应用环境优化空间利用率。较小的块尺寸减少了文件和目录中内部存储碎片的数量,空间利用率更高。但是,小块可能会增加路径长度,与使用大的块尺寸相比,小块的块分配活动可能更频繁发生。因为服务器系统通常主要考虑的是性能,而不是空间利用率,所以缺省块尺寸为 4096 字节。

动态磁盘 inode 分配 
JFS 按需为磁盘 inode 动态地分配空间,同时释放不再需要的空间。这一支持避开了在文件系统创建期间,为磁盘 inode 保留固定数量空间的传统方法,因此用户不再需要估计文件系统包含的文件和目录最大数目。另外,这一支持使磁盘 inode 与固定磁盘位置分离。

目录组织 
JFS 提供两种不同的目录组织。第一种组织用于小目录,并且在目录的 inode 内存储目录内容。这就不再需要不同的目录块 I/O,同时也不再需要分配不同的存储器。最多可有 8 个项可直接存储在 inode 中,这些项不包括自己(.)和父(..)目录项,这两个项存储在 inode 中不同的区域内。

第二种组织用于较大的目录,用按名字键控的 B+ 树表示每个目录。与传统无序的目录组织比较,它提供更快的目录查找、插入和删除能力。

稀疏和密集文件 
按文件系统分,JFS 既支持稀疏文件也支持密集文件。

稀疏文件允许把数据写到一个文件的任意位置,而不要将以前未写的中间文件块实例化。所报告的文件大小是已经写入的最高块位处,但是,在文件中任何给定块的实际分配,只有在该块进行写操作时才发生。例如,假设在一个指定为稀疏文件的文件系统中创建一个新文件。应用程序将数据块写到文件中第 100 块。尽管磁盘空间只分配了 1 块给它,JFS 将报告该文件的大小为 100 块。如果应用程序下一步读取文件的第 50 块,JFS 将返回填充了 0 的一个字节块。假设应用程序然后将一块数据写到该文件的第 50 块,JFS 仍然报告文件的大小为 100 块,而现在已经为它分配了两块磁盘空间。稀疏文件适合需要大的逻辑空间但只使用这个空间的一个(少量)子集的应用程序。

对于密集文件,将分配相当于文件大小的磁盘资源。在上例中,第一个写操作(将一块数据写到文件的第 100 块)将导致把 100 个块的磁盘空间分配给该文件。在任何已经隐式写入的块上进行读操作,JFS 将返回填充了 0 的字节块,正如稀疏文件的情况一样。





回页首


JFS 内部(潜在)限制

JFS 是完全 64 位的文件系统。所有 JFS 文件系统结构化字段都是 64 位大小。这允许 JFS 同时支持大文件和大分区。

文件系统大小 
JFS 支持的最小文件系统是 16M 字节。最大文件系统的大小是文件系统块尺寸和文件系统 元数据结构支持的最大块数两者的乘积。JFS 将支持最大文件长度是 512 万亿字节(TB)(块尺寸是 512 字节)到 4 千万亿字节(PB)(块尺寸是 4K 字节)

文件长度 
最大文件长度是主机支持的虚拟文件系统最大文件长度。例如:如果主机只支持 32 位,则这就限制了文件长度。

可移动媒体 
JFS 不支持把软盘作为基本文件系统设备。





回页首


标准管理实用程序

JFS 提供创建和维护文件系统的标准管理实用程序。

创建文件系统 
这个实用程序提供 mkfs 命令的 JFS 特定部分,用来在指定的驱动器上初始化 JFS 文件系统。该实用程序在较低级别上操作,并假设文件系统所存在的任何卷的创建/初始化由更高级别的另一个实用程序处理。

检查/修复文件系统 
这个实用程序提供 fsck 命令的 JFS 特定部分。该命令检查文件系统的一致性,修复发现的问题。它也重放日志,把提交的改动应用到文件系统元数据,如果由于日志重放而声明文件系统是干净的,就不会再采取进一步操作。如果文件系统不认为是干净的,这意味着由于某种原因没有完整和正确地重放日志,或者文件系统不能单靠重放日志来恢复到一致状态,那么,就对文件系统执行一遍完整检查。

当执行全部完整性检查时,检查/修复实用程序首要目的是要达到可靠的文件系统状态,以防止将来文件系统崩溃或故障,第二个目的就是面对崩溃时保存数据。这意味着为了达到文件系统的一致性,实用程序可能丢弃数据。具体而言,当实用程序在不做假设的情况下,无法获得所需信息以将结构上不一致的文件或目录恢复到一致状态时,就会废弃数据。当遇到不一致的文件或目录时,就废弃整个文件或目录,而不再试图保存任何部分。任何由删除受损目录所孤立起来的文件或子目录,都放在文件系统根下的 lost+found 目录中。

文件系统检查/修复实用程序重点考虑的因素之一是所需虚存数量。通常,这些实用程序所需的虚存数量由文件系统的大小决定,这是由于所需虚存主要用于跟踪文件系统中个别块的分配状态。随着文件系统增大,块的数量增多,用来跟踪这些块所需的虚存数量也随之增加。

JFS 检查/修复实用程序的设计区别在于其虚存需求由文件系统中文件和目录的数量(而不是由块的数量)所决定。对 JFS 检查/修复实用程序而言,每个文件或目录的虚存大约为每个文件或目录 32 字节,或者对于包含百万个文件和目录的文件系统而言,不论其文件系统大小,虚存需求都是大约 32 兆字节。如同所有其它的文件系统,JFS 实用程序需要跟踪块分配状态,但避免使用虚存方法,而是使用位于实际文件系统中的一小块保留工作区来实现。





回页首


结束语

因为在系统崩溃时,JFS 能提供快速文件系统重启时间,所以它是因特网文件服务器的关键技术。使用数据库日志处理技术,JFS 能在几秒或几分钟之内把文件系统恢复到一致状态。而在非日志文件系统中,文件恢复可能花费几小时或几天。大部分文件服务器用户不能容忍与非日志文件系统相关的停机时间。只有通过转移到日志技术,这些文件系统才能避免需要检查文件系统的所有元数据才能验证文件系统或将其恢复到一致状态这一耗时的过程。



参考资料



关于作者

Steve Best 在德克萨斯州奥斯汀 IBM Software Solutions & Strategy Division 工作,是文件系统开发部门的成员之一。Steve 以前从事操作系统上文件系统、国际化以及安全性领域的开发。目前,Steve 正从事将 JFS 移植到 Linux 的工作。可通过 sbest@us.ibm.com 与他取得联系。