显示标签为“Linux/Unix使用笔记”的博文。显示所有博文
显示标签为“Linux/Unix使用笔记”的博文。显示所有博文

2009-05-08

桑梓贴吧视频数据的解决方案

  由于种种问题以及磁盘阵列空间有限,桑梓贴吧的阵列趋近饱和,为了解决这个问题最近稍微研究了一下,根据实际的发现,桑梓贴吧的视频文件有一些在网站后台已经被删除,但是在服务器上的文件却没有被删除。这样一来,我就在猜想这种情况恐怕不少。于是,经过一番考虑,想到了一个方法。



这个方法的要点如下:


  1. 从数据库中查出所有桑梓贴吧的视频文件名记录,导出到一个新的表。
  2. 从视频文件目录下导出所有视频文件名列表,再倒入到一个新的数据库表中。
  3. 对比两个数据库的文件名字段,筛选出不是同时存在于两个数据库之中的数据
  4. 导出多出的文件列表,删除文件。

那么一步一步看。

  第一步:导出桑梓贴吧的视频文件名记录。假设表是address 字段是link那么。我们直接复制整个表到别的数据库。

  第二步:从视频目录下导出所有视频文件名的列表,只需要cd到视频目录然后:
find ./ -exec ls {} \; &;gt /home/temp/filelist.txt

  这样就成功的吧文件列表导出来了。之后再想办法把这个列表导入到一个数据库表中。

  第三步:假设我们导入的数据表是exist那么现在对比找出在两个表中不同时存在的数据:

insert into temp(link)
select link from fileexist
where not exists ( select link from addresswhere address.link = fileexist.link) ;

  这一步会在一个临时表temp中的link字段中插入在两个表中不同时存在的数据,因此再把temp表的字段导出就成为了我们要挑选出的文件了。

  第四步:要删除文件,由于数量众多需要使用xargs命令:为免意外我先移动到其他目录,再行删除:

xargs -i mv {}&;lt /home/ftp/temp.txt ../tempuse

这个命令就是用xargs把文件名传递到{}的位置,移动过去而已。而且不怕列表里有文件不存在。

好了,一下子删了200多G的东西,世界清静了。。。。

2009-04-25

Ubuntu 快速配置

  新装了9.04,很多东西需要重新配置,未免麻烦,就备份一下这个快速配置的过程了:
已经安装完系统了,配好了网络.
首先是添加firefox的一些插件好下东西.
sudo apt-get install compizconfig-settings-manager
安装桌面配置的程序.我喜欢配置各个桌面的快捷键。

在窗口管理器添加右键在当前路径打开终端。
sudo apt-get install nautilus-open-terminal

在窗口管理器以root权限打开当前文件夹:
sudo apt-get install nautilus-gksu

安装基本编译环境:
sudo apt-get install build-essential

接下来安装ATI驱动:
不知道怎么搞的,新的催化剂不能直接gui安装,在我这里得用
sudo sh ati-driver-installer-9-3-x86.x86_64.run --buildpkg Ubuntu/9.04
生成一大堆包以后再安装。
安装需要的c++库和dkms
sudo apt-get install libstdc++5
之后安装所有生成的包:
sudo dpkg -i *.deb
重启到recovery模式,root login后
aticonfig --initial
----------------------------------
OK~~原来还以为可以,结果浪费了我半天时间,事实证明这个在我的X1250下不能用,官方驱动要9.4以后才支持这个版本的xorg,而正好ati在9.4以后不支持HD之外的显卡了,真漂亮。。。9.3装好的成果就是,libglx.so和fglrx_drv.so一个函数名有字符错误,另外一个就是和xorg client的版本不匹配..
而那个受限驱动,装好以后画屏。。
没办法,只能忍受该死的不断黑屏把.以后一定要买N卡!!!!!!!!!!!鄙视一下ATI


接下来编译安装多媒体支持:
参考以前些的两篇帖子:
http://rhingheart.blogspot.com/2009/03/mencoderffmpeg.html
http://rhingheart.blogspot.com/2009/03/flvh264.html

一个ogg的下载地址这里:
http://www.xiph.org/downloads/

另外,还要smplayer可以从这里入手:
http://smplayer.sourceforge.net/downloads.php?tr_lang=en

之后jdk mldonkey等用apt解决吧。
java中文变方块参考这个解决:
cd /usr/lib/jvm/java-1.5.0-sun-1.5.0.15/jre/lib/fonts
sudo mkdir fallback
cd fallback
sudo cp /usr/share/fonts/truetype/arphic/uming.ttc /usr/lib/jvm/java-1.5.0-sun-1.5.0.15/jre/lib/fonts/fallback

Ubuntu 9.04 国内教育网的源

从我这里看,还是中科大的源品质最好,没有出现404,交大有几个页面是404,所以就选择中科大了:

科大:
----------------------------------------
deb http://debian.ustc.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ jaunty-backports restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ jaunty-proposed main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb http://debian.ustc.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty-proposed main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://debian.ustc.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
-----------------------------------------

上交大:
-----------------------------------------
deb http://ftp.sjtu.edu.cn/ubuntu/ jaunty main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ jaunty-backports main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ jaunty-proposed main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ jaunty-security main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu/ jaunty-updates main multiverse restricted universe
deb http://ftp.sjtu.edu.cn/ubuntu-cn/ jaunty main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ jaunty main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ jaunty-backports main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ jaunty-proposed main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ jaunty-security main multiverse restricted universe
deb-src http://ftp.sjtu.edu.cn/ubuntu/ jaunty-updates main multiverse restricted universe
--------------------------------------

ps.ubuntu 9.04的新主题相当不错,启动速度也相当牛B,在我机器上只需要19秒左右就进系统了。。。

2009-02-10

Solaris 10的信号列表和基本常识

以下就是一张比较完整的Solaris的信号列表:


信号名称 编号 默认处理 描述
SIGHUP 1 Exit 挂起(参加termio(7))
SIGINT 2 Exit 中断(参加termio(7))
SIGQUIT 3 Core 退出(参加termio(7))
SIGILL 4 Core 非法指令
SIGTRAP 5 Core 跟踪或断点异常
SIGABRT 6 Core 异常终止
SIGEMT 7 Core 模拟异常
SIGFPE 8 Core 浮点算数运算异常
SIGKILL 9 Exit 杀掉进程,不能被捕获或忽略
SIGBUS 10 Core 总线错误,不对界地址错误
SIGSEGV 11 Core 段错误——通常是访问非法地址空间
SIGSYS 12 Core 错误的系统调用
SIGPIPE 13 Exit 错误管道
SIGALRM 14 Exit 报警时钟
SIGTERM 15 Exit 终止
SIGUSR1 16 Exit 用户定义的信号1
SIGUSR2 17 Exit 用户定义的信号2
SIGHLD 18 Ignore 子进程状态改变
SIGPWR 19 Ignore 电源失效或重新启动
SIGWINCH 20 Ignore 窗口大小改变
SIGURG 21 Ignore 紧急socket情况
SIGPOLL 22 Exit 可以查询的事件(streamio(7))
SIGIO 22 Exit aioread/aiowrite完成
SIGSTOP 23 Stop 停止(不能被捕获或忽略)
SIGTSTP 24 Stop 停止(作业控制)
SIGCONT 25 Ignore 继续
SIGTTIN 26 Stop 停止——tty输入
SIGTTOU 27 Stop 停止——tty输出
SIGVTALRM 28 Exit 时钟报警——setitimer(2)ITIMER_VIRTUAL报警
SIGPROF 29 Exit Profiling报警——setitimer(2)ITIMER_PROF、ITIME_REPROF
SIGXCPU 30 Core 超出了CPU时间限制
SIGXFSZ 31 Core 超出了文件大小限制
SIGWAITING 32 Ignore 并发信号,Solaris10之前的线程库使用
SIGLWP 33 Ignore 内部LWP信号,Solaris10之前的线程库使用
SIGFREEZE 34 Ignore 检查点挂起
SIGTHAW 35 Ignore 检查点继续
SIGLCANCEL 36 Ignore 撤销
SIGLOST 37 Ignore 资源丢失
SIGRTMIN 38 Exit 优先级最低的实时信号
SIGRTMAX 45 Exit 优先级最高的实时信号

  对于信号,Solaris定义了4种默认的处理例程:
  • Exit:终止进程
  • Core:创建进程的内核映像文件并终止进程
  • Stop:挂起进程的执行(通常用于作业控制或调试)
  • Ignore:丢弃信号,不采取任何操作,即使信号被阻塞

实际上,除了SIGKILL和SIGSTOP这两个信号外,程序是可以改变其他信号的处理例程的。这就具体要看程序作者是如何处理的了。

  虽然信号有这么多,但是实际上信号还分做同步信号和异步信号:

  • 同步信号也叫异常信号来自于内核的异常处理例程,担任就是程序内部有问题或者它使用的硬件有问题产生的(这里有问题不是坏掉,比如等待也可是一种)。
  • 异步信号一般来自于用户命令,程序和内核的其他地方,比如我们用kill命令发送信号给进程,或者使用快捷键Control+Z来作业控制等等

2008-12-19

Ubuntu Server console 编译安装apache2 + php5 + mysql5

  Ubuntu的apt安装apache+php+mysql是很轻松,不过ubuntu的apt安装方式弄出来的东西装的目录很分散,此外apache 配置文件也与其他系统上的不一样。所以为了统一管理,还是必须要全部编译安装过。
  首先还是老规矩,先建立mysql用户和网站用户。。。。
--------------------------------------------------------------------------------------------------------------------------------------------
编译和安装mysql:
一般基本编译环境应该都弄好了,但是必须要检查一下有没有装libncurses5-dev。
弄好之后解压开文件就可以开始编译了。
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql
make
make install
之后拷贝配置文件,按照自己的需求从源码包里拷吧。我这样的:
cp support-files/my-large.cnf /etc/my.cnf
之后把可执行文件做一下软连接:
ln -s ./bin/mysql /usr/bin/
ln -s ./bin/mysqladmin /usr/bin/
ln -s ./bin/mysqld_safe /usr/bin/
ln -s ./bin/mysql_con /usr/bin/
ln -s ./share/mysql/mysql.server /usr/bin
ln -s ./share/mysql/mysql.server /etc/init.d/

编译安装的同学应该先cd到mysql的安装路径,否则接下来可能会出现Could not find /fill_help_tables.sql的错误,一般这种情况你可以删除/etc/mysql/my.cnf解决。我这里是因为之前有人装了mysql导致的配置不同才报的错。
接下来创建MySQL授权表
./bin/mysql_install_db --user=mysql
记得把mysql目录下的var调成mysql所有,其他所有文件调成mysql组所有。
之后sudo bin/mysql_safe --use=mysql &
重启系统之后记得把root的密码设置好。

2008-12-10

Ubuntu安装NX

  据说NX是所谓下一代图形远程登录技术,是不是就不知道了,但肯定比直接用vnc强悍的多。上次系统有毛病,装不成功,这次继续。

首先要装好ssh服务。
sudo apt-get install openssh-server

配置:
vi /etc/ssh/sshd_config
该怎么改就改成啥样吧。

配置认证用的密钥:
可以直接用服务器生成再分发或者由客户端生成传到服务器上:
前者:
ssh-keygen -b 4096 -t dsa
生成完以后保存一份公钥为
~/.ssh/authorize_keys
之后分发这份公钥。

后者:
比如用secureCRT生成的公钥,传到服务器上要先转换一下格式:
ssh-keygen -i -f identity.pub > openssh.pubkey
之后还是拷贝到~/.ssh/authorize_keys
即可

接下来就开始安装nx了。
因为nx本身和ssh一样是商业技术,所以我们用freenx
根据ubuntu的wiki,我们这样做:
先添加源:
vi /etc/apt/source.list
因为是ubuntu 8.10,所以安装freenx需要添加这个更新源:

deb http://ppa.launchpad.net/freenx-team/ubuntu intrepid main
deb-src http://ppa.launchpad.net/freenx-team/ubuntu intrepid main
ubuntu 8.04之后的版本直接
sudo apt-get update
sudo apt-get install freenx

装好后先修改一下ssh的配置,因为nx是基于ssh的,所以需要改一些东西,把相应内容设置成如下:
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys2


如果你ssh监听的不是默认的22端口,还需要修改一下nx的设置:
vi /etc/nxserver/node.conf
注意这个配置文件不允许等号之间有空格。

好了,这样nx server就搞定了。剩下就是客户端的问题:
windows下必须要 nomechine的nxclient 1.5版本,据说新版本无法连接freenx的服务器。
可以到http://www.industrial-statistics.com/info/nxclients?IndStats=bbf349f90a518f5a54f290e887d9c768下载。
我这里用windows 1.5.0 build 114是不能用的。但是windows 1.5.0 build 103可以用。
至于那个windows 1.5.0 build 106就没有试了。

在使用上,freenx server默认安装好使用的是standard NoMachine key来进行认证。很明显,只需要保持默认设置输入密码就可以登录了。先体验一把美妙的安全的gui远程界面吧。
不过如果ssh设置禁用密码认证的话就比较麻烦。而且有时候还需要使用用户自己的公钥来认证。另外,因为默认使用,如果一旦客户使用若口令的话无疑是一种大风险。
这样就需要进行如下配置:
sudo dpkg-reconfigure freenx-server
选择create new custom key
之后
su root
cd /var/lib/nxserver/home/custom_keys
cp client.id_dsa.key /home/testuser/.ssh/nx_client.id_dsa.key

这样就把生成的key拷贝出来了。不过由于权限问题不能下载,所以重新分配一下权限:
sudo chmod 644 /home/testuser/.ssh/nx_client.id_dsa.key
之后分发到你需要登录此服务器的电脑上,在client那里导入这个key就可以登录了。

  不过这里我还是没能解决ssh公钥验证登录的要求。因为nxclient只能导入一个密钥。而那个密钥,应该是nx这个用户home目录下的.ssh目录中的公钥,对应的是nx帐户的私钥authority_keys2,但是,问题在于按照nx的模式,应该是先登录到主机用nx的用户。之后再转成各个帐户的session。所以这里不能通过修改那个customkey来实现其他帐户的ssh验证登录。
不过目前我了解的只是nx的表面上的东西,也许其他设置能够配置出我们的需求吧。

最后上传一张google到的nx的架构图:

2008-12-09

Ubuntu 使用笔记更新

  之前为了学习的目的装的ubuntu结果变成了主要操作系统了。但是当时分区的情况不足以用的爽,于是就全盘格了重新规划分区。
  这一次使用ubuntu有了经验,安装东西明显知道原理了。不过还是选择了不少新的东西。

首先ATI的显卡驱动。
  虽然之前很麻烦,不过如果是刚装好的操作系统,直接装就可以了。重启以后
sudo aticonfig --initial
之后就可以了。

opera:
  这个东西前一篇帖子有介绍。新的opera的字体机制让我终于在linux下看到了漂亮的opera。。。。

mldonkey:
  传说中的最快的p2p下载软件。支持各种协议,又能同时连接多个edonkey server似乎很无敌的样子,不过装起来比较麻烦:
先去项目官方页面:http://mldonkey.sourceforge.net/Main_Page
下个源码或者包回来安装。
再弄个gui前端sancho:
装好以后稍微配置一下就好了。
此外,如果不想要gui的话直接用浏览器输入localhost:4080也可以用网页管理mldonkey

自己编译mplayer和ffmpeg:
  这两个东西其实都不大好编译,主要是包依赖关系相当复杂,不过ubuntu下还是好解决的。去apt里面看看它依赖哪些包。你装上就是。另外还有一个关键的问题是,那个x264和libx264好像不是一个东西,必须要装x264才能用。最后一点就是如果没有编译mplayer的gui的话一些参数是不能用的。

  开始编译的时候如果需要libdvdnav和libdvdread的支持,可以编译libdvdnav libdvdread,不过这个东西新版的编译比较不同,先装好autoconf包。
之后sh autogen.sh再之后
make &&make install
  安装了dvdnav之后就可以使用dvd的菜单功能了。这里只需要在编译mplayer的时候增加一个个参数 --enable-dvdnav
注意的是,如果使用dvdnav的话两者都要是svn的新版。

2008-11-15

Solaris10 05/08 在服务器上安装的管理 Part.2

  昨天手工之后没有检查,结果今天刚开始配置就遇到问题了,tar不支持gzip,没有make等等,原来安装的时候选了核心组件版本,结果现在很多包都要装过。

  还是老规矩直接上http://www.sunfreeware.com/去下载包,安装就直接用:

pkgadd -d filename

安装好。装好后记得要修改一下系统变量:

vi /etc/profile

添加下面蓝色的

#ident "@(#)profile 1.19 01/03/13 SMI" /* SVr4.0 1.3 */
# The profile that all logins get before using their own .profile.
trap "" 2 3

export LOGNAME PATH

PATH=/usr/local/bin:/usr/local/sbin: /usr/bin:/usr/sbin:/usr/ccs/bin;

expotr PATH


改完以后登录的用户的path都变成上面设置的了,不过如果你su到root的话。他的path却还是/usr/bin /usr/sbin,难度root账户的path设置无效了吗?不是,其实是这样:


如果以root用户身份登录或者用 su - 命令进行切换,则修改 home目录下.profile是管用的. 如果是简单的 用 su 进行切换, 则系统保留除 PATH之外的所有环境变量, PATH被设为 /etc/default/su 中的 SUPATH ,缺省时为/usr/sbin:/usr/bin
所以,如果要让PATH还是你设置的那个你就需要用su -命令来switch user。

此外,一个一定要注意的地方是,默认gun的那些包安装都会把执行文件装到/usr/local/bin下面,而sun自带的相同名称的软件都会放到/usr/bin下面,所以,要谨防因为调用错了程序而导致的奇怪问题。因为我一般都用gun版本的,所以只要保证path里面/usr/local/bin在后者之前即可。

之后编译安装mysql,这里,我遇到的问题是出现了libstdc++.so.6 找不到文件的错误,其实就是make的时候它搜寻的是/usr/lib/libstdc++.so.6但是在Solaris里面,这个文件在/usr/local/libstdc++.so.6,所以只需要做一个软连接就搞定了。

安装完之后,为了能够使用SMF来管理mysql的启动,需要做这些:
在/var/svc/manifest/network目录建立文件mysql.xml内容



<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">

<!-- MySQL Manifest - cuddletech, benr, August 28th, 2005 -->

<service_bundle type='manifest' name='cuddletech:mysql'>

<service
name='application/mysql'
type='service'
version='4'>

<create_default_instance enabled='false'/>

<single_instance/>

<dependency name='fs-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local'/>
</dependency>

<exec_method
type='method'
name='start'
exec='/etc/sfw/mysql/mysql.server start'
timeout_seconds='60' />

<exec_method
type='method'
name='stop'
exec='/usr/sfw/bin/mysqladmin shutdown'
timeout_seconds='60' />

<exec_method
type='method'
name='refresh'
exec='/usr/sfw/bin/mysqladmin refresh'
timeout_seconds='60' />

<stability value='Unstable' />

<template>
<common_name>
<loctext xml:lang='C'>MySQL Server</loctext>
</common_name>
<documentation>
<doc_link name='mysql.org'
uri='http://dev.mysql.com/doc/mysql/en/index.html' />
</documentation>
</template>
</service>

</service_bundle>


之后使用svccfg验证并导入配置文件
#svccfg validate /var/svc/manifest/network/mysql.xml
#svccfg import /var/svc/manifest/network/mysql.xml
这样就ok了。
基本的配置mysql:
获得配置文件:
cp /opt/mysql/share/mysql/my-large.cnf /etc/my.cnf
之后初始化数据库:
/opt/mysql/bin/mysql_install_db --user=mysql
之后启动数据库:
/opt/mysql/bin/mysqld_safe --user=mysql &
测试关闭数据库:
/usr/sfw/bin/mysqladm -u root shutdown
如果要使数据库的编码改为utf8
那么
vi /etc/my.cnf
在[client]后面添加一行
default-character-set=utf8
在[mysqld]之后添加同样的一行。
default-character-set=utf8
之后启动以后mysql -uroot
show variables like 'character%';
会显示如下结果
+--------------------------+----------------------------+
Variable_name Value
+--------------------------+----------------------------+
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
+--------------------------+----------------------------+
不过可惜的是,这样加使用mysqladmin就会提示
/usr/sfw/bin/mysqladmin: unknown variable 'default-character-set=utf8'
暂时没有去找新的方法。

接下来安装apache,参考之前的一篇文章。装好之后同样为了整合到SMF,这样做:

vi /var/svc/manifest/network/apache2.xml



<?xml version="1.0"?>

<!-- Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. ident "@(#)http-apache.xml 1.2 04/11/11 SMI" -->

<service_bundle name="SUNWapchr:apache" type="manifest">

<service name="network/http" type="service" version="1">

<!-- Because we may have multiple instances of network/http provided by different implementations, we keep dependencies and methods within the instance. -->

<instance name="apache" enabled="false">
<dependency name="physical" type="service" restart_on="error" grouping="optional_all">
<service_fmri value="svc:/network/physical:default">
</dependency>

<exec_method name="start" type="method" timeout_seconds="60" exec="/etc/init.d/apache start">

<exec_method name="stop" type="method" timeout_seconds="60" exec="/etc/init.d/apache stop">

<exec_method name="refresh" type="method" timeout_seconds="60" exec="/etc/init.d/apache restart">

<property_group name="httpd" type="application">
<stability value="Evolving">
<propval name="ssl" type="boolean" value="false">
</property_group>

<property_group name="startd" type="framework">
<!-- sub-process core dumps shouldn't restart session -->
<propval name="ignore_error" type="astring" value="core,signal">
</property_group>

</instance>

<stability value="Evolving">

<template>
<common_name>
<loctext lang="C">
Apache HTTP server
</loctext>
</common_name>
<documentation>
<manpage title="apache" section="1M">
<doc_link name="apache.org" uri="http://httpd.apache.org">
</documentation>
</template>
</service>

</service_bundle>



之后导入svccfg:
# svccfg validate /var/svc/manifest/network/apache2.xml
# svccfg import /var/svc/manifest/network/apache2.xml

2008-11-14

Solaris10 命令行下卸载StarSuit

  因为装了些没用的东西,所以现在要卸载,在命令行下,要做到这个,我们需要做一些工作:
这是官方给的说明文件:
De-Installation
Do not delete the StarOffice files from the file system. We strongly recommend to use the StarOffice Java setupor the pkgrm tool to de-install StarOffice. The Solaris package repository would become inconsistent when youremove the StarOffice files via rm -r .

  • Become root if necessary
    su -
  • Create a file 'so_packages' with all StarOffice related Solaris packages
    pkginfo -x cut -f1 -d " " grep staroffice > /tmp/so_packages
  • For a silent installation of StarOffice it is necessary to create an admin file. This avoids recurringqueries at the installation.
    echo action=nocheck > /tmp/admin
    echo conflict=nocheck >> /tmp/admin
    echo rdepend=nocheck >> /tmp/admin
  • Remove all packages listed in the file
    pkgrm -a /tmp/admin -n `cat /tmp/so_packages`
  • There are a number of packages in the StarOffice installation set does not use the term 'staroffice'.These packages including a font server (SUNWfreetype2) and an Ababas D database server(SUNWadabas). To remove these packages :
    pkgrm SUNWfreetype2 SUNWadabas
    Depending on your Java environment you have to deinstall following three packages which includingthe Java Runtime Environment which was installed by the StarOffice installer. De-Installing thesepackages could damage you Java environment.
    pkgrm SUNWj5rt SUNWj5man SUNWj5cfg

Solaris10 05/08 在服务器上安装的管理 Part.1

  之前一直使用01/08版的,这次为了直接支持ZFS boot特地弄了个05/08版的,结果变化还真不少,而且能在核心机房的时间不多,所以还是需要一些配置的。
  安装过程之中设置好网络,装好后立马把SSH配置调整好,之后立马添加普通用户:
useradd -u 22222 -g adm -d /export/home/testuser -m -s /usr/bin/bash testuser
  这样一来就可以远程用SSH登录了,记得修改一下root账户的默认shell
vi /etc/passwd
  之后收起光盘走人了。。。。

DNS配置
  回到自己的机器上,SSH过去,好了,现在我们开始修改吧。首先,有时候你会发现,虽然在安装过程中指定了DNS服务器,但是在实际装好后DNS用的/etc/resolv.conf这个文件更本不存在。据说这是Solaris 2系列历史上遗留下来的毛病,即安装过程中你可以指定 DNS服务器 和 默认路由,但他不会自动保存。必须在安装完成系统之后手工建立和设定/etc/resolv.conf 和 /etc/defaultrouter 两个文件。不过我这里倒是有后者。
  要使DNS生效,还需要一番配置,首先是resolv.conf文件:
vi /etc/resolv.conf
--------------------------content to be added--------------------------------
; Sample resolv.conf file for the machine polaris
domain doc.com
; try local name server
nameserver 127.0.0.1
; if local name server down, try these servers
nameserver 123.45.6.1
nameserver 111.22.3.5
; sort the addresses returned by gethostbyname(3c)
sortlist
130.155.160.0/255.255.240.0
130.155.0.0
--------------------------------------------------------------------------

以上内容是从docs.sun.com转来的范例,注意domain后面的域名必须马上回车不允许任何空白字符出现。一般如果只需制定dns服务器的话只用nameserver。
编辑完后保存,下一步,编辑/etc/nsswitch.conf找到host这一行改成这样:
hosts: files dns
当然,根据使用的名字服务不同官方给出的配置是这样的:
-----------------------------------------------------------------------------
Specify DNS as a source of hosts information.
DNS can be the only source or an additional source for the hosts information. Locate the hosts line and use DNS in one of the ways shown below:
hosts: files dns
or
hosts: nisplus dns [NOTFOUND=return] files
or
hosts: dns nisplus [NOTFOUND=return] files
Do not use the above syntax for NIS clients, since they will be forced to search for unresolved names twice in DNS.
----------------------------------------------------------------------

最后启动服务:
svcadm enable network/dns/client
这样就可以使用DNS了。
Solaris解析域名的顺序是这样的:

  1. 查询/etc/nsswitch.conf以确定解析顺序,因为之前我们制定的是file dns ,所以先根据本地配置来查询,之后才是dns服务器,因此接下来
  2. 查询/etc/hosts如果没有再下来
  3. 从/etc/resolv.conf查询dns服务器和搜索顺序。之后提交请求。

接下来,由于我发现系统的时间不对。于是同步一下,有两种方法:
rdate time-a.nist.gov
ntpdate time-a.nist.gov


接下来处理一下服务,因为之前我害怕有软件包没有装好,之后还得回来装,所以就安装了entire版本的。现在需要去除一些服务。
online         10:33:13 svc:/application/graphical-login/cde-login:default
online 19:30:36 svc:/network/cde-spc:default
online 10:33:39 svc:/network/rpc/cde-ttdbserver:tcp
online 10:33:39 svc:/network/rpc/cde-calendar-manager:default
online 10:33:41 svc:/application/cde-printinfo:default

第一个cde-login是cde登录的服务,我们只用console,所以关了。
第二个的解释是:The CDE Subprocess Control Service is a network daemon that accepts requests from clients to execute commands and launch applications remotely.貌似它会打开6112端口,我试着关闭了,不影响ssh,所以也disable。
第三个是ToolTalk database server,tooltalk是xstart的一个组件,而这个server干下面这些活
  1. ToolTalk objects specs.
  2. ToolTalk session IDs of sessions with clients that have joined a file using the tt_file_join call.
  3. File-scoped messages that are queued because the message disposition is TT_QUEUED and a handler that can handle the message has not yet been started.

所以也禁用了。

第五个看了就知道没用。

第六个是CDE Print Viewer,The CDE Print Viewer program provides a graphical interface that displays the status of print queues and print jobs。所以也禁用了。

为什么要禁用这些?原因很简单,第一我不用gui 第二,你google一下就会发现这些服务都有漏洞报告,虽然比较早,但是也未必就被修复了。

要管理这些服务在Solaris里面非常方便,直接使用SMF管理。
inetadm :提供观察或配置由 inetd 控制的服务的功能
svcadm :提供执行常见服务管理任务(如启用、禁用或重新启动服务实例)的功能
svccfg :提供显示和处理服务配置系统信息库内容的功能
svcprop :从服务配置系统信息库中检索属性值,并采用适用于 shell 脚本的输出格式
svcs :提供服务配置系统信息库中所有服务实例的服务状态的详细视图

这样稍微处理了一下之后系统就干净了。可以开始接下来的工作了。

2008-11-12

一篇关于raidz配置的文章

  WHEN TO (AND NOT TO) USE RAID-Z


RAID-Z is the technology used by ZFS to implement a data-protection scheme
which is less costly than mirroring in terms of block
overhead.

Here, I'd like to go over, from a theoretical standpoint, the
performance implication of using RAID-Z. The goal of this technology
is to allow a storage subsystem to be able to deliver the stored data
in the face of one or more disk failures. This is accomplished by
joining multiple disks into a N-way RAID-Z group. Multiple RAID-Z
groups can be dynamically striped to form a larger storage pool.

To store file data onto a RAID-Z group, ZFS will spread a filesystem
(FS) block onto the N devices that make up the group. So for each FS
block, (N - 1) devices will hold file data and 1 device will hold
parity information. This information would eventually be used to
reconstruct (or resilver) data in the face of any device failure. We
thus have 1 / N of the available disk blocks that are used to store
the parity information. A 10-disk RAID-Z group has 9/10th of the
blocks effectively available to applications.

A common alternative for data protection, is the use of mirroring. In
this technology, a filesystem block is stored onto 2 (or more) mirror
copies. Here again, the system will survive single disk failure (or
more with N-way mirroring). So 2-way mirror actually delivers similar
data-protection at the expense of providing applications access to
only one half of the disk blocks.

Now let's look at this from the performance angle in particular that
of delivered filesystem blocks per second (FSBPS). A N-way RAID-Z
group achieves it's protection by spreading a ZFS block onto the N
underlying devices. That means that a single ZFS block I/O must be
converted to N device I/Os. To be more precise, in order to acces an
ZFS block, we need N device I/Os for Output and (N - 1) device I/Os for
input as the parity data need not generally be read-in.

Now after a request for a ZFS block has been spread this way, the IO
scheduling code will take control of all the device IOs that needs to
be issued. At this stage, the ZFS code is capable of aggregating
adjacent physical I/Os into fewer ones. Because of the ZFS
Copy-On-Write (COW) design, we actually do expect this reduction in
number of device level I/Os to work extremely well for just about any
write intensive workloads. We also expect it to help streaming input
loads significantly. The situation of random inputs is one that needs
special attention when considering RAID-Z.

Effectively, as a first approximation, an N-disk RAID-Z group will
behave as a single device in terms of delivered random input
IOPS. Thus a 10-disk group of devices each capable of 200-IOPS, will
globally act as a 200-IOPS capable RAID-Z group. This is the price to
pay to achieve proper data protection without the 2X block overhead
associated with mirroring.

With 2-way mirroring, each FS block output must be sent to 2 devices.
Half of the available IOPS are thus lost to mirroring. However, for
Inputs each side of a mirror can service read calls independently from
one another since each side holds the full information. Given a
proper software implementation that balances the inputs between sides
of a mirror, the FS blocks delivered by a mirrored group is actually
no less than what a simple non-protected RAID-0 stripe would give.

So looking at random access input load, the number of FS blocks per
second (FSBPS), Given N devices to be grouped either in RAID-Z, 2-way
mirrored or simply striped (a.k.a RAID-0, no data protection !), the
equation would be (where dev represents the capacity in terms of
blocks of IOPS of a single device):

Random
Blocks Available FS Blocks / sec
---------------- --------------
RAID-Z (N - 1) * dev 1 * dev
Mirror (N / 2) * dev N * dev
Stripe N * dev N * dev


Now lets take 100 disks of 100 GB, each each capable of 200 IOPS and
look at different possible configurations; In the table below the
configuration labeled:

"Z 5 x (19+1)"

refers to a dynamic striping of 5 RAID-Z groups, each group made of 20
disks (19 data disk + 1 parity). M refers to a 2-way mirror and S to a
simple dynamic stripe.


Random
Config Blocks Available FS Blocks /sec
------------ ---------------- ---------
Z 1 x (99+1) 9900 GB 200
Z 2 x (49+1) 9800 GB 400
Z 5 x (19+1) 9500 GB 1000
Z 10 x (9+1) 9000 GB 2000
Z 20 x (4+1) 8000 GB 4000
Z 33 x (2+1) 6600 GB 6600

M 2 x (50) 5000 GB 20000
S 1 x (100) 10000 GB 20000


So RAID-Z gives you at most 2X the number of blocks that mirroring
provides but hits you with much fewer delivered IOPS. That means
that, as the number of devices in a group N increases, the expected
gain over mirroring (disk blocks) is bounded (to at most 2X) but the
expected cost in IOPS is not bounded (cost in the range of [N/2, N]
fewer IOPS).

Note that for wide RAID-Z configurations, ZFS takes into account the
sector size of devices (typically 512 Bytes) and dynamically adjust
the effective number of columns in a stripe. So even if you request a
99+1 configuration, the actual data will probably be stored on much
fewer data columns than that. Hopefully this article will contribute
to steering deployments away from those types of configuration.

In conclusion, when preserving IOPS capacity is important, the size of
RAID-Z groups should be restrained to smaller sizes and one must
accept some level of disk block overhead.

When performance matters most, mirroring should be highly favored. If
mirroring is considered too costly but performance is nevertheless
required, one could proceed like this:

Given N devices each capable of X IOPS.

Given a target of delivered Y FS blocks per second
for the storage pool.

Build your storage using dynamically striped RAID-Z groups of
(Y / X) devices.

For instance:

Given 50 devices each capable of 200 IOPS.

Given a target of delivered 1000 FS blocks per second
for the storage pool.

Build your storage using dynamically striped RAID-Z groups of
(1000 / 200) = 5 devices.

In that system we then would have 20% block overhead lost to maintain
RAID-Z level parity.

RAID-Z is a great technology not only when disk blocks are your most
precious resources but also when your available IOPS far exceed your
expected needs. But beware that if you get your hands on fewer very
large disks, the IOPS capacity can easily become your most precious
resource. Under those conditions, mirroring should be strongly favored
or alternatively a dynamic stripe of RAID-Z groups each made up of a
small number of devices.


2008-10-27

说说多种字符编码的统一处理

  学校目前有几台阵列,几台linux服务器,几台windows服务器,还有一台FreeBSD服务器,各种服务器之间存储文件使用的编码是不一样的,而且这些服务器上挂的不同站点使用的字符编码也是不一样的。早期没有按照统一的标准制作,结果现在酿下的苦果就是我们这些继承人在处理问题的时候常常被编码问题所困扰。也许你也遇到了这种情况。最近正好搜了一些资料。了解了一些东西。共享出来。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
预备知识:

  1. 字符集和编码
  2.   在Linux上经常使用的字符集是ISO 8859系列的字符集.它包含了10个 多语言的单字节编码字符集.它们分别是,

    字符集 涵盖语言
    ISO 8859-1(Latin1) 拉丁一字符集, 包含绝大多数的欧洲语言, 例如French(fr), Spanish (es), Catalan (ca), Basque (eu), Portuguese (pt), Italian (it), Albanian (sq), Rhaeto-Romanic (rm), Dutch (nl), German (de), Danish (da), Swedish (sv), Norwegian (no), Finnish (fi), Faroese (fo), Icelandic (is), Irish (ga), Scottish (gd), English (en), Afrikaans (af) 和 Swahili (sw).影响了美洲, 澳洲和非洲.
    ISO 8859-2(Latin2) 拉丁二字符集, 包含了中欧和东欧的语言:Czech (cs), Hungarian (hu), Polish (pl), Romanian (ro), Croatian (hr), Slovak (sk), Slovenian (sl), Sorbian.
    ISO 8859-3(Latin3) 拉丁三字符集, 包括: Esperanto (eo) and Maltese (mt)
    ISO 8859-4(Latin4) 拉丁四字符集, 包括: Estonian (et), 巴尔地克 Latvian (lv) 和 Lithuanian (lt), Greenlandic (kl) , Lappish.
    ISO 8859-5(西里尔语) Bulgarian (bg), Byelorussian (be), Macedonian (mk), Russian (ru), Serbian (sr)
    ISO 8859-6(阿拉伯语) 阿拉伯语(ar)
    ISO 8859-7(希腊语) 希腊语(el)
    ISO 8859-8(希伯来语) Hebrew (iw) 和Yiddish (ji)
    ISO 8859-9(Latin5) 重排了Latin1, 用土耳其语的几个字母做了替换
    ISO 8859-9(Latin6) 重排了Latin4, 去掉了某些符号, 增加了Inuit等
    ISO 8859-11(泰国语) 泰国语(th)
    ISO 8859-12 Celtic
    ISO 8859-13(Latin7) Baltic Rim 和 Lativian(lv)
    ISO 8859-14(Latin8) Gaelic 和 Welsh (cy)
    ISO 8859-15(Latin9) Latin1的变种, 修改了某些字母

      双字节字符集主要包含中文,日文和韩文.它由前导字节(Lead Byte) 和尾部字节(Trail Byte)构成, 由于一个字符采用了两个字节, 在软件的 国际化方面又增加了一些麻烦, 比如在显示上, 光标的位置不能位于汉字 之间, 删除和移动时必须是整字操作等, 在输入上, 一般需要预编辑服务器 才能输入汉字. 下表列出了中日韩语言编码的有关信息:

    语言 字符集 代码页 前导字节范围 尾部字节范围
    简体中文 GB2312-1980 CP936 0xA1-0xF7 0xA1-0xFE
    GBK 0x81-0xFE 0x40-0x7E, 0x80-0xFE
    中文繁体 BIG-5 CP950 0x81-0xFE 0x40-0x7E, 0xA1-0xFE
    日文 Shift-JIS CP932 0x81-0x9F, 0xE0-0xFC 0x40-0xFC(0x7F除外)
    韩文 KSC-5601-1987 CP949 0x81-0xFE 0x41-0x5A,0x61-0x7A,0x81-0xFE
    KSC-5601-1992 CP1361 0x84-0xD3
    0xD8
    0xD90-0xDE
    0xE0-0xF9
    0x41,0xFE
    0x41-0x7E
    0x81-0xFE
    0x31-0x7E

      信息产业部和国家质量技术监督局联合制定了两项中文信息处理基础性国家标准,为解决偏、生汉字的输入提供了方案。其中GB18030- 2000《信息技术和信息交换用汉字编码字符集、基本集的扩充》,为强制性 国家标准.它收录了2.7万多个汉字,总编码空间超过150万个码位,为彻底 解决邮政、户政、金融、 地理信息系统等迫切需要的人名、地名用字问题 提供了解决方案,也为汉字研究、古籍整理等领域提供了统一的信息平台基础。 这项标准还同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字.字符 集编码范围是:

    字节数 编码空间 码位数目
    单字节 0x00-0x80 129
    双字节 第一字节:0x81-0xFE
    第二字节:0x40-0x7E,0x80-0xFE
    23940
    四字节 四字节范围分别是:
    0x80-0xFE,0x30-0x39,0x81-0xFE,0x30-0x39
    1587600

      香港特别行政区也对Big5编码提出了"香港增补字符集", 其目的,是 收纳香港特区政府及市民在中文电子通讯中有需要使用的字符,来补充目前 大五码和ISO10646编码标准内并未包含的字符,以作为一个通用的中文界面, 方便大家能准确地以中文进行电子通讯。香港增补字符集有两套编码方案, 一套适用於大五码系统,另一套适用於ISO10646平台。香港增补字符集的大 五码版本,实际上是政府通用字库的增订版。ISO10646国际编码标准目前并 未包含香港增补字符集内的所有字符。目前尚未收纳在ISO10646内的香港增 补字符集字符,均已提交国际标准化组织管辖下的表意文字小组,以考虑是 否纳入ISO10646日后的新增版本内.

  3. 多字节字符(Multibyte)和宽字符(WideChar)的使用
  4.   我们平时见到的以文本方式存在的字符都是多字节字符, 它主要用于文件存储和网络上的以流(Stream)的方式传输.一个GB编码的汉字需要两个字节.多字节字符的缺点是在中文处理上不方便, 比如汉字的删除和光标的移动都会有半汉字问题.为了文本处理的方便,在内部操作上通常是把汉字 与英文的混和字符串先转换成等宽度的字符串, 即宽字符,为软件的内部处理 提供方便.

     glibc2.1.x中多字节字符串和宽字符串的转换有时有问题.在X下还可以 使用另外一种方式完成转换, 即使用XmbTextListToTextProperty()和 XwcTextPropertyToTextList() 联合完成转换.

  5. Unicode
  6.   目前所使用的Unicode 是一种16位字宽的字符编码, 它由非赢利的计算机 组织Unicode研讨会维护和改进.它起源于Xerox和Apple之间的合作研究.几 个公司组成了一个非正式的论坛, 接着IBM, Microsoft等公司迅速加入. Unicode研讨会在1990年发表了Unicode标准版本1, 同时国际标准化组织完成 了一种类似的编码----ISO 10646.因为没有必要存在两套标准, 所以Unicode 研讨会和国际标准化组织在1991到1992合二为一. 1994年, 中国和日本开始了基于ISO10646上的国家标准进行工作.现在, Unicode 开始用在许多产品中.

      Unicode包含了当今计算机领域中广泛使用的所由字符, 如世界上大部分 的书面语言, 印刷字符, 数字和技术符号, 地理图形和标点符号.由于Unicode 的一致性, 它在大多数情况下都可能简化软件的国际化过程.它取消了处理多种代码页的必要, 并且由于是16位编码, 因此由双字节字符集所引起的额外处理也不必要了.

      但是, Unicode作为一种编码也有它的缺陷, 比如编码的位置与排序无关, 所以使软件支持Unicode仅仅是国际化的第一步, 实际情况中还需要与语言相关的信息和规则.所以Unicode一般作为程序的内部处理编码, 必须提供与其它编码的双向转换表.

      最后需要说明的是,虽然使用Unicode会使普通的英文文本大两倍, 但是使用Unicode的整个系统却不会增加太大,因为系统存放的文件大部分是二进制文件格式, 同时, 使用针对Unicode的压缩方式,可以把文件压缩成和使用对应的8位正文一样大小。

-----------------------------------------------------------------------------  

UCS 和 ISO 10646?

国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.

UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和 克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.

ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane, BMP). 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.

UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的.

什么是 Unicode?

历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.

那么 Unicode 和 ISO 10646 不同在什么地方?

  Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字.

  Unicode 标准额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(比如阿拉伯语)表达形式的算法, 处理双向文字(比如拉丁与希伯来文混合文字)的算法和排序与字符串比较所需的算法, 以及其他许多东西.

  另一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准一样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 连接其他 ISO 标准的实现, 比如 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 比如 ISO 14651 是关于 UCS 字符串排序的.

  考虑到 Unicode 标准有一个易记的名字, 且在任何好的书店里的 Addison-Wesley 里有, 只花费 ISO 版本的一小部分, 且包括更多的辅助信息, 因而它成为使用广泛得多的参考也就不足为奇了. 然而, 一般认为, 用于打印 ISO 10646-1 标准的字体在某些方面的质量要高于用于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但一些提供的样例字形有显著的区别. ISO 10646-1 标准同样使用四种不同的风格变体来显示表意文字如中文, 日文和韩文 (CJK), 而 Unicode 2.0 的表里只有中文的变体. 这导致了普遍的认为 Unicode 对日本用户来说是不可接收的传说, 尽管是错误的.

什么是 UTF-8?

首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0x00.

在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '\0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.

在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法.

UTF-8 有一下特性:

  • UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.
  • 所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
  • 表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.
  • 可以编入所有可能的 231个 UCS 代码
  • UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.
  • Bigendian UCS-4 字节串的排列顺序是预定的.
  • 字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.

下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.

//你看不懂这一段的话请看utf-8官方解释:

What is UTF-8?

UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.

UTF-8 encodes each Unicode character as a variable number of 1 to 4 octets, where the number of octets depends on the integer value assigned to the Unicode character. It is an efficient encoding of Unicode documents that use mostly US-ASCII characters because it represents each character in the range U+0000 through U+007F as a single octet. UTF-8 is the default encoding for XML.

所以,其实说白了。unicode仅仅是表示了字符的编码表,但是没有指定如何编码,而UTF-8是一种unicode的八字节编码格式。


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

好了,有了预备知识之后,就可以去了解如何解决这种问题了。给了我最大启发的就是下面这两篇文章了:


  设想一下如何设计一个全球的论坛系统:可以让中文和日文的用户都可以方便的浏览发表呢?在数据中间处理阶段应该以那种字符集存储呢?答案很简 单:UniCode。以前很多文章都有关于如何设计一个国际化界面的介绍,只是应用的本地化界面输出,但很少提及数据在中间处理过程中如何适应国际化。

  输入和存储阶段就用UniCode方式进行处理和存储,以方便应用以后的国际化。GOOGLE的设计就是一个非常好的国际化应用榜样,我以GOOGLE搜索引擎的国际化支持为例说明如何实现国际化应用的设计。

GOOGLE用户经常有这样的感觉:

  1. 为什么我第一次去GOOGLE,出现的就是中文的界面?
  2. 为什么在所有网站中查中文:有时候还会匹配到日文网站的结果?比如:就以"google 秘密"这个查询为例:我们在输入框输入"google 秘密"
    http://www.google.com/search?hl=zh-CN&newwindow=1&q=google+%C3%D8%C3%DC&btnG=Google%CB%D1%CB%F7&lr=

首先我将GOOGLE对查询的处理流程简单的说明如下:

  1. 客户端浏览器输入;
  2. 查询字符串按客户端系统编码方式(GBK)转换成字节流,并URL Encode后传给GOOGLE;
  3. GOOLGE将输入的字符串URL Decode后,按照客户端的系统编码方式将这个字符串(字节串)解码成UniCode
  4. 查询过程,完全是基于UniCode的匹配过程,比如对于“中文”这2个字在简体繁体中文和日文里都有,因此无论是何种语言的页面包含这2个字的页面都能匹配上。
  5. 结果集输出:将查询结果集的内容(UNICODE)按客户端系统编码方式(GBK)“编码”成的字节流,返回给浏览器

具体说明:

  • GOOGLE如何识别出浏览器使用的“界面语言”:GOOGLE获得这个查询字符串的同时,一般会根据hl=zh-CN这个参数, 知道了客户端使用的字符集编码方式,如果用户第一次访问:GOOGLE会根据浏览器的发送的请求中包含的Accept language: zh_cn这个头信息来判别,这就是为什么现在很多用户第一次去GOOGLE的时候它就能自动识别出来的原因。这个参数在之后的查询和翻页过程中通过 cookie保存,并通过get方式一直传递给GOOGLE(因此你也可以使用使用偏好设置界面语言),从而可靠地识别出客户端的编码方式。
  • GOOGLE如何查询:也许从URL上你可以看到:传过去的“秘密”这个查询实际上是%C3%D8%C3%DC=>"秘密"这2个字按GBK(WINDOWS客户端缺省的编码方式)编码方式的4个字节然后再URLEncode后的形式(关于中文编码方式请参考:汉字的编码方式),GOOGLE 将查询字符串按这个编码方式解码并转成UniCode,然后用这个UniCode编码方式的字符串进行内部的查询操作。而任何语言的页面都是先转换成 UniCode后存储在GOOGLE的数据索引库里的。在UniCode中日文和中文写法一样的字,用的是同样的编码。因此,如果你没有指定语言过滤的话,日文网页的结果就首先被命中了;因此,对于中文客户端的查询:如果相应字符在UniCode中和繁体,日文映射的字一样,就可以匹配到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UniCode的,最后将UniCode结果按照客户端的编码方式转换成字节流,返回到客户端。

从以上的分析中我们可以看出:UniCode非常漂亮的解决了应用的国际化问题。对于应用前端来说,剩下的工作就是根据本地编码环境进行本地化的过程了。

  1. 数据从输入的开始,就全部先转换成UniCode,然后再进行处理,并按照UniCode方式集中存储(UniCode inside)
  2. 数据输出过程中,只是在最后输出到客户端的时候,按照客户端的本地化设置将UniCode数据转换成本地字符集,并配以相应语言/字符的界面(Localization outside)

  如果应用的开发只是满足于在国内市场自给自足,“汉化”的思路的大量出现是很自然的。但要是把“汉化”比作UCDOS和RichWin的话,那么这种汉化方式迟早要被内核汉化的WIN95淘汰的。毕竟核心级别对国际化的支持才是一个真正简化前端应用设计、通用的解决方案。Microsoft和Sun等国际化大公司的产品从一开始就是为全球市场设计的,因此对国际化的支持一致非常重视。相比之下国内软件行业对相应国际标准显然重视不足,也很少积极地参 与相关标准制定。
  转自:http://www.chedong.com/tech/unicode_java.html#google



---------------------------------------
据说Google修改过一次它的编码处理方式:

  GOOGLE的国际化做得很好。我们知道,你在www.google.com里面输入一个检索词,然后便会生成一个HTTP的GET请求。这个请求一般有几个参数,以前的http://www.google.com/search?q=%s就是最简单的一个,%s就是用来代替你输入的值的。但GOOGLE是一个面对全球服务的站点。它收到请求后会解释q的值。如果大家写过JSP或者JAVA程序,就会经 常陪到getParameter得到的中文是乱码。这里面就是一个编码问题。浏览器的地址栏内的URL,一切非正常字符(A- z,0-9,:,.等)都会进行编码(Encode,一个%号,然后加上它的ASCII内码,一个中文一般会编码成为两个,如“中 文”两个字会编码为:%D6%D0%CE%C4,然后程序收到请求后会进行相应的解码。
  GOOGLE近期改进了它的编码方案,即是在生成URL的时候,由客户端按照指定的编码进行Encode,查看 www.google.com主页的源文件,你会发觉encodeURIComponent这个Javascript的函数。默认情况下,会用Javascript的 功能,把输入的检索词进行UTF-8编码,“中文”两个字就会编码成:%E4%B8%AD%E6%96%87,一共六个字节。这时如果还是按照四个字节进行解码,就会出错,也就是乱码。可以对比默认情况下的编码,是四个字节。具体关于字符编码的内容,就不在这里讨论。

再来看Google配置检索式的时候的几个参数:

[*]ACTION地址: http://www.google.com/search?
[*]q 检索的词,即你在输入框内输入的内容,会进行URL Encode编码
[*]lr 检索范围。如“lr=”表示检索所有的网站,lr=lang_zh-CN表示检索中文简体,lr=lang_zh-CN|lang_zh-TW表示 中文网页(简繁)
[*]ie 指示浏览器URL的编码,Google会将q的值按照这个编码来进行解码(这个最重要)
[*]oe Outlook的编码??(这个参数暂不清楚什么意思,目前对检索没有影响,直接给一个值,或者不要也行


这时就可以按需进行组合了,名和值之前为“=”,每个之间以“&”进行连接
如:http://www.google.com/search?q=%s&ie=GB2312&lr=lang_zh-CN
意思为:浏览器的URL编码为GB2312,检索范围为“中文网页”

http://www.google.com/search?q=%s&ie=UTF-8&lr=lang_zh-CN
意思为:浏览器的URL编码为UTF-8,检索范围为“简体中文网页”

如果是检索图像,把search换成images就行了,其它不变。
http://images.google.com/images?q=%s&ie=UTF-8&lr=lang_zh-CN

//关于这篇文章的内容,我们其实可以测试一下就能了解了。在google搜索两个中文,之后添加一个&ie=gb2312结果就会出现乱码。


================================================================================待续。。。

2008-10-26

NFS的配置和使用

  一般来说,在linux/unix下,如果需要挂载网络上另外一台服务器的目录的话nfs是最方便且容易实现的一种方法了。
  目前NFS已经到了V4版本了。
  自从 1984 年推出以来,网络文件系统 (NFS) 已成为网络文件共享的标准,尤其是在UNIX® 和 Linux® 社区中。过去 20 年以来,NFS 协议已慢慢适应新需求和市场变化。
  
  下面开始配置:

首先。
  需要作为nfs服务器的主机需要开启nfs服务,并且在/etc/exports中列出允许共享的目录。开启服务只需要
/etc/init.d/nfs start
就可以,但是为了以后自动启动,可以使用chkconfig命令来配置服务的启动。
chkconfig --level 345 nfs on
修改/etc/exports
修改的规则是每个共享目录一行,比如
/home/test 192.168.0.11(ro,sync, no_root_squash) 192.168.0.12(rw,sync)
这里的意思就是把/home/test目录分别共享给192.168.0.11和192.168.0.12,前者只读后者读写权限。
详细的参数介绍:

rw: 可读写的权限;
ro: 只读的权限;
no_root_squash: 登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限
root_squash: root用户的所有请求映射成如anonymous用户一样的权限(默认)
all_squash: 不管登陆NFS主机的用户是什么都会被重新设定为nobody。适合公用目录。
no_all_squash: 保留共享文件的UID和GID(默认)
anonuid: 将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中。
anongid: 同 anonuid ,但是变成 group ID 就是了!
sync: 资料同步写入存储器中。
async: 资料会先暂时存放在内存中,不会直接写入硬盘。
secure: NFS通过1024以下的安全TCP/IP端口发送
insecure: NFS通过1024以上的端口发送
wdelay: 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay: 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide: 在NFS共享目录中不共享其子目录
no_hide: 共享NFS目录的子目录
subtree_check: 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check: 和上面相对,不检查父目录权限

每次修改/etc/exports目录之后需要让其生效可以重启nfs服务,或者使用exportfs命令
参数解释:

-a :全部mount或者unmount /etc/exports中的内容
-r :重新mount /etc/exports中分享出来的目录
-u :umount 目录
-v :在 export 的时候,将详细的信息输出到屏幕上。

-----------------------
客户机:
  在客户机要挂载nfs分区使用的是
mount -t nfs 10.1.1.11:/home/test /mnt
其中10.1.1.11:/home/test为服务器端ip和共享的目录,/mnt为本机要挂载的目录

-----------------------------------------
2008-11-17更新:
开机自动启动:
因为我不需要automount的特性,所以直接修改/etc/vfstab
说明:
格式:
device to mount device to fsck mount point FS type fsck pass mount at boot mount options

* device to mount 指定远程服务器名和共享路径。远程服务器名和共享路径用冒号分开。
* device to fsck 这个是空的。从来不从客户机进行文件检测。
* mount point 指定本地的mount点。这个目录必须是已经存在的。
* FS type 对于nfs资源系统来说,当然是nfs了。
* fsck pass 这个也是空的。表示不从客户机进行文件系统检测。
* mount at boot 选择yes or no,yes就是启动时自动安装。
* mount options 用逗号分隔的mount命令的列表。

例如:
# vi /etc/vfstab 添加:
peng:/export/home/peng/games - /export/home/games nfs - yes soft,bg

表示开机自动把远程主机peng的/export/home/peng/games目录自动挂到本机的/export/home/games下。soft选项是目录不能安装,产生一个错误。bg选项,系统启动过程中安装在后台。

2008-10-03

Solaris环境下Tomcat的安装配置以及与Apache的整合

  在最开始,安装之前现了解一下背景知识是相当有用的。

  Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序,你也可以将该端口改为 80。

  但是鉴于以下原因,我们需要整合Apache和Tomcat:

  1. 提升对静态文件的处理性能
  2. 利用 Web 服务器来做负载均衡以及容错
  3. 无缝的升级应用程序

  由于Tomcat本身就是Apache软件基金会的一个项目,自然它肯定能够很好的和Apache结合。因此很多服务器都采用这种方式。

  一般来说,要进行这种集成,我们一般希望让静态的页面有apache处理,动态的jsp就由tomcat处理。


目前有三种方法可以将 apache 和 tomcat 整合在一起。

JK:

This is the top-level entry point of the documentation bundle for the Apache Tomcat Connectors

Select one of the links from the navigation menu (to the left) to drill down to the more detailed documentation that is available. Each available manual is described in more detail below.

  上面就是JK的官方介绍,它本来就是tomcat项目的一部分。

http_proxy :

  直接利用Apache自带的 mod_proxy 模块使用代理技术来连接 Tomcat。http_proxy 模式是基于 HTTP 协议的代理,因此它要求 Tomcat 必须提供 HTTP 服务,也就是说必须启用 Tomcat 的 HTTP Connector。

ajp_proxy:

ajp_proxy 连接方式其实跟 http_proxy 方式一样,都是由 mod_proxy 所提供的功能。配置也是一样,只需要把 http:// 换成 ajp:// ,同时连接的是 Tomcat 的 AJP Connector 所在的端口。
简单来说这三种方法就是:
 通过ajp13协议,apache将动态内容的请求转发给tomcat
 在apache进程中运行tomcat来处理动态内容  
 使用本地高速Unix domain socket,apache将动态内容的请求转发给tomcat


  实际上虽然后两者在性能上不会逊色多少,而且更简便灵活,但是在稳定性上恐怕还是JK更胜一筹,所以我还是使用JK来配置吧。


  找了很多资料,最终对我有帮助的就只有两个信息。一个是前面这个,另外一个就是这种连接的原理:假设apache使用端口是80,tomcat使用端口是8080。服务器ip是10.1.1.12这个时候,当我们通过http://10.1.1.12访问网站的时候内容是由apache处理的,当我们通过http://10.1.1.12:8080访问网站的时候,内容就是有tomcat处理的。但是,当整合成功以后,我们通过http://10.1.1.12访问网站中的jsp页面,比如http://10.1.1.12/test.jsp时,apache会把请求转给tomcat来处理。
  这个就是我们整合的终极目标了,也是通过这个来判断是否整合成功。而通过apache转给tomcat的请求在tomcat的status的jkstutus中能看到:

jk-8009

Max threads: 200 Current thread count: 4 Current thread busy: 3
Max processing time: 369 ms Processing time: 0.374 s Request count: 3 Error count: 1 Bytes received: 0.00 MB Bytes sent: 0.00 MB

StageTimeB SentB RecvClientVHostRequest
K44520 ms??10.1.1.111??
K2680 ms??10.1.1.111??

P: Parse and prepare request S: Service F: Finishing R: Ready K: Keepalive



那么,接下来我们开始动手。。。

我的apache已经装好了,那么先装好tomcat:

开始安装之前先添加JAVA_HOME路径到环境变量:
JAVA_HOME=/usr/java
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
JRE_HOME=/usr/java/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$CATALINA_HOME/bin:/usr/sfw/bin:/usr/ccs
export PATH JAVA_HOME CLASSPATH CATALINA_BASE CATALINA_HOME JRE_HOME


之后解压官方下载的包,然后拷贝到安装的目录下,执行
./bin/startup.sh
之后打开http://localhost:8080
出现成功信息就表示安装成功了。
安装JK:
  根据说明文件直接编译吧

配置:
  要配置好Apache和Tomcat的整合,必须要配置这三个文件:

httpd.conf
Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息

workers.properties
到 Tomcat 服务器的连接定义文件

uriworkermap.properties
URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在 httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。



cp ./conf/workers.properties /usr/local/apache/conf/
cp ./conf/uriworkermap.properties /usr/local/apache/conf/
之后按照这个文件里面的提示修改文件吧。
然后编辑apache的httpd.conf,以下是官方文档里的内容
# Load mod_jk module
# Update this path to match your modules location
LoadModule jk_module modules/mod_jk.so
# 加载jkmodule的参数
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/httpd/conf/workers.properties
# 指定workers.properties的所在路径
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /var/log/httpd/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples/* worker1、
# 将/examples虚拟路径下的所有内容转有worker1处理,其实这个worker1就是jk的配置文件中配置用于连接apache和tomcat的东西。
除了这些外,我们应该自己添加的东西:
JkMount /*.do worker1
JkMount /*.jsp worker1
#类似上面,指定目录下所有扩展名为.do .jsp的文件由worker1来处理

之后修改/usr/local/apache/conf/worker.properties
基本上按照说明修改一些路径就可以了。上面在httpd.conf中指定的worker1应该出现在worker.list中,并且拥有worker.worker1.type=ajp13.
此外这个文件还可以用来配置负载均衡,不过我暂时不需要了。所以就没有配置了。而且默认的文档里其实已经有配置一个loadbalancer,如果需要我们只需要把worker.list后面的对象改成loadbalancer前面的worker1自然也改成这个就可以了。worker.list指定的对象是告诉jk哪些worker是可用的。


这样配置之后,基本就没有问题了。开启tomcat和apache看看。

最后记得在启动脚本里增加tomcat的自动启动。

参考文章:http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html



---------------------------------------------------------------
此外,如果需要将tomcat的管理统一到Solaris的smf之中,可以这样做:

vi /var/svc/manifest/network/tomcat.xml
文件内容:

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='Tomcat'>
<service name='application/server/tomcat' type='service' version='1'>
<single_instance />
<dependency
name='filesystem'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/filesystem/local' />
</dependency>
<exec_method
type='method'
name='start'
exec='/opt/Webservices/tomcat/bin/startup.sh'
timeout_seconds='300' />
<exec_method
type='method'
name='stop'
exec='/opt/Webservices/tomcat/bin/shutdown.sh'
timeout_seconds='300' />
<instance name='default' enabled='true' />
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>Tomcat6.018</loctext>
</common_name>
</template>
</service>
</service_bundle>

之后
svccfg validate 和 svccfg improt这个文件即可。

2008-09-29

Solaris console环境下构建Apache+MySQL+PHP 平台

  其实,Solaris Express Developer Edition的安装过程中只要选完全安装这些东西就会自动装好的,不过,我们总得学会自力更生吧,所以我在安装系统的过程中没有安装这些,而选择了自己手动安装。
  基本上呢,solaris需要的东西都能通过http://www.sunfreeware.com/这个地方下载到,因为没有GUI,所以我们要会用ftp命令,路径可以在网站里查到,我们用ftp程序直接下载动solaris系统吧。看下网站上的说明就明白了:

[179] steve> ftp ftp.sunfreeware.com
Connected to ftp.sunfreeware.com.
220 ftp.sunfreeware.com FTP server ready.
Name (ftp.sunfreeware.com:steve): anonymous
331 Guest login ok, send your complete e-mail address as password.
Password:
230-
230-==============================================
230-This is the ftp.sunfreeware.com ftp server
230-
230-If you have not already done so, make sure
230-you have read the Downloading/Installation,
230-FAQ, and Disclaimer links on
230-http://sunfreeware.com.
230-
230-This is a restricted access system. All
230-transfers are logged. If you disagree
230-with this practice, log off now.
230-
230-Questions go to Steve Christensen at
230-steve@smc.vnet.net.
230-==============================================
230-
230-
230 Guest login ok, access restrictions apply.
ftp> bin
200 Type set to I.
ftp> cd pub/freeware
250 CWD command successful.
ft>p

这里为了方便,我期望使用ssh远程登录到solaris服务器上,因此先安装。如果你之前装了就别再装了,用svcs查看一下有没有ssh服务在运行:
svcs | grep ssh
如果没有的话再安装,从这个网站下载的软件包只要gzip -d 一下之后用pkgadd -d 一下就安装完了。
接下来配置openssh:
配置文件是/etc/ssh/sshd_config
我要做的只有几个事:
改端口:把port右边的22改成需要的端口号。
允许root用户登录,虽然这不安全,但在我现在使用的时刻正好需要。
好了,ssh配置完以后就可以在图形界面下的机器用ssh远程登录到服务器了,而且可以直接使用sftp传送文件,这样就不要每个文件都去输入名字传输了。
接下来就准备安装Apache了,从那个网站的下载介绍里面能看到它的包依赖信息:
apache-2.2.9-sol10-x86-local.gz Apache 2 - the popular web server - installs in /usr/local/apache2. Dependencies: expat, libiconv, openldap, sasl, zlib, openssl-0.9.8h, and either the libgcc-3.4.6 or gcc-3.4.6. Documentation can be found in /usr/local/apache2/doc/apache2. The configuration files in /usr/local/apache2/conf must be edited to fit your site's needs, including ssl support.

本来可以直接使用这个网站提供的包来安装这三个软件的的,不过我希望试试自己编译,所以直接从官网下了unix版的源码来编译安装:

先是mysql:

 从官方下载的包安装:
  • 建立目录:
    mkdir /usr/local/apache
  • 建立mysql的用户组和用户
    groupadd -g 110 mysql
    useradd -u 10001 -g mysql -m -d /export/home/mysql -s /bin/bash mysql
    passwd mysql

  • 安装好软件包就可以了,注意,如果之后安装php的时候用的是32位的,就要装32位的mysql,否则无法编译php。装好后如果能够正常启动服务并用空密码登录root就成功了,不能的话看下面
  不知为什么我的机器就是装不好官方下的那个包,总是提示pid文件找不到什么的,无奈之下,采取另外一种方法:
rm -fr /opt/mysql/mysql/data/*
因为我用官方包安装所以安装的路径是这个。
之后
cd /opt/mysql/mysql
./scripts/mysql_install_db --user=mysql

这里如果成功的话再
./bin/safe_mysqld --user=mysql
应该就能启动服务了。
不过相当无奈的是这个情况下root用户一直被拒绝登录。只能用别的方法了:
先停止服务:
/etc/init.d/mysql stop
用这个类似于超级维护模式的方法开启服务:
./bin/safe_mysqld --user=mysql --skip-grant-tables --skip-networking &
好了,输入mysql总算是进入mysql monitor了。不过问题来了。
select * from mysql.users
结果是0条数据。。。汗死。。。
所以我就试试直接新建一个用户的方法了:
mysql> INSERT INTO mysql.user (Host,User,Password)VALUES('%','test',PASSWORD('tset'));
mysql> FLUSH PRIVILEGES


弄完之后
/etc/init.d/mysql restart
最后成功的用那个帐户登录了。。。。
最后在启动脚本里面增加文件让mysql开关机时自动开启关闭:
ln /opt/mysql/mysql/support-files/mysql.server /etc/rc3.d/S99mysql
ln
/opt/mysql/mysql/support-files/mysql.server /etc/rc0.d/K00mysql
ln
/opt/mysql/mysql/support-files/mysql.server /etc/rc1.d/K00mysql
ln
/opt/mysql/mysql/support-files/mysql.server /etc/rc2.d/K00mysql
ln
/opt/mysql/mysql/support-files/mysql.server /etc/rcS.d/K00mysql

mysql到此就装好了。
 从源代码安装:
  • 准备动作同上,之后解压源代码,执行:
    ./configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-charset=gb2312 --with-extra-charsets=all
    with-as那一项是指定汇编编译器
  • 上一步执行成功之后就可以开始编译了,make的过程比较持久,我们好好等待吧。
  • 之后的步骤同上

 

接下来是Apache+php了:
  • 在编译之前必须安装一下软件包:
    SUNWarc
    SUNWbtool
    SUNWhea
    SUNWlibm
    SUNWsprot
    SUNWtoo

    这些包可以直接从光盘安装,方法:
    pkgadd -d /cdrom/sol_11_x86/Solaris_11/Product/ SUNWarc
    ...

  • 必须注意的一点是,Apache2.2以上的版本除了要安装编译环境之外还必须安装apr-1.2.2-sol10-x86-local.gz与aprutil-1.2.2-sol10-x86-local.gz这两个包,否则configure会出现configure failed for srclib/apr错误。目前从sunfreeware下的包还是不能编译apache,貌似是少了一个版本文件,所以我是从apr.apache.org那里下了新版自己编译的。
  • 编译apache:
    ./configure --prefix=/usr/local/apache -enable-so -enable-mods-shared=most
    这样就动态编译了apache了。编译完后安装,之后别动。
  • 编译php:
    ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache/bin/apxs
    注意那个apxs2
  • cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
    cp php.ini-dist /usr/local/apache/conf/php.ini
  • 修改配置文件:
    检查LoadModule 中是否有
    LoadModule 5_module modules/libphp5.so
    这一行,没有加上。
    ServerName这一行指定好自己的服务器的域名或ip。
    默认的DocumentRoot可以修改。
    加一行AddType application/x-httpd-php .php .phtml
  • 之后/etc/init.d/httpd start来开启apache,就可以在别的机器上测试一下apache成功与否了。
基本上写一个index.php页面,内容如下:
<html>
<body>
<title>Hello World</title>
<?php phpinfo(); ?>
</body>
</html>


如果成功的话,就会出现php的信息了。
最后增加启动脚本并且连接文件:
ln -s /etc/init.d/httpd /etc/rc3.d/S90http
ln -s /etc/init.d/httpd /etc/rc3.d/K90http
ln -s /usr/local/apache/bin/apachectl /usr/bin/apache
/*******************************************
*原创文章,转载请注明出处
*******************************************/

Solaris10 console下配置网络

主要有几个文件需要配置:

  1. /etc/hosts 主机名解析 就是host表
  2. /etc/hostname.interface interface是网卡名,用于分配主机名,直接在里面输入主机名就好了。
  3. /etc/netmasks 设置子网掩码格式类似于:
    10.1.1.0 255.255.255.0
  4. /etc/inetd.conf 参见下面这段话
    UNIX并不是让每种服务的守护进程都在自己的端口上等待请求,而是将代表各个服务守护进程等待请求的任务交给一个叫inetd的服务进程。这样就可以大 大减少对系统资源的占用。只有当超级服务进程发现一个服务请求时,它才调用该服务的守护进程。/etc/inetd.conf配置文件允许inetd在启 动时决定自己将代表哪些服务等待服务请求。如果一种服务的守护进程没有包含在inetd.conf文件中,那么当inetd接收到该服务的请求时,会把该 请求丢弃。
    文件的字段:
    service_name 这是文件/etc/services中列出的服务的标志符。
    socket_type 用来标志使用的数据传输服务的类型。
    proto 标识传输协议的名字。是UPD和TCP
    flags 可以被设为"等待"和"非等待"。如果被设为"等待" 状态,inetd在恢复监听端口上的其他请求时,必须等待服 务协议释放将其连接到网络的连接。"非等待"可以使 inetd立即监听其他的请求。大多数TCP协议的采用"非等 待"方式,而UDP采用"等待"方式。
    user 表示调用服务的用户名。
    server_pathname 表示inetd在响应相关服务请求时必须调用的 服务程序的完整路径名。
    Args 该域包括服务的程序所使用的命令行参数。即以程序名开 始,然后跟随用户设置的参数
  5. /etc/defaultrouter 设定默认路由 直接输入网关的ip地址一般就可以了。
  6. /etc/gateways 这个是路由表文件,设置比较麻烦
  7. /etc/nsswitch.files 设定名字搜索顺序 记得在hosts: files背后加个dns
  8. /etc/resolv.conf 配置dns服务器的地址和域名格式:
    domain abc.efg.com
    nameserver 10.3.3.33

其他命令:
ifconfig
nslookup
netstat等等

2008-09-22

ubuntu的小键盘问题

  基本上,这个问题相当奇怪,不知道什么时候,重启一下之后突然小键盘没办法输入数字了。。。反倒变成鼠标控制键了,而且numlock是启动的状态。。。
  结果呢,其实只要用shift+alt+numLock组合键一按就可以恢复了。其实在xwindow的常用快捷键里有介绍的:


1. Ctrl-Alt-“+” 或者 Ctrl-Alt-“-”- 改变屏幕分辨率(提高/降低)。前提是在X-Window server配置文件中写入了多种可用分辨率。
2. Ctrl-Alt-Backspace - 杀死X-server,返回登录界面。所有正在运行的应用程序将被终止。
3. Ctrl-Alt-Escape - xkill - 点击一个应用程序强制关闭。
4. Ctrl-Shift-Num Lock 把键盘上的小键盘(数字键盘)变成鼠标,启动后你可以用小键盘进行鼠标操作。数字键盘上的/和 * 分别代表鼠标左键和鼠标右键,数字键盘上的 5是双击。
5. Ctrl-Alt-Fn (F1, F2, F3,…) - 切换到第 n 个文本控制台。一般Alt+F7切换回X-window。
6. Alt-F2 - 开启一个运行命令的小窗口。如果输入的是可执行命令则直接运行;如果输入的是文件名系统将调用适当的应用程序打开它;输入网址将用默认的浏览器打开它。
基本上,这个也是一项功能吧。

2008-07-17

系统启动时LVM居然未激活

最近rp相当底下,这次更新了一些包。之后重启发现又再度出现在fsck时出错进入维护模式了。看一下发现/dev/vgname/lvname不存在。
因此推断肯定是在fsck时vg还没有激活,手动激活之后exit果然能正常启动。

好了,知道问题出在那里就好解决了。
我们找到启动脚本。编辑一下就好。。。
在我的ubuntu下

sudo gedit /etc/rcS.d/S30checkfs.sh

在最前面加入:
##Activition lvm volume group
/sbin/modprobe dm_mod
/sbin/vgscan
/sbin/vgchange -a y
##

ok,重启下就解决了。。。。

原理在于,我们需要在fsck这一步骤出错前。激活vg,这样才能通过这个步骤到下一个步骤 S35mountall.sh

此外可以参考此片段:出自blog.chinaunix.net

然后需要在系统启动脚本中加入激活LVM的命令
并且必须在挂载/etc/fstab中的文件系统之前激活LVM,不然怎么挂载阿。^_^
我写在了/etc/rc.d/init.d/mountfs这个脚本中,它的作用是
在fsck检查各个分区后,将/分区及其他分区重新挂载成read-write的

/sbin/vgscan -------->需要加入的两行
/sbin/vgchange -a y

mountfs脚本主要内容是:(传递start参数)

echo "Remounting root file system in read-write mode..."
mount -n -o remount,rw /
echo "Recording existing mounts in /etc/mtab..."
> /etc/mtab
mount -f / || failed=1
mount -f /proc || failed=1
if grep -q '[[:space:]]sysfs' /proc/mounts ; then
mount -f /sys || failed=1
fi
echo "Mounting remaining file systems..."
##############LVM##############
/sbin/vgscan #------->在挂载其他文件系统之前
/sbin/vgchange -a y #---->就激活了LVM,随后就挂载上啦
mount -a -O no_netdev #--->依照/etc/fstab挂载FS

这样系统启动时,就会激活LVM,并自动挂载上。

一篇关于LVM的文章中说,将这两条命令加在了检查文件系统脚本中,但是我加在那里
不成功,可能因为在checkfs时,系统是read-only的,而vgchange -a y
需要写入数据却无法写入,所以不行.

udev服务先于checkfs启动,并且通过mount -n -t ramfs ramfs /dev
将/dev挂载成ramfs,完全在内存中活动,无论根分区是否可写,/dev都是可写的。
莫非vgchange -a y 还要向其他位置写入数据?有待研究:)

在其他的发行版中,如Red Hat,Mandrake中,检查根文件系统,依照/etc/fstab
挂载各个文件系统,开启SWAP分区...等等,这些都是通过/etc/rc.d/rc.sysinit完成的
而在LFS中则是将这个脚本 分成了若干的小脚本,然后逐一的运行它们。
个人认为这样可以更直观的了解系统的启动过程,方便修改。
所以在其他发行版中,激活lvm,就要写到/etc/rc.d/rc.sysinit中
并且必须要在挂载/etc/fstab中文件系统之前激活。还要注意激活时,系统是rw的。

最后我又在mountfs中添加了关闭VG的语句,这样可以
在系统关机/重启的时候自动关闭VG。

/sbin/vgchange -a n ------>添加这句

当系统关机/重启时,mountfs会依照/etc/fstab卸载所有的文件系统:
mountfs
脚本内容 : (传递stop参数)

echo "Unmounting all other currently mounted file systems..."
umount -a -d -r -t noramfs
/sbin/vgchange -a n # --->加在了这里

在卸载LV卷后,才可以关闭VG,开始我加在了umount上面一行就不行。提示仍有LV在使用。

其他发行版中,关闭VG要比激活VG容易多啦。只要加在halt/reboot这个服务脚本里就可以。
其实只要卸载文件系统后的服务脚本都可以,随你喜欢了。 ^_^

2008-07-16

我机器上Ubuntu 8.04配置LVM的经历

  虽然前天发的LVM2的介绍信息十分详尽,不过我自己在安装的过程中可没少吃苦头。。所幸我的机器本来就刚装系统,所以也不在乎一边一边重装尝试。
  本来,每次我在ubuntu下apt-get安装好LVM2和EVMS后奇怪的是重启之后我的系统除了挂载在/ 下的分区之外其他都在开机的fsck过程失败,也无法挂载,说无法使用资源,忙。。。之后系统进入维护模式,即使在这个模式下。mount里看到其他分区也没有挂载,但是即使用mount挂载也会提示无法使用,忙。(这几个分区我并未作为LVM的分区使用)。
  在liveCD下安装的时候可以哦嗯apt安装lvm2不过如果系统的某些目录被它的LV用了的话,系统是启动不了的。因为Ubuntu并未默认支持LVM。
  鼓捣了2天,最终只能用折衷的方法解决。
  系统安装的时候只用一个分区。之后装好以后制作lvm,把相应目录的东西拷贝到lvm分区下,之后自动挂在lvm分区。

基本上。先选好几个要作为lvm分区的分区。最好在fdisk下把id改成8e,这里假设我用/dev/sda2 /dev/sda4

sudo pvcreate /dev/sda2 /dev/sda4
成功的话
sudo pvscan
会找到相应的东西。
接下来创建VG
sudo vgcreate vgname /dev/sda2 /dev/sda4
成功的话
sudo vgdisplay
同样会显示相应的东西。
之后创建LV
lvcreate -L 8G -n lvname vgname
同样查看属性:
lvdisplay /dev/vgname/lvname
弄好后格式化lv吧:
mkfs.ext3 /dev/vgname/lvname
最后就是挂载了。。。。

至于在/dev/fstab里面的自动挂载选项基本上和其他一样。
此外还稍微尝试了一下扩展lv
基本上如下步骤:
  1. 初始化新的pv,假设我是/dev/sda8
    pvcreate /dev/sda8
  2. 增加到已有的VG
    vgextend vgname /dev/sda8
  3. 扩展已有的LV
    lvextend -L +3G /dev/vgname/lvname
当然其实也可以用其他的VG来扩展LV.
至于更高级的应用还是看前面那篇文章了。。。

Linux的文件系统解析与使用

恩。再转一帖,刚入门的朋友应该十分需要这篇文章的指点:
原文:http://www.ibm.com/developerworks/cn/linux/l-roadmap/part6/index.html
级别: 初级
作者:Chris Walden (mailto:cmwalden@us.ibm.com?subject=第), 电子商务架构师, IBM Developer Relations
使用分区和文件系统

在 Linux 中文件和存储设备的使用与 Windows 中不同。虽然同样有文件和分层目录结构,但是除此以外您还需要建立一种不同的思维方式。


清单 1. 目录结构




没有驱动器字母!
  在 Linux 中没有驱动器字母,这确实相当有用。如果您曾经在复杂的网络环境中使用过 Windows 系统,并且运行这个系统的机器带有若干个设备,那么您可能会发现字母表中的字母不够用。在 Linux 中,只有一个文件结构。它以 root (/) 开始,所有的本地文件系统,所有本地设备,以及所有的远程文件系统都表示为这个结构中的子目录。
  当 Linux 第一次引导时,它根据 /etc/fstab 文件中的信息构建这个文件结构。Windows 为硬盘驱动器分区和其他存储设备分配驱动器字母,而 Linux 在 root 文件结构中为它们分配目录。这个分层的结构是完全可配置的,并且可以动态地修改。

装载!
  将一个设备添加到文件系统中,术语上称为 装载。Linux 会自动装载一个 / (root) 文件系统。也可能会有一个单独的 /boot 文件系统,其中存放的是核心的内核引导文件。Linux 还将装载一些特殊的文件系统。交换分区并不表示为文件系统的一部分,但是内核会处理它。不过,其他特殊的文件系统,比如 proc,被看作是文件系统的常规部分,可以像普通文件一样对它进行处理。



什么是 /proc?
/proc 文件系统是 Windows 思想与 Linux 思想不同之处的极好示例。
/proc 存储的是对正在运行的系统各个方面的虚拟描述。在那里有 IRQ 设置、内存使用、加载的设备驱动器、网络状态等很多信息。甚至有一个叫做
/proc/kcore
的文件,是所有用到的系统内存的虚拟描述。这里的每一个文件都可以像普通文件或二进制文件一样解析。可以编写某些文件来改变运行着的内核的行为,而不用重新引导。例如,为打开系统中启用的第一个以太网设备的
IP 转发,您可以使用一个文件命令:
echo 1 >
/proc/sys/net/ipv4/conf/eth0/forwarding

这种系统的主要好处在于,您只需要使用简单的脚本技术,就可以对您的正在运行的系统进行深入而有效的操作。
  其他文件系统,比如可移动的媒体或者远程文件系统,需要手工装载。装载一个文件系统时,您需要知道在 Linux 中对它进行引用的正确方法,还需要有一个空目录作为 装载点。对于可移动媒体,Linux 可能在安装时就为您创建了装载点。在 Red Hat Linux 中,cdrom 设备被设置装载到 /mnt/cdrom 目录。也就是说,当您将一张 CD 放入 CDROM 设备后,输入命令:
mount /mnt/cdrom
  CD 就会被添加到文件系统中,CDROM 设备会被锁定以使它不会被意外弹出。只需要到 /mnt/cdrom 目录就可以访问 CD 中的内容。当不再使用 CD 时,您可以用下面的命令将它从文件系统中移除:
umount /mnt/cdrom
  /mnt/cdrom 目录将变空,CDROM 设备的锁定被解除。您现在可以安全地弹出 CD。对其他可移动媒体也是如此,比如软盘驱动器 (/mnt/floppy)。
  运行不带参数的 mount 命令会显示出当前已装载的文件系统。

/etc/fstab 文件
设备与其装载点之间的关联关系在 /etc/fstab 中配置。这个文件可以直接修改,也可以由管理工具来维护。下面是一个 /etc/fstab 示例:
理解 /etc/fstab

/dev/hda5         ext3  defaults     1   1
/dev/hda2  /boot     ext3  exec,dev,duid,rw 1   2
/dev/hda6  swap     swap  defaults     0   0
/dev/scd0  /mnt/cdrom  auto  ro,noauto,exec  0   0
none     /dev/pts   devpts  id=5,mode=620 0   0
none     /proc     proc  defaults     0   0
none     /dev/shm   tmpfs  defaults    0   0

  每一行表示一个要装载的文件系统。第一列指出的是要装载的设备。第二列是装载点,也就是设备在文件系统中的位置。第三列指出了文件系统的类型。第四列是处理文件系统的选项。最后一列是文件系统的标志位。第一个数字是 1 或者 0,指定系统是否应该用 dump(系统备份的一个选项)进行复制。第二个数字是 0、1 或者 2,指定了在引导时检查文件系统的次序。0 表示完全不检查。1 表示要最先检查, root (/) 文件系统需要指定为 1。其他文件系统应该是 2。

  在上面列出的 fstab 文件中,root 文件系统位于第一个 IDE 硬盘驱动器的第五个分区中,这个分区是扩展分区的第一个逻辑驱动器。/boot 文件系统位于第一个 IDE 硬盘驱动器的第二个主分区中,其中存放的是内核启动文件。交换分区位于第一个 IDE 硬盘驱动器的第六个分区,也就是扩展分区的第二个逻辑驱动器。列表中的其他文件系统相应的设备是“none”。我们马上就要阐述这一问题。现在我们先来关注物理磁盘。

  第四列中的选项将随文件系统类型而不同。在上面的例子中,/ 和 /boot 的装载选项为“default”。也就是说,它们使用异步 I/O 以可读写方式自动装载。只有 root 可以装载或者缷载设备,但是用户可以执行二进制文件和使用“sticky bit”(稍后介绍)。文件系统将被作为块字符设备来处理。然而,对 /mnt/cdrom 来说,选项就不同了。它不会被自动装载,并且将会作为只读文件系统装载。用户将可以在该文件系统中执行脚本和程序。

什么都是文件
  在 Linux 中,文件系统由类似于文件的名称来表示。在 /dev 目录下的所有文件都是称为 nodes 的特殊文件,它们通过设备驱动程序链接到物理设备。这就使得您可以做一些有趣的事情。例如,为制作一张 CD 的 ISO 映像,您可以使用 cp (copy) 命令:
cp /dev/cdrecorder MyCD.iso
  这样复制的是一个二进制映像而不是 CD 的文件结构。
  以文件为中心的方法还允许您可以为设备名称指定有意义的别名。例如,通常有一个叫做 /dev/cdrom 的别名,指向物理 CDROM 设备,而这个设备通常是 /dev/hdc。 一旦创建了别名,您就可以通过 /dev/cdrom 访问那个设备,这样更好记。别名技术还允许您标准化脚本,使这些脚本可以在物理配置不同的系统上使用。

添加文件系统
  在 /etc/fstab 文件中添加新的一行,您就可以将文件系统添加到 /etc/fstab。作为一个实际的例子,我有一个 RAID 设备,存储的是部门所用到的文件资源。这个设备中只有数据文件,并且保持与操作系统分离,这样在出现硬件故障时可以将它转移到另一个系统。RAID 已经配置好,在 Linux 中识别为 /dev/sdc,即第三个 SCSI 设备。在第一个分区上创建了带日志的 ext3 文件系统,这样我们通过 /dev/sdc1 就可以访问它。我希望在计算机引导时自动将这个 RAID 装载到文件系统中。
我在 /etc/fstab 中添加了如下一行:
dev/sdc1 /data ext3 defaults 0 0/
这样在引导时 RAID 就会像 / 和 /boot 系统一样被装载。现在我只要再创建一个目录作为指定的装载点:
mkdir /data
一旦创建了这个空目录,我们可以将文件系统装载到它:
mount /data
RAID 现在关联到了 /data。如果系统被重新引导,/data 将自动装载。

分区
在 Linux 中分区与 Windows 中本质上相同。控制台命令 fdisk 可以创建和管理分区。当您使用 fdisk 时,您必须指明它要操作哪个设备。可使用命令 fdisk -l 来查看可用设备。 清单 2. 使用 fdisk

[root@cmw-t30 root]# fdisk -l
Disk /dev/hda: 240 heads, 63 sectors, 7752 cylinders
Units = cylinders of 15120 * 512 bytes
 Device Boot  Start   End   Blocks    Id    System
/dev/hda1      1     8    60448+   8e    Linux LVM
/dev/hda2      9     15    52920    83    Linux
/dev/hda3 *     16    1403   10493280  c   Win95 FAT32 (LBA)
/dev/hda4      1404   7751   47990880  f   Win95 Ext'd (LBA)
/dev/hda5      1404   5565   31464688+  83  Linux
/dev/hda6      5566   5635   529168+   82  Linux swap
/dev/hda7      5636   7751   15996928+  b   Win95 FAT32

  上面的清单来自于一台膝上型电脑,所以它显示的结构与服务器有些不同。它显示了一个有若干个分区的 IDE 硬盘驱动器。如果有其他设备,同样也将会被列出。例如,第二个 IDE 硬盘驱动器可能会显示为 /dev/hdb。
指定一个设备再次运行 fdisk ,您会得到一个简短的提示。 清单 3. 对一个设备运行 fdisk
[root@cmw-t30 root]# fdisk /dev/hda
The number of cylinders for this disk is set to 7752.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):


输入“m”可以查看命令菜单。您可以使用“p”来显示当前的分区表。您可以创建、删除和修改现有分区的类型。“l”将为您列出可用分区类型的完全列表。用“w”将您的修改写入到分区表并退出程序,或者使用“q”不保存修改而退出。一些修改会立即生效。有一些修改需要系统重新引导方能生效。
Linux 下的分区规则与 Windows 中相同。您可以使用 4 个主分区,每个都可以成为扩展分区。
 
文件系统类型
  Linux 可以处理内核所能识别的任何文件系统类型。相当多的类型是默认编译到内核中的,并且可以再添加新的文件系统。下面是一些重要的文件系统类型:
  • ext2:标准 Linux 文件系统
  • ext3:带日志的标准 Linux 文件系统
  • vfat:Microsoft 的 Fat32 文件系统
  • jfs:IBM 的日志文件系统
  • reiserfs:另一个流行的日志文件系统

格式化分区

  分区创建完成后,用适当版本的 mkfs 命令对其进行格式化。文件系统将有其自己版本的 mkfs ,比如 mkfs.ext2 或者 mkfs.ext3 。这些助手脚本让您可以只需要指定分区就可以创建一个文件系统。下面是一些例子:>清单 4. 使用 mkfs

# Create an ext2 file system on the third
# parition of the first IDE hard drive
mkfs.ext2 /dev/hda3
# Create an ext3 file system on the first
# partition of the 2nd SCSI hard drivemkfs.ext2
mkfs.ext3 /dev/sdb1
# Create a jfs file system in an extended
# partition on the first IDE hard drive.
mkfs.jfs /dev/hda5

  有一些高级的参数会影响分区如何格式化,但是对通常的用途来说,使用默认的参数就可以了。一旦分区经过了格式化,它就可以装载到 / 文件系统中。一个文件系统必须在被缷载后才可以重新格式化。其他文件系统工具


让我们来看一看其他有用的工具。
控制台工具
有几个工具可以查看磁盘和文件系统的状态。
df

  df 表示“disk free”。它会报告装载的文件系统上已用的和可用的磁盘空间的大小。有用的开关:
检查磁盘空间
df -h
人类可读的格式;以易读的 k、M、G 而不是以字节为单位来显示文件的大小
df -l
仅列出本地文件系统;默认情况下,远程文件系统也会被列出
du

  du 表示“disk usage”。它会报告特定的文件和每个子目录 (参数中指定的目录) 所使用的磁盘空间大小。有用的开关:
检查磁盘使用情况
du -a
列出所有文件所占的空间,而不仅是目录
du -h
人类可读的格式;以易读的 k、M、G 而不是以字节为单位来显示文件的大小
du -c
在所有的参数处理完成后输出一个总计;可以用来得到给定的一组文件或目录所占的总的磁盘空间
du -s
只显示出每个参数指定的文件大小的总和


fsck

  这个程序用来检查和修复文件系统,相当于 Windows 中的 chkdsk 。如同 mkfs 一样,对应不同的文件系统类型它有不同的版本。 fsck 必须运行于已缷载的卷上,虽然除非是在文件系统没有缷载完全的时候,否则很少会用到它。 man fsck 和 info fsck ,以及本文最后的 参考资料中都提供了详细的资料。

完整的体系是分区的总和
虽然在 Linux 中对分区和文件系统的管理与 Windows 中有很多类似之处,但是从驱动器字母过渡到完全的分层树可能还需要作一些调整。因此,有一些健壮的控制台工具可以使用这些功能及 /etc 目录下的配置文件。