LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: probing

╭∩╮(︶︿︶)╭∩╮FreeBSD使用大全FreeBSD╭∩╮(︶︿︶)╭∩╮

[复制链接]
 楼主| 发表于 2003-2-11 12:06:15 | 显示全部楼层

FreeBSD连载(19):检查硬盘调整文件系统的目录结构

维护文件系统

  由于文件系统是系统中非常重要的部分,因此维护文件系统的任务也非常重要。这个任务包括检查、修复文件系统,以及调整目录树以适合系统的变化,增添新存储设备等。

    *
      检查硬盘

  正常情况下使用FreeBSD的时候,文件系统不会出现问题。然而在某些情况下,如没有正常关机操作就切断了计算机的电源,就会造成文件系统出现问题。此外,出于系统维护的目的,也需要经常检查磁盘的正确性。这就需要使用文件系统检查工具fsck。

# fsck /dev/wd0s3e

** /dev/rwd0s3e

** Last Mounted on /var

** Phase 1 - Check Blocks and Sizes

** Phase 2 - Check Pathnames

** Phase 3 - Check Connectivity

** Phase 4 - Check Reference Counts

** Phase 5 - Check Cyl groups

573files,3387used,26340free(132frags,3276blocks,0.4%fragmentation)

  fsck使用raw方式存取磁盘,因此即使使用普通块设备/dev/wd0s3e为参数,fsck也将使用对应的raw方式设备文件/dev/rwd0s3e进行操作。为了避免与当前磁盘的存取操作冲突,因此要求在进行检查之前先将文件系统卸载,否则文件系统的状态总是不正确(没有被正确的卸载)。

  为了不影响系统中正运行的进程,进行磁盘维护,最好首先进入单用户状态。这个状态下将关闭所有不必要的进程,系统也只安装了根文件系统,其他文件都没有安装,而且即使是根文件系统,也是以只读方式安装的,这样能保证不会发生存取冲突,导致文件系统出现错误。

  一旦磁盘被检查出错误,fsck将提示管理员是否进行修改,可以使用 “-y” 参数,使得fsck自动进行修复工作,而不进行任何提示。系统每次启动的时候,都会使用这个参数自动检查和修复文件系统。

    *
      调整文件系统的目录结构

  系统安装时在目录树上安装了不同的文件系统,随着时间的推移,有些目录使用的文件系统就会被文件数据占满,而有些目录下的文件系统却很少使用,使得文件系统不太适合系统的需求,此时或者增加新的硬盘设备,或者将文件在不同文件系统中进行调整。

  例如,如果FreeBSD系统被用作一台News服务器,读者发表文章将保存在/var目录所在的文件系统,而缺省情况/var目录空间有限,那么这个目录就会被占满。如果不断在系统中安装各种应用软件,那么/usr/loc al目录所在的文件系统会被占满,等等。管理者就需要根据实际情况进行调整,可以使用df命令来查看文件系统的当前状态信息。

# df

Filesystem  512-blocks     Used     Avail  Capacity  Mounted on

/dev/wd0s3a      63550    50822      7644     87%    /

/dev/wd0s3f    1693228   977436    580334     63%    /usr

/dev/wd0s3e      59454     6772     47926     12%    /var

profs                8        8         0    100%    /proc

/dev/wd0s1     2055744  2032096     23648     99%    /mnt/dosc

  df报告的信息包括这个文件系统的大小和剩余空间(包括使用大小、剩余大小和已使用空间的百分比),如果一个文件系统中的剩余空间不足,而另一个文件系统还剩余足够的空间,就可以通过调整来充分利用现有空间。

  有时,df报告已使用空间的百分比会超过100%,这是由于UFS文件系统中有一些冗余空间可用。这样就给用户一个机会,可以不必因为文件系统满而中断当前正在写文件的操作,而清除同一个文件系统中其他不必要的文件,在这个文件系统中腾出存储空间,从而保证数据最后能被可以正确的保存在文件系统中。

  调整文件系统空间的基本方法是使用符号连接,可以先将该文件系统中的一个子目录中数据全部转移或复制到其他文件系统中的另一个目录中,然后将原有目录改名或删除,再建立一个对新目录的符号连接来达到目的。例如可以将/usr/local 目录转移到另一个安装到/disk2的文件系统中:

# cd /usr/local

# tar cf - * | (cd /disk2; tar xf -)

# mv /usr/local /usr/local.old

# ln -s /disk2/local /usr/local

  为了保证数据安全,这里例子中没有使用mv直接移动数据,而是使用tar将数据复制到另一个目录中,之所以使用tar而非cp -R命令,是为了保证复制文件和目录时保留它们的属主、权限控制属性的一致性。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:07:13 | 显示全部楼层

FreeBSD连载(20):建立文件系统

建立文件系统

  当系统负载逐步增加,仅仅依靠原有文件系统的空间是不够的,更有效的方式是增加新的硬盘设备。这首先需要改动硬盘及其控制器的硬件设置,以及FreeBSD内核配置,以便硬盘能安装到计算机上并能被FreeBSD内核正确识别。接下来就需要在新硬盘上创建新的文件系统。

  在系统安装过程中,已经接触了在FreeBSD下管理硬盘和分区的方式,FreeBSD需要两个步骤才能为文件系统分配一个硬盘空间,第一步是为FreeBSD创建一个UFS系统分区,这个分区只由FreeBSD来使用,然后在第二步中从这个分区中,为各个文件系统划分空间,在FreeBSD下称为创建文件系统的DiskLabel标签。

  最容易和直观的创建新文件系统或交换空间方式是使用安装程序sysinstall,以便系统启动能够自动安装上这个文件系统。使用Sysinstall来安装新文件系统的方式在系统安装的过程中已经有了详细描述,以root权限执行/stand/sysinstall就能进入Sysinstall,然后选择Partition进行分区,选择 Label创建和维护BSD文件系统。

    * 建立文件系统的命令行方式

  除了使用sysinstall之外,还可以使用命令行的方式来完成这些操作。相比较而言,命令行的方式更困难,也更容易出错,因此一般不需要使用这种方式,然而命令行方式能带来更大的灵活性,在一些系统维护情况下更为有效。

  命令行方式建立文件系统需要使用fdisk命令进行硬盘的分区工作,fdisk能查看系统分区表上的分区信息,并更改其分区设置;然后disklabel命令可以在分区中划分不同子分区空间并标记各个空间的DiskLabel ;使用newfs建立新文件系统,或者使用swapon命令增加交换设备。

  创建新文件系统,首先要使用交互式的fdisk命令(使用-i参数)对硬盘进行分区,不带参数的fdisk命令仅仅显示该硬盘的分区设置,而不能更改设置。fdisk均使用它检测到的硬盘设置作为缺省设置,如果不需要改变,就可以直接使用这些缺省设置回应其询问。在fdisk中可以修改的数据有硬盘映射数据,以及四个分区的起始位置和类型。

# fdisk -i wd1

******* Working on device /dev/rwd1 *******

parameters extraced from in-core disklabel are:

cylinders=525 heads=255 sectors/track=63 (16065 blks/cyl)

 

parameters to be used for BIOS calculations are:

cylinders=525 heads=255 sectors/track=63 (16065 blks/cyl)

 

Do you want to change our idea of what BIOS thinks ? [n]

  fdisk能检测硬盘的真实映射数据和BIOS的映射数据,由于FreeBSD不使用BIOS存取硬盘数据,因此这两个数据有可能不一致,但这不影响FreeBSD系统对硬盘的访问。但BIOS的映射数据必须与BIOS中的设置一致,否则fdisk使用错误数据划分的分区,系统的引导和其他使用BIOS的操作系统就无法正确识别。当硬盘上没有硬盘分区时,fdisk无法获得正确的BIOS映射数据(因为FreeBSD不访问BIOS),此时就需要在询问是否更改BIOS映射方式时回答yes,以进行更改。一般在硬盘上已有分区或不需要兼容的情况下,不需要更改这个设置,直接回车选择no略过这个设置。

The data for partition 1 is:

UNUSED>

Do you want to change it? [n] y

  然后,fdisk会针对每个分区询问是否更改其数据,此时按需要更改分区的设置。由于使用fdisk可以直接指定分区的起始和结束,因此具有很大的灵活性,也很容易出现错误,如分区的划分出现重叠。由于多操作系统引导程序 Boot Manager占用了硬盘主引导区后面的几个空余扇区,按照DOS/Windows的标准,虽然主引导区仅占用了一个扇区,同一柱面中的其他扇区(一般为64或32个)也不能被分配给其他分区,而要保持为空余,这些扇区可以为 Boot Manager占用。这样就在fdisk指定分区的起始时,是不能从0开始的,而要从下一个柱面的起始位置开始。

  然后按照要求回答分区的类型,(FreeBSD分区为165,DOS分区为6),分区的开始位置和大小,注意单位应该为512字节(扇区大小)。后面的大部分参数可以使用缺省值回应询问,或者设定激活分区。

  更改分区设置并保存退出fdisk之后,还需要检查系统中是否具有对应的设备文件,必须在/dev目录下拥有相应的设备文件才能访问物理设备。

  划分了UFS基本分区之后,就可以使用disklabel创建文件系统或交换空间的disklabel了,为了方便起见,可以先为这个分区建立空的disklabel,然后再进行修改。

# disklabel -r -w wd1s3 auto

# disklabel -e wd1s3

  在使用-w参数为分区wd1s3生成缺省的disklabel时,就必须给定磁盘的类型,通常可以使用auto ,让系统自动检测。除了自动侦测之外,在/etc/disktab文件中也给出了很多标准磁盘类型数据,这些数据中包括包括软盘在内的各种磁盘类型,对于这个文件中不存在的新型磁盘,可以根据原有类型进行修改而生成新数据。通常很少需要利用这个文件中提供的磁盘类型数据来生成disklabel,使用auto参数能让系统自动检测磁盘的类型。极少数情况下,例如在配置伪存储设备vn的时候,才需要使用具体磁盘类型参数。

  直接生成的disklabel仅仅包括磁盘的类型信息,以及一个使用c表示整个系统分区的空disklabel ,而没有具体文件系统的disklabel。要真正划分文件系统,需要再使用disklabel -e编辑更改disklabel 配置,例如增加两个子分区,b和e,就需要为b设置类型swap的disklabel,为e设置类型4.2BSD的disklabel,而c使用的unused类型表示这个disklabel不用做文件系统或交换空间,可用于特定目的,如raw方式存取硬盘。

  注意由于要使用手工计算文件系统的大小,因此很容易发生重叠等错误。各个不同空间的disklabel允许重叠,例如缺省产生的以c代表的disklabel表示整个FreeBSD系统分区就会与其他disklabel的空间重叠。但是具体用做文件系统或交换空间的部分就不能重叠,否则会导致存取错误发生。

  保存退出后,就可以使用disklabel -r wd1s1来查看新建的代表文件系统或交换空间的label 。下面为增加之后的disklabel的最后一部分。

#     size   offset    fstype   [fsize bsize bps/cpg]

b:    61440        0    swap                    

c:   409536        0    unused        0     0      

e:   348096    61440    4.2BSD        0     0     0

然后在新建的disklabel为4.2BSD类型的空间上真正建立文件系统,需要使用newfs命令。

# newfs /dev/rwd1s1e

执行fsck检查刚建立的磁盘分区有无错误

# fsck -y /dev/rwd1s1e

然后就可以将这个建立好的文件系统安装到系统中了,如果建立的是交换空间,可以使用swapon命令可使该交换分区立即生效。

# mount /dev/wd1s1e /mnt

# swapon /dev/wd1s1b

  为了在启动时自动安装上这个文件系统,需要编辑/etc/fstab文件,将文件系统和交换设备加入系统,那么下次系统启动之后,就能使用新的磁盘分区和新的交换设备了。例如新磁盘为wd1,相应FreeBSD的分区为wd1s3e (文件系统)和wd1s3b(交换分区),文件系统要安装到系统的/disk2目录下,则fstab应为:

# Device      Mountpoint  FStype  Options  Dump    Pass#

/dev/wd0s3b   none        swap    sw       0       0

/dev/wd0s3a   /           ufs     rw       1       1

/dev/wd0s3f   /usr        ufs     rw       2       2

/dev/wd0s3e   /var        ufs     rw       2       2

proc          /proc       procfs  rw       0       0

/dev/wd1s1e   /cdrom      cufs    rw       2       2

/dev/wd1s1b   none        swap    sw       0       0

  然后就可以使用新硬盘来调整空间紧张的磁盘上的文件和目录。此时,除了可以使用符号连接这种方式之外,还可以直接将该新建的文件系统安装到需要的目录下。这也是推荐的方式,因为符号连接会对文件操作的性能造成少许影响。

# cd /usr

# mv local local.old

# mkdir local

# mount /dev/wd1s1e /usr/local

# mv /usr/local.old/* /usr/local/

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:10:27 | 显示全部楼层

FreeBSD连载(21):管理交换设备

管理交换设备

  在FreeBSD系统中,交换设备的作用非常大,需要为FreeBSD留下足够的交换空间。在系统负载非常大的时候,交换空间不够也会影响系统的执行进程。通常应该将系统交换空间的大小设置为物理内存的1-2.5倍。由于交换空间是用作虚拟存储器,和物理内存进行交换数据的,因此应该设置到高速硬盘上,或者将交换空间分布到多个硬盘中,以均衡负载。FreeBSD是以交错的方式使用各个不同的交换分区,因此如果在不同的硬盘上分布交换分区,就能提高交换设备的存取速度。通常FreeBSD使用disklabel为b的设备用做交换设备,在系统运行过程中可以为FreeBSD 增加其他磁盘上的交换设备,或者使用文件用做交换。

  要增加交换设备,首先要沿着上面的过程创建一个新的disklabel,按照习惯做法,使用b作交换空间的 disklabel。再修改/etc/fstab文件,加入一行有关这个交换设备的描述。或者使用swapon立即使分配的交换空间生效。

  如果要使用文件来用做交换空间,首先要在系统中产生一个用作交换的文件,然后更改/etc/rc.conf,将swapfile参数指向这个文件即可。

# dd  if=/dev/zero of=swapfile bs=10240 count=1024

  事实上,交换文件要首先映射为伪存储设备vn,然后才能安装到系统中的。因此要使用交换文件,就需要内核支持伪存储设备vn,缺省内核支持一个vn设备vn0。可以直接访问这个伪存储设备,手工完成增加交换文件的工作。首先要将交换文件和伪设备相联系,然后就能像处理真实设备一样处理这个伪设备了。将文件和伪设备联系起来需要使用vncon fig命令。

# vnconfig /dev/vn0c swapfile

# vnconfig -u /dev/vn0c

  可以再次使用使用-u参数的vnconfig将已经与文件相联系的伪存储设备,脱离与现有文件的联系,首先要求这个伪设备不被系统使用,如vn0c没有用作交换设备或已经从系统中卸载了。通过在vnconfig命令中使用-e 参数,就可以直接使用vnconfig加入交换,而没有必要再次使用swapon命令:

# vnconfig -e /dev/vn0c swapfile swap

伪存储设备的用处不止用于交换文件,也可以用来安装虚拟文件系统。因此就可以使用它来管理软盘或光盘的镜象文件。

# dd if=/dev/rfd0 of=imgfile

# vnconfig vn0c imgfile

# mount -t msdos /dev/vn0c /mnt

  如果不是象上面例子那样从软盘中生成的镜象文件,而是而是要重新建立文件系统,那么需要注意的是磁盘的类型。由于伪设备的大小是由生成的文件决定的,那么这个伪设备对应的磁盘种类显然不是标准磁盘种类,系统显然也无法从伪设备中检测到磁盘类型,因此在生成磁盘的disklabel和进行newfs格式化时就需要指定磁盘类型。一般由于镜象文件的大小与标准磁盘数据对应的大小不一定一致,那么为了充分利用伪设备的大小,就需要在/etc/disktab中生成新磁盘类型的数据。

# vnconfig /dev/vn0c imgfile

# disklabel -r -w vn0 fd1440

# newfs -T fd1440 vn0c

# mount /dev/vn0c /mnt

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:13:05 | 显示全部楼层

FreeBSD连载(22):调整控制台设置

调整系统设置

  在FreeBSD系统中,很多设置都需要直接更改设置文件,例如系统启动脚本rc.conf,控制终端设置文件/etc/ttys等。虽然大部分很多系统的参数可以通过安装程序Sysinstall来设置,但是改动配置文件更为直接。并且对于管理员来讲,只有了解配置文件是如何控制系统的表现,才能从根本上解决在实际操作中遇到的各种问题。

    *
      调整控制台设置

  控制台是个人用FreeBSD系统使用者最常进行操作的位置,因此应该调整控制台设置,使其最适合使用者的习惯。可以在控制台上调整显示使用的字体、键盘映射、屏幕保护、虚拟终端等设置。其中一些设置可以通过安装程序sysinstall 来进行,然而有的设置必须通过命令方式或更改配置文件来完成,而且命令行方式具有更大的灵活性。

    * 虚拟终端与ttys设置

  FreeBSD的控制台上有多个虚拟终端,可以在系统启动之后使用Alt键加上功能键来切换虚拟终端。系统缺省只激活四个虚拟终端,这已经满足绝大多数的需要。其中第四个虚拟终端在缺省情况下没有运行登录程序,这是因为X Server 运行时也需要一个虚拟终端,因此必须将一个没有进程占据的控制台终端留给X Window使用。

  而通过更改内核的设置,FreeBSD可以支持16个虚拟终端设备,由于通常个人计算机只有F1-F12共12 个功能键,事实上只能使用12个虚拟终端。其设备文件从ttyv0到ttyv15,可以使用MAKEDEV来创建这些设备文件。为了增加虚拟终端的数量,除了更改内核设置、创建设备文件之外,还需要编辑系统文件/etc/ttys。这个文件中有下面的内容是与此相关的:

# name  getty                           type    status          comments

#

# This entry needed for asking password when init goes to single-user mode

# If you want to be asked for password, change "secure" to "insecure" here

console none                            unknown off secure

#

ttyv0     "/usr/libexec/getty Pc"       cons25    on  secure

ttyv1     "/usr/libexec/getty Pc"       cons25    on  secure

ttyv2     "/usr/libexec/getty Pc"       cons25    on  secure

ttyv3     "/usr/libexec/getty Pc"       cons25    off secure

  ttyv3对应的行的第四列为 “off” ,这说明这个终端并没有运行getty程序,不会出现登录提示。增加虚拟终端就意味着在这个文件中增加相应的设置行,例如要增加一个虚拟终端,就应该修改这个文件中的相应项为:

ttyv3  "/usr/libexec/getty Pc"   cons25  on  secure

ttyv4  "/usr/libexec/getty Pc"   cons25  off secure

  修改完这个文件之后需要重起系统,在内核支持的条件下,系统将增加一个虚拟终端。

  如果用户在控制台上运行了X Window,由于X Server也需要控制Alt加功能键这样的组合键,因此控制台将这类组合键留给X Window,不再使用它们来切换到其他虚拟终端。此时切换到其他虚拟终端的热键为Ctrl 加Alt再加上相应功能键,而从其他虚拟终端切换回X Window仍然为Alt+功能键F4。这样的方式甚至不限于X Server,也适用于其他直接使用控制台、截留键盘的程序。

  在/etc/ttys文件中,可以看到每个虚拟终端最后一个参数为 “secure” ,这表示这个终端位于安全可信赖的物理位置上,因此在这个终端上可以允许直接使用root帐号登录,如果将其改为 “insecure” ,那么root用户将不能在这个终端上直接登录。由于控制台为系统最基本的终端设备,一般只有管理员或其他可信赖的用户才能使用,因此对应于这些虚拟终端,设置都为 “secure” 。

  这样一旦控制台的物理安全受到危害,系统安全就受到严重的影响。正由于系统信赖控制台,当系统使用单用户模式启动时,不会询问root的口令,这个设置是由ttys文件中的console项来进行控制的,可以将ttys文件中的console项中对应的 “secure” 改为 “insecure” ,就表示控制台是不能信赖的,那么系统在进入单用户状态时,将验证root的口令。在控制台的物理访问控制不能保证的情况下,这个设置虽然不能完全保证非法使用者不能进入单用户状态并获得系统的控制权,但提供了相当重要的保护能力。

  ttys文件中,除了针对虚拟终端的设置之外,还对串行终端ttys0等,用于网络连接的伪终端ttyp0等,提供了设置。要增加相应终端,与控制台虚拟终端类似,除了更改系统内核、设备文件之外,还需要在ttys文件为相应设备提供入口。

    * 控制台键盘设置

  kbdcontrol命令就用于更改键盘设置,包括键盘的映射方式、击键的重复率等,键盘的映射文件保存在 /usr/share/syscons/keymaps/目录下,通常的标准101/102键盘可以使用us.iso.kbd文件。以下例子中使用 “-l” 参数指定键盘映射文件,使用 “-r” 参数指定键盘速度。

# kbdcontrol -l /usr/share/syscons/keymaps/us.iso.kbd

# kbdcontrol -r fast

  除了可以用fast来表示键盘速度之外,还可以精确指定键盘击键的间隔和重复时间,例如fast模式就等同于 250.34,表示击键间隔为250ms,重复时间为34ms,normal模式对应于500.126,slow对应于1000.504。

  指定键盘映射文件的好处是可以自己定义键盘的映射方式,例如可以使用更改键盘配置文件的方法来屏蔽Ctrl-Alt-Del 热键,就可以使用编辑器打开us.iso.kbd文件,将Ctrl-Alt-Del对应的功能由boo t改为nop,表示输入这个击键序列时不进行任何操作。或者可以为boot功能定义其他组合键。

    * 控制台显示设置

  控制台的字体文件均保存在/usr/share/syscons/fonts目录下,通常使用的字体有8x8大小、8x14大小和8x16大小,可以指定使用那些字体文件作为系统使用的这些大小的字体。将这些字体文件载入需要使用vidcontrol命令:

# vidcontrol -f 8x8 /usr/share/syscons/fonts/cp437-8x8.fnt

其中cp437指的是字体代码页为437,这是英文编码,中文编码为Code Page 936(GB)。由于中文为双字节文字,控制台驱动程序处理起来比较困难,还没有对应中文编码的控制台字体文件。

vidcontrol不仅用于载入字体文件,还可以改变屏幕的模式,例如可以将屏幕更改为80x50大小:

# vidcontrol 80x50

  由于80x50模式需要使用8x8字体,因此这需要首先载入8x8字体。如果内核编译时选择了VESA支持选项,并且使用的显示卡也兼容VESA显示模式,还可以将屏幕模式设置为132x60大小,充分利用计算机系统大屏幕显示器的优势。可以使用vidcontrol -i mode来查看当前硬件支持的显示模式。由于不同的显示模式使用的不同大小的字体,必须载入必要大小的字体才能改换到相应模式下。

  vidcontrol还可以用于设置控制台下激活屏幕保护的时间间隔,使用 “-t” 参数指定激活时间。

  而控制台屏幕保护则是通过一个载入可加载模块的方式设置的,在/modules目录中已经安装了几个不同的屏幕保护模块,如black_saver_mod.ko、green_saver_mod.ko、daemon_saver_mod.ko、logo_saver_mod.ko等,这些模块可以使用kldload命令载入内存,kldstat查看各个内核模块的状态,或者kldunload命令将其卸载。载入不同的屏幕保护模块,就将激活不同的屏幕保护。在系统启动时Boot Loader的提示下,可以使用load命令载入模块,也可以通过Boot Loader 的资源文件/boot/loader.rc,用于指定在启动时应该自动执行那些操作。

  通常,可以使用logo_saver_mod作屏幕保护,这是一个FreeBSD吉祥物的图标。

  在FreeBSD 3.0-Release之前,FreeBSD使用/lkm目录下,后缀为.o的可加载模块,而管理模块的命令相应为modload、modstat和modunload。这些模块为a.out格式内核使用的可加载模块,而.ko为ELF内核使用的模块。使用那种格式的内核,就应该载入那种格式的可加载模块,3.1之后如果仍然使用a.out格式的内核,也可以仍然使用这些模块。

  在3.1-Release之后,FreeBSD引入了系统启动时显示启动图标的能力,如同Windows系统在启动时显示蓝天白云图案一样,FreeBSD系统也能够在启动时显示一个预设的图像文件,而启动时产生的检测信息隐藏在图象后面,这个功能称为splash。这个系统启动标志是和新版本的控制台屏幕保护能力是紧密相结合的,当载入这个splash模块而使得启动显示相应的图标之后,每当空闲时间到达而屏幕保护被激活时,就会显示这个图像作为屏幕保护。

  为了设置启动标志及其屏幕保护,首先要内核支持splash伪设备(需要pseudo-device splash配置行),再生成一个小于640x480,256色的非压缩的bmp图象文件,然后将其复制到/boot目录下,更改/boot目录下的loader.rc文件,设置boot loader载入处理图象文件的模块splash_bmp。

# cp logo.bmp /boot

# cat  /boot/loader.rc

load kernel

load -t splash_image_data logo.bmp

load splash_bmp

这也是使用boot loader的资源文件loader.rc的一个例子,可以定制这个资源文件,指定boot loader自动载入相关模块,以及执行其他boot loader的命令。

    * 控制台鼠标设置

  FreeBSD使用一个守护进程moused来接管对鼠标的控制,它可以通过sysinstall很方便的进行设置。moused就能将鼠标的输入传递给控制台驱动程序,这样就可以在文本状态下使用鼠标进行操作,例如在普通情况下可以进行粘贴操作,在应用程序支持的条件下,还能和应用程序进行交互。缺省条件下仅有第一个虚拟控制台支持这种鼠标操作,在这个控制台上使用 “vidcontrol -m off” 就能关闭鼠标指针,禁止这种操作,以后仍然可以使用 “vidcontrol -m on” 许可鼠标的操作能力。

  系统缺省只在第一个控制台虚拟终端设备上打开鼠标指针,因此为了在其他虚拟终端上使用鼠标,必须在相应的控制台上使用vidcontrol -m on命令。

  执行moused,必须要指定鼠标连接的端口和类型,这样moused才能和鼠标通信。常用的鼠标有连接到串口的鼠标,它使用的设备为串口设备/dev/cuaa0(串口1)或/dev/cuaa1(串口2),如果使用ps/2接口的鼠标,使用的设备为/dev/psm0,如果使用总线类型接口的鼠标,使用的设备为/dev/mse0。为了使用相应的端口,首先要保证相应的设备被内核正确探测,这可以使用dmesg来查看系统的硬件检测信息,检查设备驱动 sio0,sio1(串口设备),psm0,或者mse0等是否被内核检测到。然后就能启动moused了:

# vidcontrol -m on

# moused -p /dev/cuaa0 -t auto

  使用auto作为鼠标类型的参数,让moused来决定鼠标使用的协议,一般情况下moused能够侦测出正确的协议。一般ps/2鼠标使用ps/2协议,普通总线鼠标使用busmouse协议,串口鼠标使用的协议类型较多,通常标记为MS-2key两键的鼠标使用microsoft协议,PC-3key三键鼠标使用mouse syste m协议,此外还有intellimouse等不同的协议。

  由于Unix下习惯使用三键鼠标进行操作,因此个人计算机上常用的两键鼠标就有些不合适,此时可以使用同时按下左右两键来模拟第三个键,对于moused,这需要使用参数 “-3” 支持,这是全屏幕的moused设置程序不能进行设置的。moused还能更改鼠标的另一些属性,例如滚动速度、点按速度等。

  此外在使用了moused之后,moused将维护一个伪设备文件/dev/sysmouse,这个设备文件行为就如同一个鼠标端口设备,能被其他要使用鼠标的程序,如X Server所使用,简化了这些程序的设置任务。

  一些Linux二进制格式的程序与这个设备文件不兼容,如果需要使用Linux的访问鼠标的应用程序,如X Server,就不能使用moused,而要让Linux程序直接访问物理鼠标设备文件。

  如果要保留这些键盘、显示、鼠标设置,就需要更改系统启动配置文件rc.conf中的相关参数设置,这样每次启动系统将自动使用必要的命令载入正确的设置,以下为与这些设置相关的项,这些项均被被作为参数传递给上述的设置命令,因此需要根据具体设置更改下列选项。

keymap="NO"                # keymap in /usr/share/syscons/keymaps/* (or NO).

keyrate="NO"                # keyboard rate to: slow, normal, fast (or NO).

keybell="NO"                # bell to duration.pitch or normal or visual (or NO).

keychange="NO"                # function keys default values (or NO).

cursor="NO"                # cursor type {normal|blink|destructive} (or NO).

scrnmap="NO"                # screen map in /usr/share/syscons/scrnmaps/* (or NO).

font8x16="NO"                # font 8x16 from /usr/share/syscons/fonts/* (or NO).

font8x14="NO"                # font 8x14 from /usr/share/syscons/fonts/* (or NO).

font8x8="NO"                # font 8x8 from /usr/share/syscons/fonts/* (or NO).

blanktime="NO"                # blank time (in seconds) or "NO" to turn it off.

saver="NO"                # screen saver: blank/daemon/green/snake/star/logo/NO.

moused_enable="NO"        # Run the mouse daemon.

moused_type="auto"        # See man page for rc.conf(5) for available settings.

moused_port="/dev/cuaa0" # Set to your mouse port.

moused_flags="-3"                # Any additional flags to moused.

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:18:24 | 显示全部楼层

FreeBSD连载(23):配置系统时间

配置系统时间

  对于网络操作系统来讲,由于要向多个客户提供服务,因此必须拥有一个精确的系统时间。可以使用date命令来显示当前的时间:

$ date

1999年 4月10日 星期六 18时51分39秒 CST

  date命令按中文方式输出的前提是指定环境变量LC_ALL为zh_CN.EUC,这是用于本地化的一种标准方式。

  由于用于Internet上的网络操作系统的客户可能来自世界的不同地区,因此时间系统必须能标识出不同的时区。计算机中的CMOS时间能设置为两种不同的时间,一种是将CMOS时间设置为格林威治标准时间,使用时区修正给出本地时区的正确时间,另一种方法是将CMOS时间设置为本地时区时间,再使用本地时区修正得到格林威治标准时间。这样系统和其他计算机通信时就能使用标准时间,避免不同时区的计算机时间的差异。

  系统安装程序在进行时区设置时将询问用户使用那种时间设置方式及时区设置,系统安装完成之后,也可以直接使用 tzsetup命令来设置时区信息。所有的时区信息保存在/usr/share/zoneinfo目录中,而本机的时区设置信息保存在/etc/localtime文件中。此外,每个用户也可以使用环境变量TZ来设置与系统不同的时区,这个设置将覆盖系统的设置。

  root用户可以使用带参数date来更改系统时间,例如以下命令将时间设置为1999年3月1日,下午1点54分。

# date 9903011354

1999年 3月 1日 星期一 13时54分00秒 CST

  可以看出时间格式为年、月、日、时、分,每个各占两个数字,其形式即为yymmddhhmm,大部分情况下是对时间进行小调整,可以略去前面的年月日部分,而仅使用四位数字表示时、分,形如hhmm。

    * 通过Internet同步时间

  手工设置时间一方面不方便,另一方面也依赖于本地管理员的时钟的正确性,那么网络上不同的管理员管理的计算机时间必然有偏差,不同计算机的时间偏差就会对一些要求时间同步的服务产生影响。解决这种问题的方法很简单,连接到一个能提供精确时间的服务器上进行时间同步。

  当计算机连接到了Internet之后,那么就能同Internet上存在的很多时间服务器通信,以获得精确的时间。TCP/IP协议中,用于同步时间的协议为ntp协议,在Internet上提供ntp服务的站点有clepsydra.dec.com 、 ben.cs.wisc.edu、truechimer.waikato.ac.nz 等,虽然ntp协议本身考虑了网络延迟,然而网络延迟毕竟会对时间的精确性造成影响,因此应该选用一个离本地计算机最近的时间服务器。

  使用/stand/sysinstall也能设定时间同步,可以根据地域来选择合适的时间服务器,然而由于网络连接并不一定和地域相一致,因此不能完全根据地域的远近来选择时间服务器。

  使用ntp协议更新自己计算机上的时间的一个简单的应用程序为ntpdate,同样这也需要使用root权限执行:

# ntpdate clepsydra.dec.com

10 Apr 19:26:49 ntpdate: step time server 204.123.2.5 offset 517.837146

  ntpdate运行过之后就退出了,为了保持时间的正确性,就要每隔一段时间自动进行时间同步,可以将ntpdate 放入cron中,每隔一段时间就执行一次。然而系统提供了另一个守护进程,xntpd,能够自动周期进行时间同步的工作,这更为适合与Internet有永久连接的计算机。为了运行xntpd守护进程,首先要创建/etc/ntp.conf 文件,其中应包括时间服务器的名字和一个临时文件名。

server                clepsydra.dec.com

driftfile        /etc/ntp.drift

  然后就需要运行这个守护进程,进行时间同步。

# xntpd -c /etc/ntp.conf -p /var/run/xntpd.pid

  其中-c参数指定了ntp.conf作配置文件,用xntpd.pid记录xntpd的进程标识序号。ntpdate和xntpd都可以通过更改rc.conf中的选项,在启动时自动执行。

xntpd_enable="YES"      # Run xntpd Network Time Protocol (or NO).

xntpd_program="xntpd"   # path to xntpd, if you want a different one.

xntpd_flags="-c /etc/ntp.conf -p /var/run/xntpd.pid"  # Flags to xntpd (if enabled).

  如果要想让本地网络上的多台计算机都进行时间同步,那么每个计算机都与外部时间服务器连接的方法并不是一个好主意。更好的想法是使用一个计算机与外部时间服务器同步,那么它的时间就成为了标准时间,可以用作本地时间服务器,而其他计算机与这台本地时间服务器同步就可以了。xntpd就是设计为这个目的,它能够用作提供时间的ntp服务器。用作时间服务器的xntpd的配置文件应该为:

server                clepsydra.dec.com

driftfile        /etc/ntp.drift

broadcast        192.168.1.255

  其中增加了一项广播地址:192.168.1.255,定期向局域网上的其他计算机广播正确的时间。这个广播地址要根据自己的网络进行修改,或者使用对应于NTP协议的D类组播(multicast)网址224.0.1.1,但用户的网络必须支持组播能力。由于使用了广播或组播,这样网络内的其他计算机可以不配置ntp.conf,直接启动 xntpd,xntpd就能通过听服务器的广播信息来得到精确的时间。当然也可以不设定广播地址,而配置每个计算机中的ntp.conf文件,指定所有的计算机都访问这台时间服务器。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:23:22 | 显示全部楼层

FreeBSD连载(24):查看系统状态

进程管理

  在系统shell提示下,使用者可以输入各种命令来执行相应的工作。每个命令通常从终端键盘中获取输入,将输出打印到终端屏幕上,Unix使用标准输入stdio和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。这三个标准输入输出系统缺省与终端设备相联系在一起,但是也可以使用管道的概念将它们重新定向,从一个文件或另一个命令中获取输入,输出到另外的文件中或作为另一个命令的输入等。

$ ls > ls.out

$ cat < ls.out

$ ls -l | grep mbox

  FreeBSD可以同时运行多个进程,在shell下直接输入命令十,shell将进程放到前台执行。如果要将进程放到后台执行,需要在命令行的结尾加上一个 “&” 符号。下面的命令从后台执行,从ftp.isc. org下载文件。

$ wget  ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz  &

  当程序已经在前台执行的时候,可以使用^Z将这个程序挂起,暂停执行。然后可以使用bg命令将这个挂起的程序放到后台执行,或者使用fg将某个在后台或挂起的进程放到前台执行。

  当在后台运行了程序的时候,可以用jobs命令来查看后台作业的状态。在有多个后台程序时,要使用来参数的fg 命令将不同序号的后台作业切换到前台上运行。

$ jobs



[1]+  Running   wget ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz &

$ fg %1

wget ftp://ftp.isc.org/pub/inn/inn-1.7.2.tar.gz

  在启动了多个程序之后,可以使用ps命令来查看这些进程及其状态。

$ ps

  PID  TT  STAT      TIME COMMAND

  501  p2  Ss     0:00.24 -bash (bash)

  988  p2  R+     0:00.00 ps

  765  p3  Is+    0:00.28 -bash (bash)

  230  v0  Is+    0:00.14 -bash (bash)

  显示的结果包括进程的标识号PID,控制终端TT(p0表示控制终端为ttyp0),进程的状态STAT,进程使用的处理器时间TIME和具体的命令。

  可以给ps命令加上参数,来获得更多的输出内容,以下命令将输出系统中所有的进程:

$ ps waux

USER     PID %CPU %MEM   VSZ  RSS  TT  STAT STARTED      TIME COMMAND

wb       989  0.0  0.4   400  236  p2  R+    5:48PM   0:00.00 ps -aux

root       1  0.0  0.1   496   72  ??  Is   10:12PM   0:00.02 /sbin/init --

root       2  0.0  0.0     0    0  ??  DL   10:12PM   0:07.05  (pagedaemon)

root       3  0.0  0.0     0    0  ??  DL   10:12PM   0:00.20  (vmdaemon)

root       4  0.0  0.0     0    0  ??  DL   10:12PM   0:04.27  (syncer)

root      27  0.0  0.0   204    0  ??  IWs  -         0:00.00 (adjkerntz)

root      91  0.0  0.5   820  328  ??  Is    2:12PM   0:00.82 syslogd

daemon   100  0.0  0.0   792    0  ??  IWs  -         0:00.00 (portmap)

root     131  0.0  0.3   864  164  ??  Is    2:12PM   0:00.06 inetd

root     134  0.0  0.3   980  192  ??  Is    2:12PM   0:00.11 cron

root     138  0.0  0.6  1252  380  ??  Is    2:12PM   0:00.11 sendmail: accepti

wb       230  0.0  1.1  1540  668  v0  Is+   2:12PM   0:00.14 -bash (bash)

root     231  0.0  0.0   824    0  v1  IWs+ -         0:00.00 (getty)

root     232  0.0  0.0   824    0  v2  IWs+ -         0:00.00 (getty)

root     500  0.0  0.9   876  524  ??  Ss    4:19PM   0:01.78 telnetd

wb       501  0.0  1.4  1540  888  p2  Ss    4:19PM   0:00.24 -bash (bash)

root     698  0.0  1.5  1644  900  ??  Is    4:49PM   0:00.02 /usr/local/sbin/s

root     700  0.0  1.2  1308  748  ??  Ss    4:49PM   0:00.22 /usr/local/sbin/n

root     702  0.0  3.4  2900 2112  ??  S     4:49PM   0:00.32 /usr/local/sbin/s

root     764  0.0  0.9   880  540  ??  Is    5:10PM   0:00.22 telnetd

wb       765  0.0  1.7  1536 1052  p3  Is+   5:10PM   0:00.28 -bash (bash)

root       0  0.0  0.0     0    0  ??  DLs  10:12PM   0:00.02  (swapper)

  当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出进行输入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登录进程相脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令nohup来启动相应程序。

  从上面的ps的输出结果可以看出,有些程序没有控制终端,这些程序通常是一些后台进程。使用命令nohup当然可以启动这样的程序,但nohup启动的程序在进程执行完毕就退出,而常见的一些服务进程通常永久的运行在后台,不向屏幕输出结果。在Unix中这些永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始执行,系统关闭时才停止。如果偶然某个守护进程消失了,那么它提供的服务将不再能被使用。

  在守护进程中,最重要的一个是超级守护进程inetd,这个进程接管了大部分网络服务,但并不是对每个服务都自己进行处理,而是依据连接请求,启动不同的服务程序与客户机打交道。inetd支持网络服务种类在它的设置文件 /etc/inet.conf中定义。inet.conf文件中的每一行就对应一个端口地址,当inetd接受到连接这个端口的连接请求时,就启动相应的进程进行处理。使用inetd的好处是系统不必启动很多守护进程,从而节约了系统资源,然而使用inetd启动守护进程相应反应会迟缓一些,不适合用于被密集访问的服务进程。

  当用户希望要停止一个进程时,如果进程在前台运行并接收输入的条件下,可以输入^D,告诉进程输入结束,通常这意味着需要进程进行的处理要结束了,从而通知进程结束。对于有些不以文件输入结束作为结束标志的进程,那么就可以使用^C来向进程发送信号中断进程。

  如果上述方式均无效,或者进程运行在后台或者是一个守护进程,则需要手工向进程发送信号,这可以通过kill 命令来做到。使用 “kill PID” 来向进程发送终止信号SIGTERM,这个信号告诉进程需要退出。但是这些发送的信号都能被程序通过编程的手段捕获并对其进行处理,一旦程序在这个处理过程中没有退出,而是忽略这个信号的情况下,就无法杀死进程。这时只能使用 “kill -9 PID” 向PID代表的进程发送SIGKILL信号,这个信号不能被进程本身捕获,从而无条件杀死进程。但是最好先首先发送SIGTERM信号终止进程。而很多守护进程能够捕获 SIGHUP挂线信号,会根据这个信号进行处理,例如重新读入配置文件,重新刷新进程本身等,因此可以再更改进程的配置文件之后,使用 “kill -HUP pid” 刷新进程的配置。

  kill命令需要使用进程的标识号PID,因此需要首先运行ps以得到这个标识号。而FreeBSD下可以使用程序的名字来给进程发送信号,这个命令为killall,对于大部分情况,它使用起来更为方便。

    *
      查看系统状态

  FreeBSD下提供了相当丰富的工具可以用来查看系统的状态,使用者可以通过它们来了解系统状态,从而优化系统性能。这些工具通常读取/dev/mem、/dev/kmem来获得内存中的系统信息,使用/kernel将这些信息中的变量转换为名字。最基本的查看系统状态的命令为ps,用于报告当前系统中运行的进程的状态。

  pstat能显示系统中打开的文件数量、交换设备的使用率等系统信息。pstat缺省使用/dev/mem设备文件,从系统内存中读取这些数据,或者可以指定一个core文件,那么pstat从这个文件中读取数据。还需要给pstat 一个参数来告诉pstat应该显示那种系统信息,通常使用 “pstat -f” 显示出当前打开文件的列表, “pstat -s” 显示交换设备的当前状态, “pstat -t” 显示当前使用的终端设备文件的状态, “pstat -v” 显示激活的v节点的当前状态。 “pstat -T” 显示这几个系统表的状态,包括当前使用的和可以利用的系统表空间,因此可以用来检查系统在当前负载下是使用多大的系统表,帮助进行优化系统性能。

$ pstat -T

69/8232 files

4M/137M swap space

  vmstat报告内核的统计信息,包括进程、虚存、处理器、磁盘等。可以使用 “-w” 参数指定每隔几秒时间,报告一次系统状态。

$ vmstat



procs      memory     page                   disks        faults      cpu

r b w     avm   fre  flt  re  pi  po  fr  sr wd0 wd1 fd0   in   sy  cs us sy id

0 0 0    3752 30476  643   0   0   0  19  43   0   0   0  262 2599  85 56  3 41

  其他与vmstat类似的命令还有,fstat报告系统中打开文件的信息,可以使用文件名、进程号、用户名,以及指定文件所在的文件系统来限制要显示的文件。iostat报告内核的输入输出统计信息,包括磁盘、终端等设备的I/O 状态。netstat报告网络的有关统计信息。nfsstat显示NFS的统计信息。

  除此之外,systat以全屏幕方式显示各种系统统计信息,缺省情况下systat是报告处理器的使用率,包括总利用状态、空闲使用率和各个进程的使用率。通过指定参数,systat也能进行I/O的统计、虚存的统计、网络的统计等,这些参数包括-iostat, -vmstat, -mbufs, -netstat, -ip, -icmp, -tcp, -swap等。

        /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10

     Load Average   ||



        /0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100

              XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

root     XF86_S3.cx XXXXXXX

wb           kpanel XXX

wb              kfm XX

wb          kbgndwm XX

wb       kblankscrn

wb          krootwm

wb              kwm

  除了这些系统提供的命令之外,FreeBSD也提供多种有效的系统工具,如综合ps、systat和vmst at功能的top等。这些软件通常可以在多种Unix系统中使用,也是十分常用的工具。也可以在FreeBSD系统中安装网络管理代理snmpd,然后使用网络管理系统通过网络来获得FreeBSD主机的各种系统信息。

未完,待续。。。
 楼主| 发表于 2003-2-11 12:24:48 | 显示全部楼层

FreeBSD连载(25):定时执行程序

定时执行程序

  Unix系统提供了cron和at命令,使系统和用户可以定时运行一定的程序,而不需手工启动。

  使用cron用于周期性的执行一个命令,为了使用它,必须编辑crontab文件。系统缺省的/etc/crontab 文件为:

# /etc/crontab - root's crontab for FreeBSD

#

# $Id: crontab,v 1.13 1996/01/06 22:21:37 ache Exp $

# From: Id: crontab,v 1.6 1993/05/31 02:03:57 cgd Exp

#

SHELL=/bin/sh

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

HOME=/var/log

#

#minute        hour        mday        month        wday        who        command

#

*/5     *       *       *       *       root        /usr/libexec/atrun

#

# rotate log files every hour, if necessary

0        *        *        *        *        root        /usr/sbin/newsyslog

#

# do daily/weekly/monthly maintenance

0       2       *       *       *       root    /etc/daily 2>&1 | sendmail root

30      3       *       *       6       root    /etc/weekly 2>&1 | sendmail root

30      5       1       *       *       root    /etc/monthly 2>&1 | sendmail root

#

# time zone change adjustment for wall cmos clock,

# does nothing, if you have UTC cmos clock.

# See adjkerntz(8) for details.

1,31        0-4        *        *        *        root        /sbin/adjkerntz        -a

  在这个crontab文件中首先设置了几个环境变量,cron执行这个文件时先设置这些环境变量,然后按照每列规定的时间来执行相应的命令。第一列为分钟,规定每小时的第几分执行相应的程序,第二列为每天第几小时执行程序,,第三列为每月的第几天,第四列为第几周,第五列为每周的第几天,第六列为执行该文件的用户身份,第七列为要执行的命令。

  普通用户也可以使用crontab命令来创建和维护自己的crontab文件。由于是用户不能更改执行程序的标识的,因此用户的crontab就不需第六列──执行程序的用户身份,而只要直接跟随要执行的命令。使用 “crontab -e” 命令,使用编辑器按照相应的格式编辑自己的crontab文件,或者使用 “crontab -l ” 列出现有crontab文件的内容,当然只有root用户才能查看其他用户的crontab文件:

$ crontab -l

12 0 * * * /home/wb/bin/getfiles

  所有用户的crontab设置文件都放在/var/cron/tabs目录下,文件名与每个用户的用户名相同。cron中的命令执行结果将被系统使用mail寄给每个用户。在/var/cron目录下还有crontab执行的记录文件,系统管理员可以按照这个文件来检查系统安全性,检查是否有影响系统安全的程序被执行。

  与cron不同,at命令用于在一定的时间后或在一定的时刻执行设置好的命令。at命令使用一个时间参数表示何时执行命令,然后就从标准输入中读入要执行的命令,此时就如同在shell下操作一样输入要执行的命令,最后使用^D 退出输入命令的模式。用户不必担心真正执行命令时是否能够找到正确的程序,at会将当前shell的设置,包括环境变量,保留起来,以便在执行命令时创造一个与启动at时完全相同的执行环境。

$ at 1:00am +2days

wget ftp://ftp.cdrom.com/pub/FreeBSD/packages/All/netscape.tgz

^D

  上面命令将在两天后的凌晨1:00时启动进程下载文件,当然at命令并不是十分精确,其执行时间只是表示大概时间,可能与标准时间存在一两分钟的差异。at也支持各种复杂的时间表示方法,可以使用hhmm,hh:mm,或者加上am或pm结尾的12小时制方式。还可以使用年月日,规定程序运行的日期:

$ at 1:00am Mar 5

echo Hello | mail root

^D

Job 5 will be executed using /bin/sh

$ atq

Date                    Owner   Queue   Job#

01时00分00秒 00/03/05   root    c       5

$ atrm 5

  用户的at程序执行结果也被系统邮寄给该用户,用户可以使用mail来查看程序的输出结果或执行错误。当用户启动at命令之后,可以使用atq命令来查看自己还没有执行的at命令,如果atq是由root执行,则将列出系统中所有没有执行的at命令。然后可以使用atrm命令根据atq输出Job号来删除at作业。

  系统使用/var/at/at.allow和/var/at/at.deny文件来配置可以使用at命令的用户,和不可以使用at命令的用户。其中at.allow的优先权更高,如果存在at.allow,就只允许这个文件中列出的用户使用at,而不考虑任何不在这个文件中列出的用户。因此可以使用一个空at.allow文件禁止所有用户使用at。当不存在at.allow文件的时候,那么凡不在at.deny文件中列出的用户都可以使用at。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:25:52 | 显示全部楼层

FreeBSD连载(26):进程的权限

进程的权限

  由于FreeBSD是多用户系统,因此进程必须要受到权限的控制和保护。出于安全性的考虑,一个用户不可能杀死其他用户启动的进程,一个进程也不能非法存取其他用户的文件数据。只有超级用户和超级用户启动的进程才有最大的权限,普通进程就只与进程的执行者相关,只具有这个用户的权限。

  一些情况下(特别是执行系统维护任务时),要求普通用户也能完成特殊权限的任务,那么就必须在进程执行过程中改变进程的身份。改变进程的身份则必须同时具备两个要求:程序文件本身具有SetUID或SetGID属性,同时程序中需要相应调用setuid()或setgid()系统调用,这两个系统调用能够检查文件的属性,并完成更改进程权限的操作。

  通常只有系统程序才需要利用这两个属性,例如系统程序su允许普通用户成为root用户,就使用的是这个能力。

$ ls -l a*

-rwxr-xr-x   1 user  wheel  3212 Dec  4 12:36 a1

-rwxr-xr-x   1 user  wheel  3212 Dec  4 12:36 a2

$ chmod u+s a1

$ ls -l a*

-rwsr-xr-x   1 user  wheel  3212 Dec  4 12:36 a1

-rwxr-xr-x   1 user  wheel  3212 Dec  4 12:36 a2

$ chmod g+s a2

$ ls -l a*

-rwsr-xr-x   1 user  wheel  3212 Dec  4 12:36 a1

-rwxr-sr-x   1 user  wheel  3212 Dec  4 12:36 a2

  上面第一个chmod(chmod u+s a.out)为a.out增加设置属主身份权限,然后列表中对应属主的执行权限位的 “x” 标志将改变为 “s” (文件属性显示为rwsr-xr-x)。第二个c hmod (chmod g+s a.out)为a.out增加设置组身份权限,则列表中对应组的执行权限位的 “x ” 标志将改变为 “s” (文件属性显示为rwxr-sr-x)。同样,SetUID和SetGID 属性也都有相应的八进制表示方式,SetUID为04000,后面的三个八进制位属于文件的读写访问属性设置,相应S etGID为02000,它们两个属性位处于读写属性位之前。下面是一个更改属性设置的例子:

# ls -l /bin/ps

-r-xr-sr-x  1 bin  kmem 163840 May  6 06:02 /bin/ps

# chmod a=r /bin/ps

# su user

$ ps

bash: ps: Permission denied

$ ^D

# chmod a+x /bin/ps

# su user

$ ps

ps: /dev/mem: Permission denied

$ ^D

# chmod g+s /bin/ps

# su user

$ ps

  PID  TT  STAT      TIME COMMAND

  226  p2  S      0:00.56 bash

  239  p2  R+     0:00.02 ps

$

  第一次以user身份执行ps时,ps的文件属性被改为对所有用户只有读权限,因此不能执行,shell报告 Permission denied;第二次以user身份执行ps时,ps报告不能打开/dev/mem文件,这是因为普通用户无权存取内存映象文件。而第三次执行ps时,由于设置了setgid位,和kmem同组的进程就能够打开 /dev/mem文件,从而正确执行了ps程序。

  具有SetUID或SetGID属性的程序,能够在进程执行中调用系统调用setuid()或setgid() ,调用成功后这个进程就具有了程序文件属主和组的权限,就可以完成以前改变身份之前不能完成的任务。因为通过它们程序可以改变进程的用户标识,绕过系统的权限设置,因此这两个属性对于系统安全非常重要。尤其是属于root的文件,并设置了SetUID属性的程序,更是系统安全中值得注意的地方。为了保证系统安全,必须保证没有非法的SetUID或 SetGID程序的存在,通常管理员可以使用find命令来完成这个任务,例如查找具有SetUID的程序,则执行:

# find / -perm 4000 -print

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:27:02 | 显示全部楼层

FreeBSD连载(27):应用软件的类别

安装应用软件

  FreeBSD下拥有多种预编译好的软件包,包括了从数学运算到系统维护,从图象处理到Internet服务程序等大量的软件。之所以能拥有如此丰富的软件,除了Unix本身就是一个非常流行的开发平台之外,另一个重要原因就是每种Unix中均提供了高级语言C作为了标准开发语言,而C语言具有高度可移植性,并且随着Unix的流行它成为了最重要的一种程序设计语言。

  由于Unix运行在多种不同的平台上,而不同平台上的二进制执行文件只包含本平台上的机器指令,因此造成一个平台上的应用程序不能直接在另一个平台上运行。但是在Unix的世界中,有着通用的编程语言C和相同的系统调用,使得不同的Unix平台上程序的C代码基本相同,为一种Unix开发的应用程序,很容易就能移植到其他Unix系统中。传统上在Unix上安装各种应用软件一般使用源代码的形式,需要管理员手工编译安装,这就要求管理员需要熟悉C语言及其开发工具。然而这样操作毕竟是一个繁琐的任务,尤其对于不太熟悉C语言的使用者更为困难。因此各种Unix各自发展了一些直接安装二进制程序的机制,FreeBSD中也提供了Packages Collection── 一种管理和安装预编译好的软件包机制,来帮助使用者管理各种应用软件,使得用户不需要了解C语言及其开发工具,也能正常进行应用软件的安装和管理。

    * 应用软件的类别

  在安装和使用应用软件的时候,正版和盗版等版权问题总是计算机使用者需要考虑的话题之一。很多计算机使用者总以为软件的版权问题与光盘、磁带类似,不是正版就是盗版。然而情形并非绝对如此,绝大多数软件的开发者倾向于让自己开发的程序被尽可能多的人使用,当软件开发者不以软件作为获利的目的时,对软件的使用就没有采取任何限制,或者是很宽容的限制。其他使用者就可以自由使用这些软件,而不需要考虑版权问题。

  正由于软件开发者的目的不同,因此对他们的软件使用的版权保护方法也不同。有的开发者出于自己的个人兴趣、需要或信仰而开发软件,希望自己的软件为更多的人使用,没有或暂时没有从软件中获利的目的,因此就鼓励其他人使用这个软件。有的开发者出于盈利的目的开发软件,因此就使用了严格的版权限制。按照不同软件的版权限制,可将应用软件可以分为两类:

    * 公共域软件与自由软件

  这些软件的作者对版权不加任何限制或者限制很少,属于这一类的软件通常提供源程序,允许使用者自由使用软件并任意修改。FreeBSD系统中包括的软件均属于这一类,因此使用者不需要考虑使用FreeBSD的版权问题。其中公共域软件对版权没有任何限制,可以认为是属于放弃版权的软件。很多公共域软件是科研机构和大学开发的,但也被商业公司用于自己的系统中,此时商业公司就使用了自己的版权声明,而用户却无法自由使用该软件。

  为了保护软件不被商业机构滥用,自由软件基金会的Stallman使用了GNU版权许可来保护用户自由使用软件的权利,这个版权许可允许将自由软件用于商业目的,但必须允许用户有自由使用、拷贝、修改的权利。根据这个许可,可以销售GNU软件,但必须同时包括它的源程序以便用户根据情况修改(或者在用户要求时提供)。

  GNU软件许可并不是唯一的自由软件许可权声明,FreeBSD使用的BSD许可也是另一个重要的版权许可。与GNU许可相比,BSD许可更宽松一些。BSD许可只要求必须保持显示的相关作者的声明信息,对商业使用限制更少。此外还有X的版权许可等。由于GNU软件许可最为著名,并且也比较完善,因此很多非自由软件基金会的软件也使用这个许可权,用来保护自己软件的版权。

  事实上这一类软件在计算机发展中起了很重要的作用,它们常常最先实现很多新想法、新功能,推动软件技术的发展。自由软件的功能、效率和可靠性并不比商业软件差,有的软件甚至要好于同类的商业软件,唯一的问题是自由软件不提供技术服务,仅仅随同软件提供一些电子文档,需要使用者自己去学习安装和使用。当然,自由软件通常也有相应的商业版本,差别就在于提供了商业技术服务支持。

    * 共享软件与专有软件

  这些软件通常是基于商业目的开发的软件,这些软件通常使用严格的版权规定。这些软件中的大部分不允许使用者免费使用。但出于商业目的,一些软件允许使用者免费使用,但对软件的自由使用提出了一定的条件和限制。

  一些共享软件不提供源代码,一些商业软件的演示版本提供了较弱的功能和使用时间限制。还有一些软件的限制更宽松,允许个人用户自由使用软件,但不许可自由分发、拷贝软件。

  一些FreeBSD安装介质中,在基本系统之外也提供了一些共享软件,供使用者手工安装(不能使用安装程序安装)。这些软件允许使用者在一定条件下,并按照软件本身的声明使用这些软件。由于版权问题,系统不会将这些软件包括进系统内部,使用者只有在保证软件版权条件下才能运行这些软件。

    * 开放源码观念

  由于在Unix世界中,软件的标准为C语言,有了C源代码就能将应用程序移植到其他Unix上,因此在Uni x传统上,就有一种提供软件的同时也应该提供源码的观念。

  发布软件的源代码对用户有很多好处,一方面用户能够了解他们使用的软件是可以信赖的,即使存在问题,也能够及时发现错误,并依据源码及时纠正,这些修正返回到开发者那里,同样起到促进软件发展的目的。另一方面毕竟通用软件并不一定完全适合用户的需要,发布软件的源码使得用户能够按照自己的需求定制软件。

  因此在Internet上很多软件的作者都认同这种观念,这种观念还得到了包括Netscape等商业公司的支持,进而组织了开放源码组织(Open Source)来支持这种观念。FreeBSD的众多开发者就是这个组织的坚定支持者。其网址为http://www.opensource.org

  当前开放源码得到了一些商业公司的支持,如netscape公司就公开了它们的浏览器的源代码。出于技术的发展,软件本身已经不再包括太多的技术秘密了,在Internet上可以找到各类程序的源代码,依靠未公开接口保持软件秘密的做法基本被大家抛弃。当程序设计从 “艺术” 转变为 “工程” ,重要的就不再是程序设计的秘密,而是软件工程了。商业公司也可以从开放源代码的情况下,获得使用者更多的建议,使得它的软件能进一步完善。

未完,待续。。。  
 楼主| 发表于 2003-2-11 12:28:56 | 显示全部楼层

FreeBSD连载(28):Packages Collection

Packages Collection

  FreeBSD中提供了上G字节大小的预编译并打好包的二进制应用软件包,这些软件包能够立即安装使用。在软件包中不但记录了二进制软件的内容,还包括这些软件的安装位置、软件包的描述信息,以及软件包之间的依赖关系,这种管理软件的机制称为Packages Collection。通常安装介质提供的这些Packages位于安装介质中的 packages目录下,使用安装程序sysinstall就能够很容易的安装和卸载这些安装好的软件包。(由于空间的限制,安装光盘上并不能包括所有的软件包,可以从Internet上下载,在Walnet Creek发布的FreeBSD 光盘中的第三张也包括了大量预编译好的软件包)。

  在FreeBSD下,每个预编译的软件包是使用tar和gzip进行打包压缩后的文件,其文件名中的前面为这个Package的名字(包括版本号),并使用tgz后缀,例如navigator浏览器的Package文件为netscape-navigator-4.07.tgz。。

  使用root权限执行sysinstall,然后选择Configure菜单项中的Packages选项,系统将按不同的应用软件的类别,显示出相应的菜单选项,每个选项对应一类应用软件,其中All项中包括所有可用的应用软件。

  这些软件也被放置到安装介质中的packages目录下对应的不同存储子目录中,子目录和菜单选项是一一对应的。

# ls -l /cdrom/packages

All          converters   kde     print      x11

INDEX        databases    lang    security   x11-fonts

Latest       deskutils    mail    shells     x11-toolkits

archivers    devel        math    sysutils   x11-wm

audio        editors      misc    tcl81

benchmarks   emulators    net     textproc

chinese      gnome        news    tk81

comms        graphics     perl5   www

  如果进入了一个种类的子菜单,那么就可以看到,已经安装的软件有一个 “X” 标记,可使用空格键反选择这个已安装的软件,系统将立即卸载这个软件。或者选择一个未安装软件,然而此时并没有立即进行这个软件的安装,而是要等到全部选择了所有想要安装的软件包之后,再回到上级菜单,选择 “Install” 按钮才开始进行安装。

    * Packages的相互依赖关系

  各个软件包之间并不是孤立的,而是在相互之间存在一定的依赖关系。例如,所有的X Window应用软件都在 X Window下运行,那么如果没有安装X Window服务器软件,也不能正确安装这些应用软件。此外,Pack ages中也并不全是应用软件,它也包括各种函数库及其他种类的支持文件,那么有的应用软件包就依赖于这些库文件和支持文件。

  由于存在各种相互依赖关系,必然对软件包的安装和卸载发生影响。当安装一个软件包时,FreeBSD将会首先安装这个软件包依赖的其他软件包,然后才能安装这个软件包本身。如果没有安装它所依赖的软件包,则就不能正常安装这个软件包本身。同时,当删除一个软件包时,必须预先删除依赖这个软件包的所有其他软件包,否则就不能正常完成删除任务。 FreeBSD对这个依赖关系限制比较严格,即使是同一个软件,但版本不同,依赖于这个软件另一个版本的其他软件包也不能正确安装,必须保证版本的一致性。

  使用Packages Collection来安装和管理应用软件,可以维持软件安装文件结构的一致性,因为 Packages Collection安装的软件其文件目录结构符合FreeBSD的习惯,清晰明了。此外软件包之间的依赖关系对于同时维护多种软件也很有效,因此最好不要绕过Packages Collection手工安装软件。当需要重新定制软件的时候,可以通过Ports Collection来完成,它在编译好软件之后,可以使用软件包的方式安装和维护软件。

  每个软件包的安装信息被放置在/var/db/pkg目录下维护,这个目录下的每个子目录都对应于一个安装过的软件包,如果某个子目录被破坏,那么相应的软件包的信息就不复存在了。

    * 管理Packages

  虽然使用sysinstall来管理软件比较直观,但是这需要一个标准的安装介质,适合大量安装软件包时使用。而在不使用安装介质的时候,仅仅需要添加某个独立的软件包或进行维护时,sysinstall就不适合了。FreeBSD 提供了十分简单的几个管理命令来完成这个任务。

  pkg_add 安装一个Package,其参数为要安装Package的文件名或获得这个文件的URL 。当使用URL来指定Package的位置时,pkg_add首先使用fetch程序下载该软件包,然后进行安装。通常可以使用 “-v” 参数,使pkg_add显示出进行的操作过程。

  pkg_delete 删除一个软件包,其参数为软件包的名字,由于此时软件包已经被安装到系统中了,因此名字中不必使用tgz后缀。同样也可以使用 “-v” 参数。

  pkg_info 获取一个软件包的安装信息和简短描述,参数为软件包名字时,将参看当前已安装的软件包中是否存在它,当使用的参数为带tgz后缀的文件名时,将查看当前目录中是否存在这个软件包文件。或者可以使用 -a参数列出当前安装的所有软件包的信息:

# pkg_add netscape-communicator-4.5.tgz

# pkg_delete netscape-communicator-4.5

  但在实际应用的过程中,值得注意的问题常常发生在升级软件包时。由于同一软件的不同版本通常使用同样的文件名,因此在安装一个版本时将覆盖掉另一个版本的文件,但是同时新版本的Packages并不会自动删除老版本Packages 的安装信息。因此如果再一次卸载旧版本时就会将新版本中具有同样文件名的文件删除掉。解决问题的方法是先卸载老版本,再安装版本的Packages。一旦出现问题,可以再次将新版本Packages重新安装一次即可。

未完,待续。。。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表