Monday, December 15, 2008

Autoconf/Automake工具, makefile创建过程

Autoconf/Automake工具组主要包括autoconf、automake、perl语言环境和m4
使用Autoconf/Automake工具自动生成Makefile文件的流程图
The image “http://new.51cto.com/files/uploadimg/20081114/105622531.jpg” cannot be displayed, because it contains errors.

(1)创建源代码文件,使用"autoscan"生成configure.scan文件,将其重命名为configure.ac,并做适当修改,然 后使用"aclocal"命令生成aclocal.m4文件,使用"autoconf"命令由configure.ac和aclocal.m4文件生成 configure文件。

(2)手工编辑Makefile.am文件,使用"automake"命令生成configure.in文件。

(3)手工编辑或由系统给定acconfig.h文件,使用"autoheader"命令生成config.h.in文件。

(4)使用"configure"命令由configuer、configure.in和config.h.in文件生成Makefile文件。从而完成Makefile文件的创建过程。

1.使用Vi编辑器编辑源程序

2.使用Autoscan工具生成configure.ac文件

Autoscan工具用来扫描源代码以搜寻一般的可移植性问题,比如检查编译器、库和头文件等,并创建configure.scan文件,它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。如下所示:

[root@localhost hello]# autoscan .///在当前文件夹中搜索
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1
[root@localhost hello]# ls //生成configure.scan文件,它是configure.ac文件原型
autoscan.log configure.scan hello.c
[root@localhost hello]# cat configure.scan //configure.scan文件内容
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) //autoconf版本号
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) //软件的名称和版本等信息
AC_CONFIG_SRCDIR([hello.c]) //侦测源码文件
AC_CONFIG_HEADER([config.h]) //用于生成config.h文件
# Checks for programs.
AC_PROG_CC //编译器
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT //输入文件名

下面给出本文件的简要说明(所有以"#"号开始的行为注释):

(1)AC_PREREQ宏声明本文件要求的autoconf版本,本例使用的版本为2.59。

(2)AC_INIT宏用来定义软件的名称和版本等信息,"FULL-PACKAGE-NAME"为软件包名称,"VERSION"为软件版本号,"BUG-REPORT-ADDRESS"为BUG报告地址(一般为软件作者邮件地址)。

(3)AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。此处为当前目录下的hello.c。

(4)AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。

(5)AC_PROG_CC用来指定编译器,如果不指定,选用默认gcc。

(6)AC_OUTPUT用来设定 configure 所要产生的文件,如果是makefile,configure会把它检查出来的结果带入makefile.in文件产生合适的makefile。使用 Automake时,还需要一些其他的参数,这些额外的宏用aclocal工具产生。

中间的注释可以分别添加用户测试程序、测试函数库和测试头文件等宏定义。

此文件只是下面要使用的configure.ac文件的原型,要使用此文件,还需要根据情况修改相关内容。

[root@localhost hello]# cp configure.scan configure.ac //复制文件
[root@localhost hello]# ls
autoscan.log configure.ac configure.scan hello.c
[root@localhost hello]# cat configure.ac
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(hello,1.0,yangzongde@163.com) //在此行内容中设置当前软件包信息
AM_INIT_AUTOMAKE(hello,1.0) //automake所必备的宏,必须添加
AC_CONFIG_SRCDIR([hello.c]) //源文件名
AC_CONFIG_HEADER([config.h]) //config文件
# Checks for programs.
AC_PROG_CC //编译器,可以不指定
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT(Makefile) //输出文件名为makefile

3.使用aclocal工具生成aclocal.m4
[root@localhost hello]# aclocal //执行aclocal生成aclocal.m4文件
[root@localhost hello]# ls
aclocal.m4 autom4te.cache autoscan.log configure.ac configure.scan hello.c

4.使用autoconf工具生成configure文件
[root@localhost hello]# autoconf //执行autoconf生成configure文件
[root@localhost hello]# ls
aclocal.m4 autoscan.log configure.ac hello.c
autom4te.cache configure configure.scan


5.使用autoheader工具生成config.h.in文件

autoheader工具负责生成config.h.in文件。该工具会从"acconfig.h"文件中复制用户附加的符号定义。此步骤可以在第3或第4步之前完成。

[root@localhost hello]# find / -name acconfig.h  //系统acconfig.h文件位置
/usr/src/kernels/2.6.11-1.1369_FC4-i686/include/acpi/acconfig.h
[root@localhost hello]# autoheader
[root@localhost hello]# ls //查看生成的config.h.in文件
aclocal.m4 autoscan.log configure configure.scan
autom4te.cache config.h.in configure.ac hello.c
6.创建Makefile.am文件

Automake工具会根据configure.in中的参量把Makefile.am转换成Makefile.in文件。在使用Automake工具前,读者需要手工创建脚本配置文件Makefile.am。本例中,作者创建的文件如下所示:

[root@localhost hello]# ls Makefile.am
Makefile.am
[root@localhost hello]# cat Makefile.am // Makefile.am范例
AUTOMAKE_OPTIONS = foreign //软件等级
bin_PROGRAMS = hello //可执行文件名
hello_SOURCES = hello.c //源文件名

其中:

(1)AUTOMAKE_OPTIONS为设置Automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件 COPYING等,否则Automake执行时会报错。Automake提供了3种软件等级:foreign、gnu和gnits,供用户选择,默认等级 为gnu。本例使需用foreign等级,它只检测必须的文件。

(2)bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

(3)hello_SOURCES定义"hello"这个执行程序所需要的原始文件。如果"hello"这个程序是由多个原始文件所产生的,则必须 把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体"hello"需要"hello.c"、"hello.h"两个依赖文件,则定义 hello_SOURCES=hello.c hello.h。

7.使用Automake生成Makefile.in文件

下面使用Automake生成"Makefile.in"文件,使用选项"--add-missing"可以让Automake自动添加一些必需的脚本文件。如下所示:

[root@localhost hello]# automake --add-missing
configure.ac: installing './install-sh' //创建install-sh文件
configure.ac: installing './missing'
Makefile.am: installing './INSTALL'
Makefile.am: required file './NEWS' not found
Makefile.am: required file './README' not found
Makefile.am: required file './AUTHORS' not found
Makefile.am: required file './ChangeLog' not found
Makefile.am: installing './COPYING'
Makefile.am: installing './depcomp'
[root@localhost hello]# automake --add-missing //再运行一次,可以辅助生成几个必要的文件
Makefile.am: required file './NEWS' not found //没有找到NEWS文件
Makefile.am: required file './README' not found
Makefile.am: required file './AUTHORS' not found
Makefile.am: required file './ChangeLog' not found
[root@localhost hello]# touch NEWS //创建NEWS文件,如果没有自动生成,手工创建
[root@localhost hello]# touch README //创建README文件
[root@localhost hello]# touch AUTHORS //创建AUTHORS文件
[root@localhost hello]# touch ChangeLog //创建ChangeLog文件
[root@localhost hello]# automake --add-missing //再运行一次
[root@localhost hello]# ls //生成必要的文件
aclocal.m4 ChangeLog configure.scan INSTALL missing
AUTHORS config.h.in COPYING install-sh NEWS
autom4te.cache configure depcomp Makefile.am README
autoscan.log configure.ac hello.c Makefile.in
[root@localhost hello]# ls configure.in -l
-rw-r--r-- 1 root root 536 Dec 27 04:29 configure.in

8.配置

运行自动配置设置文件configure,把Makefile.in变成最终的Makefile。

[root@localhost hello]# ./configure    //配置,生成Makefile文件
……
config.status: creating Makefile
config.status: executing depfiles commands
[root@localhost hello]# ls
aclocal.m4 ChangeLog config.status COPYING install-sh missing
AUTHORS config.h configure depcomp Makefile NEWS
autom4te.cache config.h.in configure.ac hello.c Makefile.am README
autoscan.log config.log configure.scan INSTALL Makefile.in stamp-h1
[root@localhost hello]# ls -l Makefile*
-rw-r--r-- 1 root root 16876 Dec 27 04:51 Makefile
-rw-r--r-- 1 root root 68 Dec 27 04:46 Makefile.am
-rw-r--r-- 1 root root 17180 Dec 27 04:50 Makefile.in

9.测试

运行make命令进行编译,下面的示例中Make的主要编译命令为"gcc -g -O2 -o hello hello.o",此句对应本节前面介绍的手工编辑的Makefile文件内容。

[root@localhost hello]# cd ../hello
[root@localhost hello]# make //执行make命令
make all-am
……
gcc -g -O2 -o hello hello.o //编译指令
……

编译成功后,将在当前目录下生成并运行可执行程序hello。测试源代码是否正确:

[root@localhost hello_2]# ./hello
hello!GNU
此方法生成的makefile文件很全面。使用"make install"命令把目标文件安装在系统中。
[root@localhost hello]# make install      //安装
make[1]: Entering directory '/root/book/ch02/ch0206/hello'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
/usr/bin/install -c 'hello' '/usr/local/bin/hello' //安装目标文件
make[1]: Nothing to be done for 'install-data-am'.
make[1]: Leaving directory '/root/book/ch02/ch0206/hello'

使用"make uninstall"命令把目标文件从系统中卸载。

[root@localhost hello]# make uninstall      //卸载命令
rm -f '/usr/local/bin/hello' //从系统中卸载

使用"make clean"命令清除编译时的obj文件。

[root@localhost hello]# make clean
test -z "hello" || rm -f hello
rm -f *.o //删除obj文件

使用"make dist"命令将程序和相关的文档打包为一个压缩文档以供发布。

[root@localhost hello]# make dist
……
[root@localhost hello]# ls //查看生成的文件
aclocal.m4 config.h.in configure.scan install-sh README
AUTHORS config.h.in~ COPYING Makefile stamp-h1
autom4te.cache config.log depcomp Makefile.am
Changelog config.status hello-1.0.tar.gz Makefile.in
ChangeLog configure hello.c missing
config.h configure.ac INSTALL NEWS
[root@localhost hello]# ls hello-1.0.tar.gz -l //打包文件
-rw-r--r-- 1 root root 67699 Dec 27 06:33 hello-1.0.tar.gz


Friday, December 12, 2008

Linux 档案与目录管理



  • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。


  • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd ../man』这就是相对路径的写法啦!

常用的目录『符号』代表的意义








. 代表此层目录
.. 代表上层目录
~ 代表自己的家目录
~user 代表到 user 这个人的家目录

几个常用的指令:





    • cd 变换目录


    • pwd 显示目前的目录


    • mkdir 建立一个新目录


    • rmdir 删除一个里面是空的空目录


cd
语法[root @test /root ]# cd [相对路径或绝对路径]
参数说明:
路径有『相对路径』与『绝对路径』的分别,请千万小心啰!
范例:
[root @test /root]# cd ..       <==回到上一层目录
[root @test /root]# cd ../home     <==相对路径的写法
[root @test /root]# cd /var/www/html  <==绝对路径的写法
[root @test /etc]# cd         <==回到使用者的家目录
[root @test /etc]# cd ~         <==回到使用者的家目录!
[root @test /etc]# cd ~test      <==回到 test 这个使用者的家目录



一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,至于使用者会在预设的 /home/username 底下



家目录还有一个代码,那就是『 ~ 』符号!例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢!此外,如果你的 Linux 主机当中有个 testing 的账号,你要到他的家目录去,可以下达『 cd ~testing』立刻去到 testing 的家目录啰!



pwd 语法:



root @test /root ]# pwd



范例:



[root @test root]# cd /home/test



[root @test test]# pwd /home/test <==显示目前你所在的目录呦!



mkdir 语法:



[root @test /root ]# mkdir [-mp] [目录名称]



参数说明:



-m :设定档案的权限喔!直接设定,不需要看 umask 这个内容的脸色!



-p :帮助你直接将上面的目录递归建立起来!



范例:



[root @test /root]# cd tmp



[root @test /tmp]# mkdir test<==建立名称为 test 的目录



[root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上层目录



[root @test /tmp]# mkdir -m 711 testqq <==建立权限为 711 的目录!



[root @test /tmp]# ll test*



drwxrwxr-x 2 test test 4096 Feb 6 20:47 test/



drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/



drwx--x--x 2 test test 4096 Feb 6 20:48 testqq/



rmdir 语法:



[root @test /root ]# rmdir [-p] [目录名称]



参数说明: -p :将上层的目录也删除吧!



范例:



[root @test /root]# rmdir test<==删除名称为 test 的目录



[root @test tmp]# ll



drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/



[root @test tmp]# rmdir test1



rmdir: `test1': Directory not empty



[root @test tmp]# rmdir -p test1/test2/test3/test4



[root @test tmp]$ ll



如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用 rm -rf test 啰



环境变量 PATH




如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!如何增加?可以使用:  
PATH=”$PATH”:/root  这种方式来增加即可!另一种方式则是使用完整档名,亦即直接使用相对或绝对路径来执行,例如:  
/root/ls ./ls 因为在同一个目录中,而我们又知道在同一个目录中的目录符号为『 . 』,因此,就以上面的 ./ls 来执行也可以!这种执行方式以后您应该会很常见到才对! 
如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的档案就会被先执行了!  
咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的使用者在 /tmp 里面写了一个 ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能会『中标』,所以啰,为了安全起见,不建议将『 . 』加入 PATH 的搜寻当中!



档案与目录管理:



ls 显示文件名称、属性等



cp 拷贝档案或目录



rm 删除档案或目录



mv 移动档案或目录



[root @test /root ]# ls [-ailS]



参数说明:



-a :全部的档案都列出(连同隐藏档)



-i :印出 inode 的值



-l :长的列出,连同档案大小的数据等等



-S :以档案大小排序



--color=never :不要显示颜色



--color=always :均显示颜色



--color=auto :由系统自行判断!



cp 语法:
[root @test /root ]# cp [-drsu] [来源档] [目的档]



参数说明:



-d     :在进行 copy 的时候,如果是 copy 到 link 档案,若不加任何参数,则预设情况中会将 link 到的源文件        copy 到目的地,若加 -d 时,则 link 档案可原封不动的将 link 这个快捷方式其拷贝到目的地!



-r     :可以进行目录的 copy 呦!



-s :做成连结档,而不 copy 之意!与 ln 指令相同功能!



-u, --update:如果来源档比较新,或者是没有目的档,那么才会进行 copy 的动作!可用于备份的动作中!



范例:



[root @test /root]# cp .bashrc bashrc <==将 .bashrc 拷贝成 bashrc 这个档案!



[root @test /root]# cp -r /bin /tmp/bin <==这个功能就好玩啦!这是用来 copy 整个目录的参数!



[root @test /root]# cp -s .bashrc bashrc <==将 .bashrc 建立一个连结档,档名为 bashrc



[root @test /root]# cp -u /home/.bashrc .bashrc <==先检查 /home/.bashrc 是否与 .bashrc 不同,如果不同的话就开始 copy 一份!如果相同则不做任何动作!



rm 语法:



root @test /root ]# rm [-fir] [檔名]



参数说明:



-i :提供使用者确认(这是默认值)



-r :循环,就是一直杀掉,直到没有东西为止的意思



-f :force ,就是强力杀掉啦!



范例:



[root @test /root]# cp .bashrc bashrc<==建立一个新档案,bashrc



[root @test /root]# rm bashrc <==会显示如下的提示: rm: remove `bashrc'?



[root @test /root]# mkdir testing



[root @test /root]# cp .bashrc testing



[root @test /root]# rmdir testing rmdir:



`testing': Directory not empty <==由于 testing 里面有 .bashrc ,所以砍不掉!



[root @test /root]# rm -rf testing <==持续删除该目录下的所有档案与目录

Thursday, December 11, 2008

Linux 目录配置


















/bin 这是放例如: ls, mv, rm, mkdir, rmdir, gzip, tar, telnet, 及 ftp 等等常用的执行档的地方(这些执行档的执行方法会在后面提到),有时候这个目录的内容与 /usr/bin 是一样的(有时候甚至会使用连结档哩),是给一般使用者使用的执行程序放置的所在!
/boot 没错,这里就是放置你 Linux 核心与开机相关档案的地方,这个目录底下的 vmlinuz-xxx 就是 Linux 的 Kernel 啦!粉重要的东西!而如果你的开机管理程序选择 grub 的话,那么这个目录内还有 /boot/grub 这个次目录呦!
/dev 摆放一些与装置有关的档案。基本上 Unix 或 Linux 系统均把装置当成是一个档案来看待,例如 /dev/fd0 代表软盘,亦即 Windows 系统下的 A 槽,而 /dev/cdrom 则代表光盘,等等!而如上所述,在这个目录底下的档案型态通常分为两种喔,分别是管理磁盘 Input/Output 的 Block 档案与周边的 Character 档案。
/etc 系统在开机过程中需要读取的档案均在这个目录中,例如 Lilo 的参数、人员的账号与密码、系统的主要设定、http 架站的参数内容、你所要开启的服务项目等等都在这个目录中,所以在这个目录下工作的时候,请记得一定要备份,否则档案被改掉了可是很麻烦的!
/etc/rc.d 这个路径主要在记录一些开关机过程中的 scripts 档案, scripts 有点像是 DOS 下的批次档(.bat檔名)
/etc/rc.d/init.d 所以服务预设的启动 scripts 都是放在这里的,例如要启动与关闭 iptables 的话,可以:
/etc/rc.d/init.d/iptables start
/etc/rc.d/init.d/iptables stop
/etc/xinetd.d 这个路径在较新的 Linux distribution 当中才有,由于早期的版本用来开启服务的档案是 inetd.conf ,但是在较新的版本中,开启服务的项目已经变成使用 xinetd.conf 这个档案,因此,你若需要启动一些额外的服务的话,在 Mandrake 9.0 或者是 Red Hat 7.0 以后就要到 /etc/xinetd.d 这个目录下了。
/etc/X11 这是与 X windows 有关的设定文件所在的目录,尤其里面的 XF86Config-4 更是重要呢!
/home 基本上,这是系统预设的使用者的家目录( home directory ),在你新增一般使用者账号的时候,预设的使用者家目录都在这里设定好啰!
/lib 在 Linux 执行或编译一些程序的时候,均会使用到一些函式库(library),就在这个目录下
/lost+fount 系统不正常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。例如你加装一棵硬盘于 /disk 中,那在这个目录下就会自动产生一个这样的目录 /disk/lost+found
/mnt 这是软盘与光盘预设挂载点的地方;通常软盘挂在 /mnt/floppy 下,而光盘挂在 /mnt/cdrom 下,不过也不一定啦!只要你高兴,随便找一个地方来挂载也可以呀!
/proc 系统核心与执行程序的一些信息。例如你的网络状态的问题啦!这个目录将在启动 Linux 的时候自动的被挂上,而且该目录底下不会占去硬盘空间!因为里面都是『内存』内的数据啦
/root 系统管理员的家目录
/sbin 放置一些系统管理常用的程序,例如: fdisk, mke2fs, fsck, mkswap, mount 等等。与 /bin 不太一样的地方,这个目录下的程序通常是给 root 等系统管理员使用的程序喔!
/tmp 这是让一般使用者暂时存放档案的地方,例如你在安装 Linux 下的软件时,可能软件预设的工作目录就是 /tmp ,所以你要定期的清理一下,当然,重要数据最好不要放在这里!
/usr 这是最重要的一个目录了,里面含有相当多的系统信息,内有许多目录,用来存放程序与指令等等。这个目录有点像是 Windows 底下的『Program Files』那个目录说~
/usr/bin 放置可执行程序,如前所说,这个目录的档案与 /bin 几乎是相同的。
/usr/include 一些套件的header檔。基本上,当我们在以 tarball 方式( *.tar.gz 的方式安装软件)安装某些数据时,会使用到的一些函式库都在这个目录底下喔!
/usr/lib 内含许多程序与子程序所需的函式库。
/usr/local 在你安装完了 Linux 之后,基本上所有的配备你都有了,但是软件总是可以升级的,例如你要升级你的 proxy 服务,则通常软件预设的安装地方就是在 /usr/local 中( local 是『当地』的意思),同时,安装完毕之后所得到的执行文件,为了与系统原先的执行文件有分别,因此升级后的执行档通常摆在 /usr/local/bin 这个地方。

给个建议啦,通常 VBird 都会将后来才安装上去的软件放置在这里,因为便于管理呦!

/usr/sbin 放置管理者使用程序,与 /sbin 类似的功能
/usr/share/doc 放置一些系统说明文件的地方,例如你安装了 lilo 了,那么在该目录底下找一找,就可以查到 lilo 的说明文件了!很是便利!
/usr/share/man 放置一些程序的说明文件的地方,那是什么?呵呵!就是你使用 man 的时候,会去查询的路径呀!例如你使用 man ls 这个指令时,就会查出 /usr/share/man/man1/ls.1.bz2 这个说明档的内容啰!
/usr/src 这是放置核心原始码的预设目录,未来我们要编译核心的时候,就必须到这个目录底下呦!
/usr/X11R6 X Window System存放相关档案的目录
/var 这个目录可就重要了!所有服务的登录文件或错误讯息档案(log files)都在 /var/log 里面,此外,一些数据库如 MySQL 的数据库则在 /var/lib 里头,此外,使用者未读邮件邮件的预设放置地点为 /var/spool/mail !呵呵!你说重不重要呀!?

  • 一般主机可能会分配的磁盘情况

  • 好了,知道了 Linux 的档案权限,目前也知道了各个档案内可能摆放的数据是什么了,那么再来说说你的目录与磁盘分割之间的相关性。通常一般的大型主机都不会将所有的数据放置在一个磁盘中(就是只有一个『 / 』根目录),这有几个目的:
     
    1. 安全性考虑:你的系统通常是在 /usr/ 中,而个人数据则可能放置在 /home 当中,至于一些开机数据则放置在 /etc 当中。如果将所有的数据放在一起,当你的系统不小心被黑客破坏,或者不小心自己砍了一个小东西,则所有的咚咚也都跟着不见了.....这对于我们市井小民 或许无所谓,再安装一次就好了,但是对于一些大型企业可不行这样!因此需要将数据分别放置于不同的磁盘中,会比较保险些。

    2.  
    3. 便利性:如果你需要升级你的系统的话,是否需要重新 format 安装呢?有些数据例如 /home 里面的数据为个人用户的数据,似乎与系统无关!所以如果你将这些数据分别放置于不同的磁盘,则你要升级或者进行一些系统更动时,将比较有弹性。
     
    你或许可以将你的系统做成这样的 partition 分布:
     
      /
      /boot
      /usr
      /home
      /var
     
    这是比较常见的磁盘分布情况,其中,
     
    • / 根目录可以分配约 256 MB 以内;
    • /boot 大概在 50 MB 就可以了,因为开机档案并不大;
    • /var 就至少需要 1GB 以上,因为你的 mail 、 proxy 预设的储存区都在这个目录中,除非你要将一些设定改变!
    • /home/usr 通常是最大的,因为你所安装的数据都是在 /usr/ 当中,而用户数据则放置在 /home 当中,因此通常书上都会建议你将所剩下的磁盘空间平均分配给这两个目录说!

Linux 支持的档案格式与档案种类

1 档案格式


Linux 的正统档案格式为 ext2 这一个

不过,目前 Linux 所能支持的档案格式非常的多,不过,你必须要将你所想要支持的档案格式编译到你的核心当中才能被支持!


Linux 能够支持的档案格式与核心是否有编译进去有关,所以你可以到你的 Linux 系统的

/lib/modules/`uname –r`/kernel/fs


目前使用的最广泛的虽然还是 ext2 ,不过,最近释出的 Linux distribution 大多已经预设采样 ext3 或 reiserfs 这种具有日志式管理( Journaling )的档案格式了。


2 档案种类


2.1 正规档案( regular file ):

就是一般类型的档案,在由 ls –al 所显示出来的属性方面,第一个属性为 [ - ]。另外,依照档案的内容,又大略可以分为两种档案种类:
纯文字文件(ascii) :这是 Unix 系统中最多的一种啰,几乎只要我们可以用来做为设定的档案都属于这一种;
二进制文件(binary) :通常执行档除了 scripts (文字型批次文件)之外,就是这一种档案格式;

 
2.2 目录 (directory):

就是目录啦!第一个属性为 [ d ];  

2.3 连结档 (link):

就是类似 Windows 底下的快捷方式啦!第一个属性为 [ l ];  

2.4 设备档 (device):

与系统周边相关的一些档案,通常都集中在 /dev 这个目录之下!通常又分为两种:
区块 (block) 设备档 :就是一些储存数据,以提供系统存取的接口设备,简单的说就是硬盘啦!例如你的一号硬盘的代码是 /dev/hda1 等等的档案啦!第一个属性为 [ b ];
字符 (character) 设备档 :亦即是一些串行端口的接口设备,例如键盘、鼠标等等!第一个属性为 [ c ]。


3 Linux 档案附档名:


一个 Linux 档案能不能被执行,与他的第一栏的十个属性有关,与文件名根本一点关系也没有


如何改变档案权限

chgrp :改变档案所属群组

chown :改变档案所属人

chmod :改变档案的属性、 SUID 、等等的特性


1 chgrp :改变档案所属群组


语法: chgrp 群组名称 档案或目录


2 chown :改变档案所属人


语法: chown [ -R ] 账号名称 档案或目录 chown [ -R ] 账号名称:群组名称 档案或目录

chown 的用途还满多的,他还可以顺便直接修改群组的名称呢!此外,如果要连目录下的所有次目录或档案同时更改档案拥有者的话,直接加上 –R 的参数即可!


3 改变九个属性 ( chmod ):


3.1 数字类型改变档案权限


使用数字来代表各个属性,各属性的对照表如下:  
r:4

w:2

x:1

例如当属性为 [ -rwxrwx--- ] 则是:  
owner = rwx = 4+2+1 = 7

group = rwx = 4+2+1 = 7

others = --- = 0+0+0 = 0


语法: chmod [-R] xyz 档案或目录

xyz 为同三组 rwx 属性数值的相加


常发生的一个问题就是,常常我们以 vi 编辑一个 shell 的文字文件后,他的属性通常是 -rw-rw-rw- 也就是 666 的属性,如果要将他变成可执行档,并且不要让其它人修改此一档案的话,那么就需要 -rwxr-xr-x 这一个 755 的属性,所以 chmod 755 test.sh 就需要这样做啰!
另外,有些档案你不希望被其它人看到,例如 -rwxr-----,那么就下达 chmod 740 filename 吧!


3.2 符号类型改变档案型态


由 u, g, o 来代表三群的属性; a 则代表 all 亦即全部的三群

读写的属性就可以写成了 r, w, x


u +(加入) r

chmod g -(除去) w 档案或目录

o =(设定) x

a

假如我们要『设定』一个档案[.bashrc ]的属性为『-rwxr-xr-x』时,基本上就是:  
u: 具有可读、写、执行
g 与 o: 具有读与执行

chmod u=rwx,og=rx .bashrc

请注意, u=rwx,og=rx 这一段文字之间并没有空格符隔开呦


Linux 档案属性类别--摘自《鸟哥的linux私房菜》

1 第一栏代表这个档案的属性: 这一栏其实共有十个属性


第一个属性代表这个档案是『目录、档案或连结文件』:
当为[ d ]则是目录,例如上表的第 11 行;
为[ - ]则是档案,例如上表的第 5 行;
若是[ l ]则表示为连结档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备;
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标。


接下来的属性中,三个为一组,且均为『rwx』的三个参数的组合。其中,[ r ]代表可读、[ w ]代表可写、[ x ]代表可执行:
第一组为『拥有人的权限』,以第五行为例,该档案的拥有人可以读写,但不可执行;
第二组为『同群组的权限』;
第三组为『其它非本群组的权限』。


范例:若有一个档案的属性为『-rwxr-xr--』,简单的可由下面说明之:  
[-][rwx][r-x][r--]

1 234 567 890

1 为:代表这个文件名为目录或档案(上面为档案)

234为:拥有人的权限(上面为可读、可写、可执行)

567为:同群组使用者权限(上面为可读可执行)

890为:其它使用者权限(上面为仅可读)


需要特别留意的是 x 这个标号

因为 x 与 目录 的关系相当的重要,如果您在该目录底下不能执行任何指令的话,那么自然也就无法执行 ls, cd 等指令,所以啰,也就无法进入了,因此,请特别留意的是,如果您想要开放某个目录让一些人进来的话,请记得将该目录的 x 属性给开放呦!


2 第二栏表示为连结占用的节点 (i-node) ( 若为目录时,通常与该目录底下还有多少目录有关 )这部分将在介绍连结 link 档案时 (下一节) 再深入的介绍;  

3 第三栏表示这个档案(或目录)的『拥有人』;  

4 第四栏表示拥有人的群组;


5 第五栏为这个档案的大小;


6 第六栏为这个档案的建档日期或者是最近的修改日期,分别为月份、日期及时间

如果您是以繁体中文来进行安装您的 Linux 时,那么预设的语系可能会被改为中文。而由于中文无法显示在文字型态的终端机上面,所以这一栏会成为怪怪的乱码,这个时候,请修改一下 /etc/sysconfig/i18n 这个档案,里面的『 LC_TIME 』修改为:『 LC_TIME=en 』再储存离开,再登入一次,就可以得到英文字形显示的日期了!那么如何修改该档案呢?呵呵!以 root 身份用 vi 修改! ;


7 第七栏为这个档案的档名,如果档名之前多一个『 . 』,则代表这个档案为『隐藏档』,例如上表第 6 行的『.bashrc_history』档名即是隐藏档,由于我们有下一个参数为 ls -al,所以连隐藏档都列出来,如果你只输入 ls 则档名有加『 . 』的档案就不会被显示出来!