2010年11月25日

由UFS的Soft Updates引申到的

在FreeBSD中开启UFS的Soft Updates,只需要用下的一行命令:
# tunefs -n enable /
禁用:
# tunefs -n disable /
输入这个命令时最好是在单用户模式下进行。
查看UFS是否已开启Soft Updates,只需要输入mount 即可。如
IN[~]>>>mount
/dev/ad0s1a on / (ufs, local, soft-updates)
devfs on /dev (devfs, local, multilabel)
/dev/ad0s1h on /data (ufs, local, soft-updates)
/dev/ad0s1f on /home (ufs, local, soft-updates)
/dev/ad0s1d on /tmp (ufs, local, soft-updates)
/dev/ad0s1g on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)
IN[~]>>>


下面来看下什么是Soft Updates吧.

Soft Updates
的详细资料

有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。 (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据)    从前,默认方法是同步更新这些元数据(meta-data)。 如果一个目录改变了,系统在真正写到磁盘之前一直等待。 文件数据缓存(文件内容)在这之后以非同步形式写入。 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data) 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。 如果崩溃时找不到文件的数据块,fsck(8) 可以找到并且依靠把文件大小设置为 0 来修复文件系统。 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如 rm -r 命令,依次触及目录下的所有文件, 但是每个目录的改变(删除一个文件)都要同步写入磁盘。 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。 同样问题出现大的文件操作上(比如 tar -x)。
第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 mount -o async 默认的方法。所有元数据更新也是通过缓存。 也就是它们会混合在文件内容数据更新中。 这个方法的优点是不需要等待每个元数据更新都写到磁盘上, 所以所有引起元数据更新大的操作比同步方式更快。同样, 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败 (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。 系统再启动时没有机会检查文件系统的状态;inode 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用 fsck 命令来清理(因为磁盘上没有所需要的信息)。 如果文件系统修复后损坏了,唯一的选择是使用 newfs(8) 并且从备份中恢复它。
这个问题通常的解决办法是使用 dirty region logging 或者 journaling 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。
Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘 (“有序的元数据更新”)。这样的结果是,在繁重的元数据操作中, 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。 所以所有的目录操作在写进磁盘的时候首先在内存中执行 (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。 如果系统崩溃了这将导致一个固定的 “日志回朔”: 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后, 唯一的资源分配错误是一个实际是“空闲”的资源的资源被标记为“使用”。 fsck(8) 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 mount -f 强制挂上的文件系统的错误状态是安全的。 为了释放可能没有使用的资源,fsck(8) 需要在过后的时间运行。一个主意是用 后台 fsck:系统启动的时候只有一个文件系统的 快照 被记录下来。fsck 可以在过后运行。所有文件系统可以在“有错误”的时候被挂接, 所以系统可以在多用户模式下启动。接着,后台 fsck 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。 (尽管这样,不用 Soft Updates 的文件系统依然需要通常的 fsck。)
它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会“落后”一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。
来自:http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/configtuning-disk.html

从这里我又开始不知道一件事了:那什么是元数据呢?
我看了一些资料得到的结果是:元数据就类似于文件系统的 i node.

下面是来自一篇blog(请原谅我经您同意就转载您成果!):

什么是元数据(MetaData)

元数据(Meta Date),关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息
在读《Web信息架构》的时候第九章讲到叙词表、受控词表和元数据。当时书中的定义很模糊,所讲的篇幅也少,就没有在意,一直也没有能完全理解。今天在读《锦绣蓝图》的时候第四章中再次提到元数据这个概念。遂多查了些资料认真的理解了一下。
什么是元数据
元数据(Meta Date),关于数据的数据或者叫做用来描述数据的数据或者叫做信息的信息。
这些定义都很是抽象,我们可以把元数据简单的理解成,最小的数据单位。元数据可以为数据说明其元素或属性(名称、大小、数据类型、等),或其结构(长度、字段、数据列),或其相关数据(位于何处、如何联系、拥有者)。

举几个简单的例子:
使用过数码相机的同学都应该知道,每张数码照片都会存在一个EXIF信息。它就是一种用来描述数码图片的元数据。根据EXIF标准这些元数据包括:Image Description(图像描述、来源. 指生成图像的工具 )、Artist(作者)、Make( 生产者)、Model (型号)、….、等等。
生活中我们填写的《个人信息登记表》,包括姓名、性别、民族、政治面貌、一寸照片、学历、职称等等这些就是锁定kent.zhu这个人的元数据。

通常情况下元数据可以分为以下三类:固有性元数据、管理性元数据、描述性元数据
固有性元数据;与事物构成有关的元数据。
管理性元数据;与事物处理方式有关的元数据。
描述性元数据;与事物本质有关的元数据。
当然,并不是说所数据总能清晰的划分在以上3类中。比如:一张由kent拍摄的大小为20K的JPG格式的印着一只小狗的圣诞卡照片。
它的固有性元数据包括:20K、JPG;管理性元数据:kent拍摄、圣诞卡;描述性元数据:狗、小狗、圣诞、照片、圣诞节、…
但是,圣诞卡则可以放在以上任何一个分类中。与事物构成有关(说明这个东东是什么)、与事物处理方式有关(说明这个东东的用途是什么)、与事物本质有关(可以直接用来描述这个东东)。

元数据之于信息架构的意义
元数据是一种很有效的方法,用以确保网站上各种形式的内容确实都能被查找到。比如我们常常为搜索很久之前看到的一张美女图片犯愁,而如果一个图片网站如果信息架构足够好,我们就能凭借我们回忆到的元数据(关于武藤兰的?2000年拍摄的?)清晰的找到。元数据之于信息架构就像是房子的砖瓦,它可以根据需要摆放成不同的信息检索系统。元数据是所有组织系统的基础,从搜索到电子商务网站上的导航系统都强烈的依赖于元数据。
前面提到,元数据实际上是为产品的可查找性(Findability)服务的。而用户在查找信息的时候不会按照机器思维去找(不会输入该照片的ID),而是直接输入关于信息的描述性信息如:“小狗 圣诞卡”。也就意味着在创建关于描述性元数据的时候要尽量的提取出任官关于这个对象所讲述的故事,这些才是人们能记住的和习惯搜索的细节。

我们会发现,机械生成的元数据常常是不靠谱的,如在UCH系统下发布日志的时候系统会自动根据标题进行机械分析生成的一些元数据。
而充分利用手工元数据(handcrafted metadate)是提高可查找性的一个好方法。最常见的例子就是我们见到的Tag。Tag就是一种用户自创的元数据,其特点是无层次结构、自定义。比如这张Flickr照片下的手工元数据就为在Flickr上查找提供了更多的方便。

关于Soft update的性能,在使用中才会真正体会到。
下面的一个连接是关于UFS的一些讨论,觉得很精彩,所以将其放到这里,有空时再去看看。

http://www.freebsdchina.org/forum/viewtopic.php?p=231614&sid=05d01389f9ad8cc7204939739e391c76

在网上看过一句话,觉得很有道理:

如果您想深入理解它,就先让它RUN起来

2010年11月23日

Gentoo安装备忘

之前觉得安装gentoo不是一件容易的事!现在重温下怎样安装gentoo,想使用一下传说中的ext4性能。
下面摘自http://blog.prosight.me/index.php/2009/07/151的一个安装过程
ext4出来了,但是gentoo官方文档并没有具体介绍如何安装带ext4支持的gentoo。 昨天试了一下,记录下来:

1. 事前准备

1a. 设置root密码
# passwd
New password: (输入新密码)
Re-enter password: (再次输入密码)
1b. 启动ssh
/etc/init.d/sshd start
1c. 网络准备
如果启动的时候,发现没有eth0网卡,可能是没有获得到ip地址,而不是网卡没有找到。
输入
# dhcpcd eth0
重新获得ip地址就可以看到网卡找到了

2. 预备磁盘

2a. fdisk分区
# fdisk /dev/sda
常用命令:p 显示当前分区, n 创建新分区
创建boot分区
n创建分区
p选择主分区类型
从第一个柱面开始
+32M 设定boot分区大小为32M
a 建立启动标记
1 选择第一个分区即boot分区为启动分区
如果你再次按p键,你就会注意到,在“Boot”那一列有个*
我们需要把这个分区设置成可启动的。键入a来给分区添加启动标志,然后键入1。如果你再次按p键,你就会注意到,在“Boot”那一列有个*
创建交换分区
方式跟创建boot分区一样
t 更改分区类型为swap, 输入82
保存分区布局
键入w来保存分区布局并退出fdisk。
分区的例子
Device Boot Start End Blocks Id System
/dev/sda1 * 1 5 40131 83 Linux
/dev/sda2 6 6533 52436160 83 Linux
/dev/sda3 6534 8101 12594960 82 Linux swap / Solaris
/dev/sda4 8102 38913 247497390 5 Extended
/dev/sda5 8102 14629 52436128+ 83 Linux
/dev/sda6 14630 38913 195061198+ 83 Linux
sda1 /boot 32M
sda2 / 50G
sda3 swap 12G
sda5 /usr 50G
sda6 /data 184G
2b. 创建文件系统
格式化分区
将sda1格式化为ext3,其余格式化为ext4
# mke2fs -j /dev/sda1
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/sda5
# mkfs.ext4 /dev/sda6
激活交换分区
创建交换分区标志
# mkswap /dev/sda3
激活交换分区
# swapon /dev/sda3
2c.挂载
# mount /dev/sda2 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
如果独立创建/usr分区(emerage 的下载的文件都保存在/usr/src下,所以建议独立分区),则执行
# mkdir /mnt/gentoo/usr
# mount /dev/sda5 /mnt/gentoo/usr

3.安装Gentoo安装文件

3a.安装一个Stage Tarball
解开stage
# cd mnt/gentoo
# tar xvjpf stage3-*.tar.bz2
p表示保留权限
3b. 安装Portage
从网上下载和安装Portage快照
# cd /mnt/gentoo
# links http://www.gentoo.org/main/en/mirrors.xml
选择一个离你最近的镜像,打开snapshots/目录。然后选择最新的Portage快照(portage-latest.tar.bz2)并按D来下载它。
现在按Q来退出浏览器。你现在已经有一个Portage快照保存在/mnt/gentoo里了。
校验Portage快照的完整性
# md5sum -c portage-latest.tar.bz2.md5sum
portage-latest.tar.bz2: OK
解开Portage快照
# tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
3c.配置编译选项
# nano -w /mnt/gentoo/etc/make.conf
CHOST 不需要更改
其他的根据你的机器的配置来,如:
CFLAGS=”-march=core2 -mfpmath=sse,387 -O2 -pipe -fomit-frame-pointer -mmmx -msse -msse2 -msse3″
CXXFLAGS=”${CFLAGS}”
LDFLAGS=”-Wl,-O2″
-march和mtune具体参数的含义参见:http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options

4. 安装Gentoo基本系统

4a.chroot
选择境像站点
# mirrorselect -i -o >> /mnt/gentoo/etc/make.conf
拷贝DNS信息
# cp -L /etc/resolv.conf /mnt/gentoo/etc/
挂载/proc和/dev文件系统
# mount -t proc none /mnt/gentoo/proc
# mount -o bind /dev /mnt/gentoo/dev
进入新的系统环境
# chroot /mnt/gentoo /bin/bash
# env-update
>> Regenerating /etc/ld.so.cache…
# source /etc/profile
# export PS1=”(chroot) $PS1″
4b. 配置Portage
更新Portage树
# emerge –sync
配置USE变量
nano -w /etc/make.conf
配置Locales
nano -w /etc/locale.gen
添加zh_CN.UTF-8 UTF-8
运行
#locale-gen
生成local.gen文件

5. 配置内核

5.a. 时区
cp /usr/share/zoneinfo/PRC /etc/localtime
设置PRC为当前时区
5.b. 安装源码
emerge gentoo-sources
gentoo-sources 为一般用途,只打了一般的安全补丁
hardened-sources 服务器用途, 安全性和稳定性有所提高
5.c. 手动配置内核
安装工具
emerge pciutils
用lspci检查当前系统配置
配置内核
# cd /usr/src/linux
# make menuconfig
根据你的硬件和你的需要选择对应的选项,主要就是网卡和文件系统两方面
因为要支持ext4,特别注意file system中有关ext4的设置。把相关内容都选上
编译内核
之后,使用make && make modules_install来编译内核
安装内核
编译后,执行下面命令来安装内核
cp arch/x86_64/boot/bzImage /boot/kernel-2.6.29-gentoo-r5
其中kernel-2.6.28-gentoo-r9根据你使用的内核和版本来定。 在/usr/src里面可以看到你之前下载的linux内核源码,可以查看到版本号

6. 配置系统

6.a. 文件系统信息
创建/etc/fstab
/etc/fstab使用一种特殊语法格式。每行都包含六个字段。这些字段之间由空白键(空格键,tab键,或者两者混合使用)分隔。每个字段都有自己的含意:
• 第一个字段是对分区的描述,也就是设备文件的路径
• 第二个字段是分区挂载点,也就是分区应该挂载到的地方
• 第三个字段给出分区所用的文件系统
• 第四个字段给出的是挂载分区时mount命令所用的挂载选项。由于每个文件系统都有自己的挂载选项,我们建议你阅读mount手册(man mount)以获得所有挂载选项的列表。多个挂载选项之间是用逗号分隔的。
• 第五个字段是给dump使用的,用以决定这个分区是否需要dump。一般情况下,你可以把该字段设为0(零)。
• 第六个字段是给fsck使用的,用以决定系统非正常关机之后文件系统的检查顺序。根文件系统应该为1,而其它的应该为2(如果不需要文件系统自检的话可以设为0)
另外一个使用了ext4的例子
/dev/sda1 /boot ext3 noauto,noatime 1 2
/dev/sda2 / ext4 noatime 0 1
/dev/sda3 none swap sw 0 0
/dev/sda5 /usr ext4 noatime 0 2
/dev/sda6 /data ext4 noatime 0 2
/dev/cdrom /mnt/cdrom auto noauto,ro 0 0
auto选项可以使mount猜测文件系统(推荐对于可移动设备采用这个选项,因为它们可能采用很多不同的文件系统),而user选项使得非root用户可以挂载光驱。
为了提高性能,大部分用户会添加noatime挂载选项。由于不记录该分区中文件的访问时间(一般来说你并不需要知道它),这个选项能够提高系统速度。
6.b. 网络信息
设定主机名
# nano -w /etc/conf.d/hostname
配置你的网络
# nano -w /etc/conf.d/net
为了输入你自己的IP地址,子网掩码和网关,你需要设置config_eth0和routes_eth0:
手动为eth0设置IP信息
config_eth0=( “192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255″ )
routes_eth0=( “default via 192.168.0.1″ )
如果你使用DHCP,请定义一下config_eth0:
config_eth0=( “dhcp” )
在启动时自动启用网络
# rc-update add net.eth0 default
6.c. 系统信息
设置root密码
# passwd
修改系统信息
# nano -w /etc/rc.conf
比如把默认的编辑器改为vi
设置键盘布局
# nano -w /etc/conf.d/keymaps
设置时钟选项
# nano -w /etc/conf.d/clock
如果你机器上的钟不用UTC,你需要在文件钟加上CLOCK=”local”。否则,你的时钟就有可能出现偏差。

7. 安装必要的系统工具

7.a. 系统日志工具
# emerge syslog-ng
# emerge logrotate
# rc-update add syslog-ng default
7.b. Cron守护进程
# emerge vixie-cron
# rc-update add vixie-cron default
7.c. 文件索引
# emerge slocate
7.e. 网络工具
安装一个DHCP客户端
# emerge dhcpcd

8. 配置引导程序

8a. 使用GRUB
安装GRUB
# emerge grub
尽管现在已经安装完GRUB,我们仍需要为其写一个配置文件,并将其安置到硬盘的主引导记录中,使它能自动引导您新创建的内核。您可以使用nano(或其他可用的编辑器)来创建配置文件/boot/grub/grub.conf:
# nano -w /boot/grub/grub.conf
例如
# 默认选择哪个列表来引导。0表示第一个, 1表示第二个,以此类推。
default 0
# 引导默认列表前等待多少秒
timeout 30
# 使用漂亮、“臃肿”的spalsh图像来增加一点趣味:)
# 如果您没有安装显卡,请将这行注释掉
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Gentoo Linux 2.6.29-r5
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2
# 如果使用ext4格式的分区,需要使用下面的参数
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2 rootfs=ext4
title Gentoo Linux 2.6.29-r5 (rescue)
# 内核镜像(或者操作系统)所在分区
root (hd0,0)
kernel /boot/kernel-2.6.29-gentoo-r5 root=/dev/sda2 init=/bin/bb
# 接下来的四行只有在您与Windows系统进行双启动的情况下才需要。
# 本例中,windows系统位于/dev/sda6。
title Windows XP
rootnoverify (hd0,5)
makeactive
chainloader +1
使用grub-install安装GRUB
为了安装GRUB,您将需要执行grub-install命令。尽管如此,当我们处于chroot的环境时,grub-install并不能正常的 工作。我们还需要创建一个/etc/mtab,在里面列出所有已加载的文件系统。幸运的是,有一个简单的方法来完成这个任务——将/proc /mounts拷贝成/etc/mtab,如果您没有创建一个独立的boot分区,请排除rootfs行。下面的命令在两种情况下都可以正常工作:
# grep -v rootfs /proc/mounts > /etc/mtab
现在我们就可以用grub-install来安装GRUB了:
# grub-install –no-floppy /dev/sda
将ssh加入到启动进程
rc-update add sshd default
8b. 重启系统
# exit
cdimage ~# cd
cdimage ~# umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo
cdimage ~# reboot

2010年11月5日

html&&css

#container { width:400px; color:white; list-style:none; padding-left:0;}
#container li{ float:left; background-color:#292929; border-left:1px solid black; border-right:1px solid #3c3c3c; padding:10px;}
#container li:first-child {border-top: none;}
li:last-child {border-bottom:none;}

上面是一个让ul里面的各个li可以和谐相处的秘决。

一个让我整天脑痛的事就是各li中的字体要怎样才能真正的居中对齐呢?直到今天我才明白,使用padding吧。padding:10px就是将字体四周撑大10px,那它就会只呆在中间了!
还有就是我希望每个li元素间都有一条线隔开。不过当使用border-left/border-right的时候,两个相邻的li元素的线条会重叠,变会很宽的一条。现在不会了,因为有了:
#container li:first-child{border-left:none;}
#container li:last-child{border-right:none;}