LinuxSir.cn,穿越时空的Linuxsir!

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

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

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

FreeBSD连载(09):系统启动过程

第3章 系统管理和维护

  当使用安装程序Sysinstall完成了系统安装和基本配置任务之后,系统需要重新启动。在系统从硬盘上重新启动之后,一个完好的FreeBSD系统就展现在使用者面前了。系统将出现登录提示,允许使用者登录进入FreeB SD操作系统。

  Unix是一种多用户、多任务的操作系统,它支持并能管理多个用户使用系统,其用户分为普通用户和管理员两类。普通用户只能使用系统提供的具体应用功能,而只有管理员才能更改系统的配置、维护整个系统。FreeBSD系统的拥有者不但是仅仅使用系统的普通用户,同样也是整个系统的管理员,要负责系统维护的任务。

  Unix下系统维护的任务具有相当大的伸缩性,按照不同的系统的要求,可以非常简单,仅仅使用系统初始提供的管理策略即可,也能是一种相当复杂的任务,对访问的客户进行更严格、更全面的限制。无论如何,FreeBSD的使用和维护都是一件富有挑战性的任务。

    *
      系统的启动与关闭

  不象个人计算机上的其他几种操作系统,FreeBSD被设计为一种可以永久运行的系统,正常情况下不需要也不应该频繁的启动和关闭。然而,FreeBSD的启动过程从计算机系统自检到载入FreeBSD系统内核,其中经过了几个不同的阶段,这些阶段的操作都涉及到系统维护,因此相当重要,需要系统管理员加以了解。同样,由于FreeBSD是一个多用户系统,在后台运行着相当多对系统而言非常重要的进程,系统关闭时就需要首先关闭这些进程,因而FreeBS D的关闭过程也必须按照一定的要求来操作,否则就会对系统造成破坏。

    * 系统启动过程

        普通个人计算机的启动过程相当简单,首先是系统BIOS自检,自检之后将载入启动硬盘上的主引导区,由主引导区上的引导程序再载入具体操作系统。标准的主引导区将按照启动分区的设置,引导该分区上的操作系统,FreeBSD也可以使用这种方式。但更常见的引导FreeBSD的方式,是使用FreeBSD Boot Manager,来管理和负责引导包括FreeBSD在内的多个操作系统。

          o 多操作系统引导程序

        按照计算机启动硬盘第一个扇区的系统主引导程序的不同,计算机有不同的启动过程。FreeBSD最常使用 FreeBSD Boot Manager,它可以让使用者在系统中共存的不同操作系统进行选择。

        如果使用了Boot Manager用于多操作系统的引导,则系统自检后首先进入Boot Manager的引导界面。

        F1: FreeBSD

        F2: Dos

        F5: Disk 2

        Default F1

        Boot Manager使用计算机的功能键来启动各个分区的操作系统,使用F1将启动第一个分区wd0s1 上的操作系统,F2启动wd0s2,F3对应wd0s3,等等,F5启动另一个硬盘上主引导区的引导程序。这样可以在第二个磁盘上也安装Boot Manager,由它来引导自己硬盘上各分区的操作系统。只有在分区的确存在的情况下, Boot Manager才显示相应的启动热键,并从分区的类型判断它是那种操作系统。在使用者选择了某个选项,或者经过了一定的延迟时间之后,Boot Manager就启动FreeBSD系统。

        使用Boot Manager作多操作系统引导需要注意的是:一旦在这台计算机中重新安装Dos/Windo ws系统,则主引导区就被重写,需要重新安装BootManager。

        当不想使用Boot Manager引导系统,而打算回到标准引导区的方式(不再需要引导多操作系统)时,可以使用DOS程序fdisk.exe来恢复主引导区的内容。也可以使用FreeBSD的sysinstall程序来重新安装标准主引导区。

        A:> fdisk /mbr

        但是,Boot Manager仍然使用BIOS调用来获得分区上的数据,由于BIOS只能访问硬盘1024 柱面内的分区,因此FreeBSD的引导分区必须在1024柱面以内才能正常启动系统。新的BIOS中使用LBA等方式对硬盘数据进行了重新映射,来避免这个问题。然而就需注意不能随意更改BIOS中的硬盘映射方式不可随便更改,必须与硬盘进行分区时的设置一致,否则BIOS就不能正确找到以前设置的分区。

          o boot loader

        无论是标准引导程序,还是FreeBSD Boot Manager,都将载入FreeBSD基本分区的第一个扇区,这里放置着FreeBSD的启动程序Boot Block,它将载入FreeBSD文件系统中的boot l oader程序,不需进行任何操作,boot loader程序将引导系统内核来启动系统。但在这个过程中也可以中断自动启动进程,进入交互模式,从而更改启动内核、进行硬件设置、甚至提供了选择不同的boot loader程序的机会。

        FreeBSD 3.1-release中更新了系统的boot loader程序,这个新boot loa der程序与FreeBSD 2.2.x和3.0版本使用的boot loader不同,升级的原因之一是老版本的b oot loader不能启动ELF格式的内核,此外新版本的boot loader功能更强大。因此老版本的boo t loader的行为与下面描述的不同。

        通常没有必要改变Boot Loader,如果要更改使用的Boot Loader程序,就要在启动屏幕最先印出一个简单的斜线 “/” 时,在几秒时间内按下空格键,否则启动过程将略过这个步骤,直接进入下一步。如果按下空格,则系统将出现boot提示符。

        /

        >>FreeBSD/i386 BOOT

        Default: 0:wd(0,a)/boot/loader

        boot:

        此时输入 “?” ,可以列出对应的硬盘分区中根目录下的所有文件。这时可以在boot提示符下输入另一个b oot loader程序,启动该boot loader程序,也可以直接输入某个内核文件名,从而略过boot l oader而直接启动相应的内核。然而,通过boot loader能完成更多的任务,包括进行硬件资源设置。

        此时也可以列出、选择不同的硬盘分区上的不同启动文件,正如之前的提示信息,0:wd(0,a)用于一个包含 FreeBSD根文件系统的子分区,其中第一个0为硬盘控制器的序号,而wd(0,a)为硬盘分区wd0a,根据硬盘分区情况,这对应第一个UFS分区上的根文件系统。而后面可以跟随目录和文件名,以及可以使用?来列出目录下的文件,当然选择启动内核的任务可以在boot loader内部中更好的完成,一般情况下不需要进入这个阶段改变boot loader程序。

        此后系统将进入Boot Loader程序中,由Boot Loader将内核/kernel和内核模块载入内存,接着Boot Loader就等待10秒间隔,在这个时间内可以让用户按下了除回车之外的其他任意键,进入Bo ot Loader的交互模式。

        /

        BTX loader 1.00 BTX version is 1.01

        Console: internal video/keyboard

        BIOS drive A: is disk0

        BIOS drive C: is disk1

        BIOS drive D: is disk2

         

        FreeBSD/i386 bootstrap loader, Revision 0.5 638/64512kB

        (wb@email.online.ha.cn, Web Mar 3 02:54:38 CST 1999)

        /kernel text=0x1697f2 data=0x168d0+0x1f17c syms=[0x4+0x1eb70+0x4+0x2014a]

        /modules/splash_bmp.ko text=0x1025 data=0xc+0x634 syms=[0x4+0x400+0x4+0x213]

         

        Hit [Enter] to boot immediately, or any other key for command prompt.

        Booting [kernel] in 8 seconds...

         

        Type ‘?’ for a list of commands, ‘help’ for more detiled help.

        disk1s3a:>

        新的Boot Loader使用BIOS的硬盘表示顺序,没有区分SCSI硬盘da和IDE硬盘wd,而直接使用disk0、disk1、disk2按BIOS中的顺序表示硬盘。本例中的提示符为disk1s3a,由于本例中使用的硬盘为IDE接口,因此这实际就代表wd1s3a分区。

        在boot loader提示符下有很多相当有用的命令,例如使用ls命令可以列出disk1s3a中各级目录下的文件,使用lsdev可以列出当前内核中的设备驱动,使用lsmod可以列出已经载入的内核模块,使用load 可以载入另外的需要载入的内核模块,使用autoboot可以在给定时间之后启动系统,而使用boot命令可以立即启动系统内核,或者使用pnpscan命令扫描当前系统中的PNP卡。一般boot命令比较常用,例如使用 “boot -s” 命令,将启动系统并进入单用户模式,在这个模式下可以执行系统维护任务。通常由于只有可以信任的管理人员才能访问控制台,因此缺省状况下进入单用户模式不需要使用口令认证。

        在boot命令之后使用其他内核名字作参数,用来使用缺省内核/kernel之外的其他内核来启动系统。每个 FreeBSD系统都至少具备一个备用的通用内核kernel.GENERIC,在当前系统内核被破坏的情况下可以使用它来启动系统。因此在引导程序被破坏而系统完好的情况下(通常是由于重新安装了Windows的原因),可以使用安装软盘或光盘启动,进入Boot Loader的交互模式,选择硬盘上的内核启动,然后进行修复而不需要重新安装。当在boot loader提示符下使用 “boot -c” 命令,在其后的启动过程中将进入UserConfig中,用于对内核中的硬件资源参数进行配置。与系统初始安装时进入UserConfig的方式不同,这将直接进入User Config的命令行模式,内核将出现UserConfig的提示符:

        config>

        此时可以使用help命令查询可以使用的UserConfig命令,如果输入visual指令,表示使用vi sual方式配置系统硬件,则会进入UserConfig的全屏幕界面,否则就使用这个命令行方式进行硬件参数配置。命令行模式中可以使用ls命令列出不同的设备驱动程序,使用irq、drq、iomem等命令查看硬件的相应资源设置。

        命令行模式比全屏幕界面更强大的地方是能够对ISA PNP设备进行控制,这是通过pnp命令进行的。当IS A PNP卡由BIOS分配资源的时候,内核能以非PNP的驱动去探测它,这也是为何要在BIOS中关闭相关的PNP 选项的原因。但如果在编译内核支持了PNP控制器,也可以在BIOS中设置为由OS(即FreeBSD)来管理硬件资源,这就需要使用pnp命令手工为ISA PNP硬件分配资源,以便非PNP的驱动能检测并正确设置资源。但是手工设置要求对PNP卡硬件相当了解,否则还是让BIOS来完成资源的分配更为适合。

        当退出UserConfig之后,或者在boot loader的交互模式下执行了boot命令,或者在bo ot loader提示进入交互模式的时候10秒钟内没有任何输入,则boot loader就会载入内核,并自动将控制权交给已经载入的FreeBSD内核程序,由内核探测计算机中的各个硬件,并将探测结果打印到屏幕上。使用键盘右上角的Pause键可以暂停屏幕输出,并可以使用Page Up,Page Down键上下滚动屏幕上的信息进行查看,最后再使用一次Pause键将打开屏幕输出,继续系统启动过程。内核的启动信息也可以在登录系统之后使用dmesg 命令查看。

        FreeBSD 3.0以前的FreeBSD版本使用的Boot Loader为一个较老的版本,因此提示信息与命令输入方式也略有不同,但基本实现同样的功能,旧Boot Loader程序的提示符直接就为 “boot:” ,可以直接输入 “-s” 、 “-c” 等参数进入单用户模式或进入UserConfig。启动时boot loa der都会在屏幕上打印提示信息,解释了基本用法和具体参数对应的含义。

        FreeBSD 3.1之后可以设定系统启动标志图象(如同Windows9x的启动标志),那么内核的探测信息就不会显示在屏幕上,而是被这个启动图象遮住。

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

FreeBSD连载(10):系统启动脚本

系统启动脚本

  内核探测过系统硬件之后,就启动进程0和进程1,进程0用于清除内存,将所有的内存单元置零,进程1为init 进程,将负责启动系统和各种守护进程。init将系统带入多用户状态,并按照/etc/rc启动脚本启动服务程序。

  /etc/rc启动脚本将完成很多非常重要的工作,包括设置磁盘交换、检查磁盘错误、设置网络界面,启动网络服务程序等非常重要的工作。/etc/rc文件将也将执行另外的rc文件,如执行rc.conf用于大部分系统参数的设置,rc.network用于网络设置,rc.firewall用于设置防火墙,以及rc.local,用于管理员对本机特定的启动设置等。其中rc.conf文件中包含了用户能够更改的很多设置参数,这些设置参数在其他rc文件中使用,用于配置系统的参数,因此对系统管理来讲最为重要。

  由于大部分服务器程序都是网络程序,因此如果系统的网络设置不正确,这些服务程序将不能正常执行(例如 sendmail)。而且有些程序的超时设置的很长,因此出现错误时会出现系统停留在某个程序上不再继续执行。一般可以不必理会,等待程序超时退出即可,或者可以尝试使用Ctrl-C中断该程序。如果启动脚本真的出现无法继续执行的错误,如果能够通过网络登录,可以先登录进系统再更改启动脚本,而大部分正在执行启动脚本的情况下,网络服务并没有启动,那么就必须重新启动系统进入单用户状态,再修改启动脚本来纠正错误。

  #! /bin/sh

  swapfile="NO" # Set to name of swapfile if aux swapfile desired.

  apm_enable="NO" # Set to YES if you want APMenabled.

  pccard_enable="NO" # Set to YES if you want to configure PCCARD devices.

  pccard_mem="DEFAULT" # If pccard_enable=YES, this is card memory address.

  pccard_ifconfig="NO" # Specialized pccard ethernet configuration (or NO).

  local_startup="/usr/local/etc/rc.d /usr/X11R6/etc/rc.d" # startup script dirs.

  上面是/etc/rc.conf的部分内容,可以看出参数的设置形式,相应的设置值都给出了提示,使得更改这些参数设置非常容易。rc.onf中的大部分设置可以通过/stand/sysinstall系统安装程序来进行设置,但也有部分参数不能通过sysinstall进行设置,必须通过手工修改这个文件来完成。按照FreeBSD的习惯,这些rc文件,rc.conf用于参数配置,可以由sysinstall安装程序和管理员更改,rc.local中定义这台计算机特定的启动命令,可以由管理员重新设置,而其他rc文件应该保留不变。这只是一种习惯做法,而非硬性规定,然而遵从习惯的好处是系统设置比较清晰,便于系统维护和管理,并且当管理员进入一个新系统中,能立即找到需要的配置文件。

  在版本3.1-release之前,/etc/rc.conf中包括了所有参数设定,这样在系统长期运行之后,就无法区分哪个参数为缺省值,哪个参数为管理员更改过的值。在3.1-release中,rc.conf划分为两个文件,/etc/default/rc.conf和/etc/rc.conf,其中/etc/default/rc. conf是设置各个参数的系统缺省值,而/etc/rc.conf仅仅设置本地系统在安装和运行过程中更改的参数,例如hostname等,因此3.1-release之后的/etc/rc.conf文件中的内容较少。事实上 /etc/default/rc.conf中不但设置了读取/etc/rc.conf文件中的设置,还包括读取 /etc/rc.conf.local文件的设置,以适应更复杂的计算机设置情况。对于一般的情况,用不到那么复杂的设置文件,仅仅注意/etc/rc.conf中的设置就满足设置要求了。

  BSD Unix传统上只使用rc.local来维护本机特定的启动命令,这样如果系统在启动时需要配置的内容过多,这个文件就会变得相当庞大,不利于系统维护。Unix System V风格的系统使用启动目录而非文件来维护启动命令,每个启动一个特定功能的设置被放入一个单独脚本中,然后将所有的脚本都放入启动目录中,系统启动时逐项检查这个目录中的执行脚本,自动执行这些命令。

  System V和BSD的启动管理有很大不同,System V引入了启动级别的概念,可以有6种不同的启动级别,而BSD只简单的分为多用户状态、单用户状态和停机状态3种。在启动的管理方面,System V比BSD更友好一些。

  因此FreeBSD吸取System V中的启动目录的思想,在rc.conf中定义了本计算机的系统启动文件存放的目录local_startup参数,缺省使用/usr/local/etc/rc.d目录存放服务器程序的启动脚本,使用/usr/X11R6/etc/rc.d目录存放本地X Window相关的程序启动脚本。这些目录中的以sh结尾并具备执行属性的shell脚本程序将在启动时被自动执行。这两个目录中的脚本程序也是由系统管理员设置和修改的,必须以 “.sh” 结尾,其他后缀的文件将被忽略。习惯上这两个目录里的脚本程序负责启动服务器程序,而 rc.local主要用于调整系统的一些非标准参数设置(rc.conf中没有涉及的设置)。

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

FreeBSD连载(11):系统登录与退出

系统登录与退出

  系统执行完rc启动脚本之后,FreeBSD将读取/etc/ttys文件,按照配置启动多个虚拟控制台,在控制台上启动登录进程login,以接受用户登录。使用者可以使用Alt-F1、Alt-F2和Alt-F3等功能键在不同的控制台之间进行切换。缺省条件下有4个虚拟控制台(其中第四个没有提供登录服务),最多到有12个虚拟控制台(受标准PC的12个功能键的限制)。

  系统在控制台上印出login提示,此时可以使用root用户和安装时设置的root口令登录系统。

  FreeBSD/i386 wb.online.ha.cn (ttyv0)

  login: root

  Password:

  用户通过口令认证之后,系统将/etc/motd中的内容显示到屏幕上,这个文件中通常放置系统管理员想通知每个用户的通告内容,从而通知正在登录的用户有关信息。然后login程序启动用户的登录shell,由登录shell 执行/etc/profile为用户设置好使用环境。

  当登录到系统之后,用户就能输入各种命令,以使用FreeBSD系统处理各项任务。

  当工作完成之后,可以使用logout命令退出当前会话。使用exit,或使用键Ctrl-D(^D),都能结束当前会话,退出登录过程。

  # logout

    *
      关闭系统

  由于FreeBSD是多任务系统,同时有多个进程在运行,并且使用了磁盘缓冲技术以提供更佳的系统效率,因此使用直接关闭电源的方法关闭计算机会对系统造成破坏。在非正常关机之后的再次启动过程中,系统将侦测到上次没有正确关闭系统,并自动运行硬盘检查程序fsck(由rc文件启动),来检查并修复硬盘的错误。

  关机需要在以root身份登录进入系统之后,使用shutdown命令来进行关闭系统,需要使用-h参数,表示halt,停机操作:

  # shutdown -h now

  Feb 4 12:18:26 wb shutdown: halt by root:

  Feb 4 12:18:29 wb syslogd: exiting on signal 15

  syncing disks... done

  The operating system has halted.

  Please press any key to reboot.

  一些情况下,如更新了系统内核时,要重新启动系统。则应使用-r参数,表示reboot,重新启动系统:

  # shutdown -r now

  如果没有使用-h或-r参数,shutdown命令将试图进入单用户状态,这与在启动时在boot loader 中下输入boot -s命令进入单用户模式略有差别,由于在多用户状态时系统中有多个进程运行,当进入单用户状态时可能有些进程不能正常退出,同时文件系统的状态也有差别。

  而参数now为一个时间参数, “now” 表示立即执行shutdown操作。由于FreeBSD是多用户系统,在执行shutdown时会有其他用户通过网络使用这个系统,正常情况下应该延迟一端时间再执行shutdown 操作,给那些正在连接的用户一定的时间用于保存数据并退出系统,就需要使用其他时间参数来启动shutdown。例如:下面命令将使系统在2分钟后停机,同时也将向正在登录的用户发送广播信息,将后面参数中的信息通知当前登录的各个用户:

  # shutdown -h +2 “Hi guys! please logout”

  时间参数除了这种增量形式,也可以使用不用”+”号的绝对形式来表示,那么时间参数就为hhmm的格式,如 0120表示1:20等。

  在系统还没有停机或重起的时间间隔内,shutdown将产生/etc/nologin文件,而系统中的 login程序将检查是否存在这个文件,当发现存在这个文件时就阻止非root用户登录系统。正常情况下shutdown 执行真正的停机或重起操作时会删除这个文件,如果这个文件因为某些原因而没有被删除,那么系统login进程将不允许普通用户登录。

  用于立即启动和停机的命令还有reboot和halt,相当于使用-r或-h参数的shutdown指令。因为这是立即执行的命令,没有提供警告登录用户的功能。由于命令相对简单,因此单人使用的系统中可以很方便的使用。

  如果使用者没有使用root登录进系统,但是可以接触到控制台,那么仍然可以正常关机而不破坏系统。使用者可以使用Ctrl-Alt-Del热键重起计算机,就在计算机进入BIOS自检时,再关闭计算机的电源。这种方法在系统屏蔽了Ctrl-Alt-Del热键的启动能力之后就不再有效。

  在重新定制内核时使用 “options SC_DISABLE_REBOOT” 可以屏蔽系统控制台的热启动功能。

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

FreeBSD连载(12):用户管理-增加用户

用户管理

  为了使用多用户的FreeBSD操作系统,必须是系统的登记用户。用户信息保存在/etc目录下passwd 文件中,在这个文件中定义的一个FreeBSD用户应具有以下属性:

  用户名(Username):在系统中使用这个用户名来标识用户,每个用户名不超过8个字符,且是大小写敏感的。习惯上用户名只使用小写字母,通常根据用户真实名字的缩写来选择合适的用户名。

  用户标识号(User ID):由于计算机中处理数字比处理字符串更容易,因而使用数字方式的用户标识号来区分不同用户更为适合。事实上Unix系统就是使用唯一的用户标识号来区分用户的,在某些特定目的下,可以存在多个有不同用户名、但用户标识号相同的用户,这表示这些不同用户名的用户实际上是同一个用户。

  口令(password):系统用它来验证用户是否合法。超级用户root可以使用系统程序 passwd来更改每个用户的口令,用户也可以使用passwd来更改自己的口令。较老的Unix系统中直接在 passwd文件中保存口令的密文,由于passwd文件是系统中的每个用户都可以读取的,只通过加密来保证口令的安全性。然而现代计算机的发展使得情形发生了变化,高速计算能力使得通过猜测的方式来破译口令成为可能。因此现在Unix中口令均不再直接保存在passwd文件中了,而passwd文件中的口令域使用一个 “*” 来代替。FreeBSD使用 /etc/master.passwd作为真正的口令文件,保存包括个人口令在内的数据,但这个文件不能被普通用户读取。

  命令解释程序(shell):用户登录后启动这个程序来接收用户的输入并执行输入相应命令,标准的shell有sh和csh,更复杂易用的shell有bash和tcsh等,但它们不是基本系统的一部分,必须额外安装。shell程序是一个标准的Unix程序,但系统在/etc/shells文件中定义了一些标准shell的名字,很多应用程序检查这个文件中内容和用户的shell来判断这个用户是普通用户,还是用于特定目的而创建的用户。

  个人目录(home directory):由于FreeBSD是多用户系统,每个用户都要有自己的独立使用环境,不同用户的文件不能相互交叉存放,因此Unix中为每个用户配置了自己的个人目录,用户的文件都放置在各自的目录下,从而互不干扰。习惯上FreeBSD下用户的个人目录位于/home目录下,使用用户名作为子目录名,多数shell中使用波浪符号~,来代表该用户的个人目录。

  组标识号(Group ID):具有相似属性的多个用户可以被分配到一个组内,每个组都有自己的组名,且以自己的组标识号相区分(组标识号和组的对应关系在/etc/group文件中给出),用户的组标识号保存在passwd文件中。早期的Unix中,每个用户只能属于一个组,而现代Unix中每个用户可以同时属于多个组,除了在passwd文件中指定了其归属的基本组之外,还可以在文件/etc/group中,明确指定一个组包括某个用户,使得该用户能属于多个组。

  除此之外,用户还有其他属性,例如登录类别,这些信息记录在另一个口令文件:/etc/master.passwd中。

    *
      增加用户

  虽然可以使用系统安装程序/stand/sysinstall中的Add User选项来增加用户和组,但熟练的管理员并不喜欢这种全屏幕操作方式。Unix下的习惯做法是使用命令行方式,如使用adduser命令来或pw命令添加用户。

  adduser命令使用配置文件/etc/adduser.conf来保存添加用户使用的缺省数据,如果没有这个配置文件,第一次执行adduser时会询问缺省设置,以自动生成这个设置文件。这样对于很多基本一致的用户数据就设置了正确的缺省值,以减少输入的工作量。

  # adduser

  Use option ``-silent'' if you don't want see all warnings & questions.

  Check /etc/shells

  Check /etc/master.passwd

  Check /etc/group

  Enter your default shell: bash csh date no sh [sh]:

  Your default shell is: sh -> /bin/sh

  Enter your default HOME partition: [/home]:

  Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:

  Send message from file: /etc/adduser.message no

  [/etc/adduser.message]:

  Use passwords (y/n) [y]:

  Ok, let's go.

  在前面的过程中生成了配置文件之后,还可以使用编辑器来修改它的内容以更改adduser的配置。虽然生成了配置文件,但每次启动adduser还会询问这些缺省参数是否需要更改,使得操作不太简便。为了让adduser直接进入用户数据输入状态,可以使用 “adduser -quiet” 减少提示信息,-quiet的缩写方式为-q, -silent和-s参数也有同样的效果。更一劳永逸的方式是直接修改adduser.conf文件,将其中的 verbose参数改为0,表示尽量减少提示。这个参数的缺省值为1,将进行设置缺省值的提示,而设置为2能提供更多的配置参数。

  # adduser -s

  Use option ``-verbose'' if you want see more warnings & questions

  or try to repair bugs.

  Enter username [a-z0-9_-]: user22

  Enter full name []:

  Enter shell bash csh date no sh [sh]:

  Enter home directory (full path) [/home/user22]:

  Uid [1007]:

  Enter login class: default []:

  Login group user22 [user22]:

  Login group is ``user22''. Invite user22 into othergroups: guest no

  [no]:

  Enter password []:

  Use an empty password? (y/n) [y]:

  Name: user22

  Password: ****

  Fullname: user22

  Uid: 1007

  Gid: 1007 (user22)

  Class:

  Groups: user22

  HOME: /home/user22

  Shell: /bin/sh

  OK? (y/n) [y]:

  Added user ``user22''

  Send message to ``user22'' and: no root second_mail_address

  [no]:

  your account ``user22'' was created.

  Have fun!

  See also chpass(1), finger(1), passwd(1)

  Add anything to default message (y/n) [n]:

  Send message (y/n) [y]:

  Add another user? (y/n) [y]:n

  因此可以使用-s参数使adduser直接进入增加用户的操作步骤,这将询问增加用户的必要数据,包括用户名、口令等数据。adduser将使用adduser.conf中的一些内容作为缺省提示,通常有提示的步骤可以直接利用缺省提示进行操作。

  比adduser命令功能更复杂的命令为pw,管理员能使用它来完成各种复杂的用户管理任务,包括增加、删除用户,以及修改用户的各项参数设置。

  另一种更直接的管理用户的方式是直接编辑口令文件的内容。这是Unix早期常见的做法,但随着Unix的发展,当前的Unix使用shadow的方法保存加密口令数据,用户数据不仅保存在passwd文件中,而真实的口令等内容被系统保存在另一个口令文件中,必须同时修改这两个口令文件,使其保持一致才可以。因此不能直接使用vi等编辑器来编辑一个/etc/passwd文件,而应该使用系统提供的vipw命令修改这口令文件,并同时写入两个文件。出于安全的考虑,vipw将使用一个内部编辑器(与vi相同)编辑master.passwd文件,保存时同步这两个口令文件。事实上master.passwd文件才是真正的口令文件,单独改变/etc/passwd文件,对用户数据没有影响。

  由于系统中会反复读取用户口令,而在普通文本形式的passwd文件中查找用户的速度与用户数量是一种线性关系,当用户数量一多,查找效率就急剧下降。而数据库的形式更适合这些经常发生的查找任务,因为数据库将自动维护数据的索引,这些索引可以用来提高查找效率。FreeBSD中提供了一种简单的的标准数据库文件格式,口令文件可以使用这种 db数据格式来提高性能。因此口令文件有对应的数据库形式:/etc/pwd.db和/etc/spwd.db,用来获得用户信息的系统调用事实上首先查询这两个数据库文件,而由系统来自动维护这两个数据库文件与前两个passwd文件同步。系统管理者可以使用pwd_mkdb来从文本形式的口令文件来生成数据库文件。通常,普通文本形式的passwd 文件只适合于有几百帐号的系统,而db数据库形式适合一万以上帐号的系统。

  在其他Unix系统中,第二个口令文件的名字与bsd系统使用的文件名不同,大部分Unix System V 系统使用/etc/shadow文件。使用不同的名字只是习惯的问题,文件格式都是passwd文件格式。因此如果要求兼容,可以为/etc/master.passwd建立一个叫shadow的符号连接。

  组能帮助权限的分配,与管理用户类似,管理组也可以通过sysinstall来完成,或直接改动/etc/group 文件。用户除了属于passwd文件中定义的组之外,还可以被邀请进入其他组中。adduser添加用户时会询问是否将用户加入其他组,如果在用户生成之后在将用户加入其他组,就需要直接改动/etc/group文件。例如 group文件中有这样一行:

  wheel:*:0:root,admin

  admin:*:100:admin

  这表示用户admin不但属于自己在passwd中规定的组,还属于wheel和admin组。可以使用groups 命令来获得用户的属组列表。

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

FreeBSD连载(13):超级用户root、登录类别

*
      超级用户root

  超级用户是Unix的所有者,拥有所有的权利,因此也具有很大的危险性,不当使用超级用户权力能对系统造成不可挽回的破坏。即使对于个人使用的FreeBSD系统,尽管不需要将系统与其他人共享,但是仍然不要使用root用户作日常处理工作。通常管理员在正常情况下仅仅使用普通帐户进行操作,只有在执行系统管理的必要时候才使用超级用户权限。

  从普通用户成为超级用户的标准方法是使用su命令:

  $ su

  Password:

  #

  正确输入root的口令之后,就成为了超级用户,系统提示符也从标准的 “$” 变为root专用的 “#” 提示。

  在FreeBSD上要使用su命令成为root用户,不但要知道root的口令,还需要经过特别设置,否则就不能成功使用这个命令。这是因为FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过这个命令成为root用户。因此需要编辑组设置文件/etc/group,将需要超级用户权力的管理成员加入到wheel组中。

  如果仅仅要用户执行部分需要超级用户权力的操作,而不想将root的口令泄露出去,更简单的做法是使用sudo ,然而这属于基本系统之外,需要另外安装的管理工具。

    *
      登录类别

  从 4.3 BSD Net/2开始,BSD Unix引入了登录类别这种分类机制来管理用户使用的资源、记账和环境设置。FreeBSD系统使用/etc/login.conf中描述的数据来将用户按照登录环境、强制性的资源限制以及记账管理等分为不同的登录类别,每个用户的登录类别记录在/etc/master.passwd中的该用户的设置中。

  default:\

  :cputime=infinity:\

  :datasize-cur=64M:\

  :stacksize-cur=64M:\

  :memorylocked-cur=10M:\

  :memoryuse-cur=100M:\

  :filesize=infinity:\

  :coredumpsize=infinity:\

  :maxproc-cur=64:\

  penfiles-cur=64:\

  :priority=0:\

  :requirehome@:\

  :umask=022:\

  :tc=auth-defaults:

  上面设置了default登录类别中的几个参数,如果没有在master.passwd文件中明确指定用户的登录类别,就使用这个缺省类别来作为用户的登录类别。

  cputime设置了用户的每个进程可以使用的CPU时间,缺省是无限制(infinity)。如果加以限制,有些需要大量CPU时间进行运算的进程就不能正常执行到结束。

  datasize-cur设置了用户使用的数据段最大为64M,但-cur设置不是强制的,用户实际使用的数据有可能超过这个值,但最大不能超过datasize-max设置的值(缺省没有设置)。如果没有-cur和-max 后缀,仅仅定义datasize,则表示datasize-cur和datasize-max同样都为datasize 设置的值。同样stacksize定义了对栈的限制。

  memorylocked-cur设置了用户每进程可以锁定的最大内存。

  memoryuse-cur设置了每进程使用的最大内存。

  filesize-cur设置了用户产生的文件大小。

  coredumpsize设置了在应用程序发生问题时产生的core dump文件的大小。

  maxproc-cur设置了用户可以同时执行的最大进程数。

  openfiles-cur设置了每进程最多打开的文件数。

  priority设置用户进程的优先级。

  requirehome设置用户登录时是否需要主目录,@符号表示不需要主目录。

  umask项设置缺省的umask,用于用户创建文件的属性。

  tc设置系统认证策略为使用缺省的认证策略。

  如果要创建新类别,并不需要对每个值都重新设置,系统缺省先应用default类别的设置,然后再应用具体类别的设置,因此只需要设置与default类别不同的项就可以了。

  users:\

  :manpath=/usr/share/man /usr/X11R6/man /usr/local/man:\

  :cputime=4h:\

  penfiles=32:\

  :maxproc=48:\

  :tc=default:

  上面是设置了一个新类users,可以看出它为用户设置了环境变量MANPATH,并重置了cputtime 、openfile、maxproc和tc的值。每次更改login.conf之后,都要进行更新登录类别数据库的操作。

  # cap_mkdb /etc/login.conf

  由于登录类别保存在master.passwd文件中,通常在使用adduser添加用户的时候设置用户的登录类别。如果要进行更改,必须使用vipw来修改/etc/master.passwd文件的第5个域。下面为master.passwd 中的一行,该行指定这个用户的登录类别为user:

  wb:FPRKMMNuZ3Pfk:1001:1001:users:0:0:Wang Bo:/home/wb:/bin/sh

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

FreeBSD连载(14):shell设置

shell设置

  命令解释程序shell是与用户关系最密切的应用程序,用户主要通过shell使用系统。在每次登录系统之后,就启动了一个与用户交互的shell,这个shell将给出一个提示符等待用户输入,(sh为 “$” ,csh为 “%” ,如果是使用root用户,登录提示符将是 “#” ),然后对用户的输入进行解释执行。

  FreeBSD的基本系统中可以使用的shell有两个:sh和csh。这两个基本shell的风格不太相同,不同的使用者常常会根据喜好来在两者之间进行选择。当然当前有更好的shell程序可供使用者选择,这些后续的 shell均是根据sh或csh的风格进一步发展出的,因此可以说在shell中,也有两种风格,需要使用者根据自己的使用习惯进行选择。

  对于管理员来将,要为使用不同shell的用户都设置好基本的环境,就必须了解这两种风格的shell设置方式。系统登录时,sh将首先执行/etc/profile文件,为每个用户设置最基本的环境,而csh将使用 /etc/csh.cshrc,csh.login和csh.logout作为系统csh资源文件。执行了系统级别的登录文件之后,每个用户的shell就在该用户的主目录下寻找该用户个人的资源文件:sh使用.profile文件,csh使用.login和.cshrc文件。这些资源文件均使用相应的shell语言,/etc/profile和个人目录下的.profile使用sh风格的控制语言,/etc/cshrc和个人目录下的.login、.cshrc使用csh 风格的控制语言。系统管理员可以改动这些资源文件,为用户提供一个最方便的使用环境。当然,系统管理员没有必要直接去修改个人主目录下的资源文件,这些文件应该由用户自己管理,但是系统管理员可以在生成帐号时为用户产生缺省的资源文件,以减轻用户设置资源文件的麻烦。adduser命令缺省使用/usr/share/skel下的文件为用户提供各种资源文件的缺省设置,这个目录下除了可以放入shell的资源文件之外,还可以放入其他应用程序的资源文件。由于这些资源文件都是以点开头的隐藏文件,为了表示清楚,在skel目录下使用了一种转换方式,如使用dot.profile 作为.profile的模板。

  # ls /usr/share/skel

  dot.cshrc dot.mail_aliases dot.rhosts

  dot.login dot.mailrc dot.shrc

  dot.login_conf dot.profile

  在/usr/share/skel中为用户设置的缺省配置文件,在用户生成之后,就不会对用户产生影响了。因此对系统登录文件进行修改更有效和直接。对于sh风格的用户,可以更改/etc/profile文件,对csh应更改 /etc/csh.cshrc文件。在这些文件中可以改动shell使用的环境变量,这样来改变shell的行为方式,或者执行一系列自动操作,完成一些用户登录时需要自动执行的任务。

常用的环境变量:
EDITOR 设置用户常用的编辑器,很多程序查看这个变量来启动具体的编辑器,可以 根据系统的情况更改
HOME 用户的主目录的名字,这个变量由login程序设置,一般不需要更改
DISPLAYX 使用这个环境变量来标识具体的显示位置,格式为“计算机名字:X服务 器序号.显示屏序号” ,例如:xt1:0.0,它不需要在资源文件中进行定义
LANG 系统使用的语言,用于系统的本地化,缺省为 “C” ,具体的设置可以查看 /usr/share/locale 目录,那里定义了不同的语言,可以将其设置为zh_CN.EUC来使得一些软件使用中文字符。
MAIL 用户mail文件的位置,也不需要改动
PATH 使用冒号分隔的一系列路径,系统用它来查找具体可执行程序,因此这个变量非常重要,可以根据具体的情况改动其值。为了安全的原因,不要将当前目录作为执行程序的搜寻路径,尤其对于root用户。这样在当前目录下启动程序,需要加上路径,例如启动当前目录下的a.out 程序,输入 “./a.out” 。
MANPATH 使用冒号分隔的一系列路径,系统用它来查找具体命令的在线手册,设置方法与PATH相同。
PS1sh 风格的shell使用这个变量的值作为提示符,缺省值为 “$”(root为 “#” )。更现代的sh就增强了提示符的灵活性,可以在提示符中加入当前目录、用户名、机器名,命令的序号等。
PS2sh 风格的shell使用这个变量的值作为后续提示符,提示命令还没有完全输入,缺省为 “>“
TERM 终端的类型,对于需要全屏操作的程序,非常重要。有时要根据情况对设置进行调整。
TZ 时区设置,具体的时区信息位于/usr/share/zoneinfo目录下,需要设置为适合本地时区的标准值

  可以将用户的shell设置为特殊的应用程序,来达到对特殊用户进行限制的目的。例如,仅仅给予用户一个电子邮件信箱,但不想给他终端使用权,可以将用户的shell更改为/bin/true或者其他立即退出的程序。为了安全起见,用户shell应该是一个不存在漏洞的二进制程序,最好不要使用解释性语言脚本作为登录shell。由于系统认可的shell程序是在/etc/shells文件中列出的程序,将特殊用户的shell设置为特殊的应用程序,但这些应用程序没有列入shells文件,那么这个用户就会被一些应用程序区分出与普通用户的差异,从而拒绝提供服务。例如ftp服务器程序ftpd,通过检查用户的shell是不是标准shell,来区分这个用户是普通用户还是用于特定目的的用户。

  注意,不能轻易更改root用户的shell,因为这可能会造成root无法正常登录,而使得无法正常执行系统维护。即使是将root的shell更改为其他更新、更强功能的标准shell,例如bash或tcsh,也是不应该。虽然这些shell也是非常成熟的shell程序,仍然不应该使用它们作为root的shell。主要原因是这些 shell一般没有被安装到根分区中,那么当系统进入单用户状态时就会发生问题。另外这些shell可能会由于进行版本升级等原因,而偶然形成故障,造成root无法正确登录。此外,由于这些非标准shell不一定来自于系统的安装盘,因此也存在对shell来源的安全信任问题,必须保证这些shell不是经攻击者更改过的版本。如果要使用它们 shell提供的方便特性,可以在系统登录之后再使用全路径执行它们。

    * 配置用户shell

  事实上sh与csh,并不是普通用户的最佳选择,因为这两个shell在易用性方面做的不够好,例如命令行编辑功能不强、不能利用热键重复执行命令等。较新的shell,如bash和tcsh都具有这些方便用户使用的功能,但必须安装了这些shell程序之后,才能更改普通用户的shell设置以使用这些shell程序。更改用户的shell 可以使用pw、vipw或chsh。

  这两个shell分别遵照sh和csh的风格,因此喜好csh风格的可以选择tcsh,而喜欢sh风格的选择 bash。除了这两种shell之外,还有ksh、zsh等shell可供选择。如果对两种shell没有偏好,可以选择bash,它是一个GNU软件,比标准sh功能强大的多。

  使用了这两些增强型shell之后,用户就可以使用shell提供的命令行编辑功能。按照习惯的不同,可以选择vi风格的编辑方式或emacs风格的方式,缺省为emacs方式,这种方式使用方向键来回溯执行过的命令,并进行修改,而vi风格使用字母命令作编辑键,例如使用h、j、k、l四个键来移动光标,vi风格的好处是不使用基本键盘之外的控制键,因而可以适用于任何终端设备,并且进行编辑时手不需离开基本键盘,熟练操作之后最为快捷。emacs风格比起vi风格更适合从个人计算机转向Unix的使用者的习惯。bash, ksh ,zsh下使用下面的命令在emacs 风格和vi风格切换:

  bash$ set -o emacs

  bash$ set -o vi

  tcsh中使用不同的命令:

  % bind emacs

  % bind vi

  还可以为常用的命令设置别名,简化用户输入,例如:

  bash$ alias ec=”echo This is a alias”

  bash$ ec

  This is a alias

  shell用于方便用户操作的另一项能力是自动补全命令或文件名的功能,因为FreeBSD下的文件名可能很长,将它们全部输入比较麻烦。事实上可以输入部分名字,然后按Tab键(在vi风格下是连续两次按Esc键),shell 将自动补全文件名的剩余部分。如果已经输入的这部分名字不能确定具体的命令或文件,那么shell只将能确定的部分补上,然后响铃通知使用者继续输入以明确具体的文件。

  事实上即使在基本的sh或csh下,也可以使用 “*” 等特殊字符,用模式匹配的方式来简化输入。

  bash$ cd /usr/loca*

  bash$ pwd

  /usr/local

  Unix中的多数程序都具备模式匹配的处理能力,而shell的模式匹配功能最为常用。shell可以使用这些特殊模式来配置多个文件,达到简化操作的目的。如果要熟练掌握Unix,必须掌握模式匹配。

  当试图在bash下输入汉字的时候,除了必须设置终端属性能接受8位字符之外(执行stty pass8命令),还需要设置bash的输入输出转换,可以在登录脚本.profile文件中包括以下设置:

  bind 'set convert-meta off'

  bind 'set meta-flag on'

  bind 'set output-meta on'

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

FreeBSD连载(15):文件的属性

文件系统与磁盘操作

  文件在Unix下是一个非常重要的概念,Unix下不但使用文件来保存数据,而且使用文件来保存目录信息、表示硬件设备等。Unix的文件名对大小写敏感,例如 “FOO” 和 “foo” 是两个不同的文件,而且文件名可长达255个字符。

  文件是按照分级的形式组织起来,每一级称为一个目录,其内容使用一个特殊的目录文件保存,而第一级目录为根目录,这就形成了一种树状结构,最下面是根目录 “/” ,根目录下放有普通文件和其子目录,如: “/usr/” 、 “/var/” 等,而在不同的子目录下又有自己的文件和子目录。

  /目录:目录树的根,用于保存系统的内核文件和系统启动文件,它所在的文件系统为根文件系统。

  /dev目录:用于保存系统的设备文件,占用大致固定的硬盘空间,位于根文件系统中。

  /etc目录:用于保存系统的配置文件,包括passwd,rc等非常重要的文件,也被放置到根文件系统中。

  /bin和/sbin目录:保存了用于系统维护目的的执行文件,其中/sbin中的文件通常直接用于系统维护,/bin为提供管理员使用系统的基本工具。也必须放置在根文件系统上,在系统运行在单用户模式时,只有根文件系统安装到系统上时,就能够运行这些程序进行系统维护任务。

  /tmp目录:用于存放程序运行产生的临时文件,这个目录也是每个用户都可写的,在系统启动时将自动清空这个目录。当系统运行较大型的服务程序时,会要求较大的/tmp空间,会超过根文件系统的空间,因此可以在其他文件系统中创建另一个临时文件目录,使用符号连接等方法进行维护。

  /usr目录:用于保存系统正常运行时使用的多种文件,其中/usr/bin放置系统执行文件,/usr/sbin 放置系统维护程序,/usr/local放置非标准的应用程序,/usr/share放置系统中的文档和其他数据文件,/usr/src中放置系统的源代码,/usr/X11R6放置X Window系统、应用程序和数据文件。由于这些内容非常多,/usr目录通常为一个单独安装的文件系统,占用一个硬盘分区,称为usr文件系统。随着系统任务的增长,/usr目录中的内容也会迅速增多,还要考虑将其较大的子目录分离出来,例如/usr/local目录。

  /var目录:用于保存系统运行时产生和使用的数据文件,例如/var/log目录用于放置系统日志,/va r/db/pkg目录用于放置系统软件包的安装记录。很多应用程序也使用它来放置数据文件,如news服务器等。这个目录下文件会随系统的运行而不断变化,其中的很多文件会不断增大,占用大量的磁盘空间。应该将这个目录分离出来,这样即使某个进程在这个目录下没有限制的产生数据文件,填充整个文件系统,也不会影响其他目录下的数据存储,例如用户在自己目录下的数据存储。由于/var目录的大小会随着应用程序的需要改变,对于提供网络服务的服务器,/var占用磁盘分区应该大一些。

  /home目录:使用它用于维护用户的个人目录,它的大小由用户数量及用户的活跃程度决定,也需要有足够的空间才能提供正常的服务。通常这个目录保存在usr文件系统中,而在根目录下使用连接来维护。当用户数量增加的很多的时候,应该让它位于一个单独的文件系统中。

  这些目录开始就设计为保存不同的数据,而各个目录会使用不同的磁盘分区。习惯于DOS/Windows的使用者会不习惯这种使用多个文件系统的方式,而只使用一个文件系统,这种做法是不对的。多文件系统可以用于分隔不同的任务,分隔系统风险,增加可靠性,对于用作服务器的FreeBSD系统是必需的。

  Unix的树状目录结构十分标准,那类文件应该放置到那个目录中都有一定的习惯。当然在不同的Unix中,具体文件的位置也有细微的差别,事实上在Unix发展的过程中,标准目录树结构的也有几次较大的改动,但是基本结构是相同的。由于FreeBSD有统一的版本,所有的开发者都使用同一个源代码树,而且使用统一的Packages Collection 机制来维护应用软件,因此FreeBSD的目录结构更为整齐、干净。

    *
      文件的属性

  由于FreeBSD是一个多用户系统,不同的用户对不同的文件就应该有不同的处理权力,通常创建文件的用户就拥有这个文件,成为这个文件的属主。同样,文件也有自己的属组,这是一个文件的两个重要属性。由于文件的属主和组涉及到对文件的访问控制,因此只有root能更改文件的这两个属性,更改文件属主的命令为chown,更改文件属组的命令为chgrp。

  由于不可能为每个用户都单独提供完全独立的文件系统,多用户操作系统必须提供一种安全的访问控制机制,使得用户既能和其他用户共享某些文件,又能保证各个用户的文件不会被非法存取或破坏。Unix分别针对属主、同组用户和其他用户共三种不同的用户,分别设置了存取控制权限,这个权限分别为:读、写和执行,使用英文字母r(Read)、w(Write)和x(eXecute)来表示。由于对属主、组和其他用户均有这三种权限设置,因此每个文件共有九个权限参数。使用 “ls -l” 命令就能看到文件的权限设置:

$ ls -l


drwx------ 4 user wheel 512 Nov 25 17:23 Mail


-rw-rw-r-- 1 user wheel 149 Dec 4 14:18 Makefile


-rwxr-xr-x 1 user wheel 3212 Dec 4 12:36 a.out


drwxr-xr-x 1 user wheel 512 Dec 14 17:03 bin


-rw-r--r-- 1 user wheel 143 Dec 4 12:36 hello.c


drwxr-xr-x 2 user wheel 1024 Oct 16 1997 public_html


drwxrwxrwx 2 user wheel 512 Jan 3 14:07 tmp


  从上面的例子中,可以看到文件的权限设置在列出的数据的第一列中显示,例如文件a.out的属性是-rwxr-xr-x,共显示了十个字母的位置。其中第一个位置是用于标识文件的种类,而非权限设置,其余九个位置分别表示三组的三种权限设置。第二个到第四个位置表示属主的权限分别设置为读、写和执行,第五个到第七个位置设置同组用户的权限,第八个到第十个位置设置其他用户的权限。当指定位置上没有显示对应的权限,而是 “-” ,则表示不允许对应的权限。因此a.out的权限设置为,对于属主user的权限为读写和执行,对于同组用户为读和执行权限,对于其他用户也是读和执行权限。对于目录来讲,拥有读权限意味着用户可以列出这个目录下的文件内容,写权限使用户可以在这个目录下增、删文件和更改文件名,执行权限保证用户可以使用cd进入这个目录。

  ls输出结果的第一个位置表示类别,例如 “d” 表示目录, “c” 表示该文件为字符设备文件, “b” 表示为块设备文件, “l” 表示为一个符号连接。

  Unix系统内部使用数值来表示这些属性,每一个属性与文件属性中的一个二进制位相对应,如果该存取权限设置了,对应的二进制位就是1,如果该存取权限没有设置,对应的二进制位是0。这样a.out的权限属性rwxr-xr-x 用二进制来表示就是111101101,Unix下常使用八进制的形式表示,这样这个权限是755。

  文件的属主和管理员可以使用命令chmod来设置或改变文件的权限。chmod有几种不同的使用方法,可以直接使用八进制的权限表示方式设置属性,或者使用属性字母来设置或更改文件的属性,不同的使用方法要求不同的 chmod参数,下面是使用chmod的一些例子:

  chmod 750 a.out :改变a.out的权限为750;

  chmod a+x a.out :对所有用户增加a.out的执行权限,
  a(All)表示所有用户;

  chmod u=rwx a.out :设置属主的权限为读、写和执行
  u(user)表示属主用户;

  chmod g+rw a.out :增加同组用户的读写权限,
  g(group)表示同组用户;

  chmod o-w a.out :减少其他用户的写权限,
  o(others)表示其他用户;

  chmod go= a.out :清除同组和其他用户的所有权限;

  chmod o=u-w a.out :设置其他用户的权限为减去写权限的属主权限;

  权限755是最常见的文件权限设置,这种属性的文件允许其他用户可以访问这个文件,但不可以更改,如果不打算让其他用户访问文件,文件的存取权限可以设置为700。文件在创建的时候,系统使用掩码来决定文件的权限,掩码的二进制对应位为1的,文件属性的对应位就设置为0,例如当掩码的八进制表示为022时(二进制为000010010),创建的文件权限就为755(111101101)。文件掩码使用umask命令来设置,例如使用 “umask 027 ” 设置掩码为027,则创建的文件权限为750,其他用户将对这个文件没有任何权限。可以在启动资源文件或者在登录类别中设置中设置用户的掩码。

  目录需要设置执行位,以允许用户能使用cd命令进入这个目录中

  当一个文件的权限设置完毕之后,在一个进程试图访问这个文件时,系统就比较这个进程的属主和属组与文件的属主和属组,判断这个进程是否具备访问权限。由于每个进程的属主和属组标识是由启动这个进程的用户决定的,因此一个用户启动的进程就具备其本身对文件的访问权限。

  除了读、写和执行权限以外,对于可执行的程序还有另外两个非常重要的属性:设置属主身份(setuid, Set User ID)权限和设置组身份(setgid, Set Group ID)权限,这两个属性允许某个程序可以更改自己的进程标识为程序文件属主或组,因而就可以具备该程序文件属主或属组的访问权限,而不再仅仅是启动进程的用户的访问权限,这样就能完成特定的任务。很多系统程序,例如su,就是通过这个特性来完成从执行进程时的普通用户身份到root用户身份的转化的,因此这两个属性对于系统安全至关重要。不是必要的系统程序,不能具备这些属性。

  可以使用 “chmod +s file” 或 “chmod g+s file” 来设置这两个属性,或者使用 “chmod 4755 file” 、 “chmod 2755 file” 八进制方式来设置setuid 或setgid属性。

    * 文件的连接和符号连接

  Unix中使用i节点(i node)来记录真实的物理文件及其位置,文件名只是指向i节点的一个连接。因此每个文件可以有多个名字,每个名字就称为文件的一个连接,而同一个文件的所有连接所指向的i节点件完全相同。但在删除时只有全部删除这个i节点的全部连接,才能删除i节点、即删除这个文件本身。

$ ln l1 l2

$ ls -l l*

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l1

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l2

$

  上面的例子使用ln创建了一个连接,然后在ls的结果中可以看到第二列的数字为2,这表示这个文件有两个连接。这样的连接可以建立在不同的目录中,但所有连接所在的目录必须在同一个文件系统中,才能使用同样的i节点。由于连接是直接指向标识物理文件的i节点,因此这种连接又称为硬连接。

  另一种更灵活的连接方式是符号连接,它没有指向物理文件的i节点,而是直接指向目录树上的另一个入口,那么当系统访问这个文件时,就沿着它指向的目录树的位置去查找具体文件。这样就能对任何文件系统中的文件和目录建立连接,因此称为软连接。符号连接可以跨越文件系统,灵活性很大,能够突破物理文件系统的限制维护目录树的一致性,对于系统管理和维护很有用。但是这种连接方式需要对目录树进行多次查找,增加了文件操作的额外步骤,因此效率较低,因此不应该使用多级连接,及某个符号连接指向的目录还是一个符号连接,甚至发生符号连接的循环。应该尽量少用符号连接,并避免多级符号连接及符号连接的循环。

$ ln -s l1 /root/files

$ ls -l l*

lrwxrwxrwx 1 user wheel 12 Dec 4 12:36 l1 -> /root/files

$

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

FreeBSD连载(16):设备文件

设备文件

  对于每种硬件设备,系统内核有相应的设备驱动程序负责对它的处理。而在Unix中,使用设备文件的方式来表示硬件设备,每种设备驱动程序都被抽象为设备文件的形式,这样就给应用程序一个一致的文件界面,方便应用程序和操作系统之间的通信。所有的设备文件都放置在/dev目录下。

$ ls -l /dev/rfd0 /dev/fd0


brw-r----- 9 root operator 2, 0 Nov 12 13:32 /dev/fd0


crw-r----- 9 root operator 9, 0 Nov 12 13:32 /dev/rfd0

  在上面的列表中可以看到原来显示文件大小的地方,现在改为显示两个用逗号分隔的数字。这是系统用来表示设备的两个重要的序号,第一个为主设备号(major number),用来表示设备使用的硬件驱动程序在系统中的序号;第二个为从设备号(minor number),硬件驱动程序使用它来区分不同的设备和判断如何进行处理。FreeBSD 下主设备号用8位表示,而从设备号用24位来表示。事实上设备文件的名字并不重要,重要的是这两个设备号,操作系统使用它确定硬件驱动程序,并与硬件驱动程序进行通信。

    * 磁盘和块设备文件

  在Unix下将设备分为两种,块设备和字符设备,其中块设备主要用于随机存取的目的,磁盘为这一类设备的代表,而字符设备用于顺序存取的目的,例如磁带或终端设备。

  磁盘设备的命名方式在前一章中提到过,磁盘设备由磁盘名、磁盘的序号、分区的序号、以及FreeBSD子分区的序号来表示,例如在设备wd0s1a中,wd为驱动程序,此后为设备序号,0表示为这个驱动程序的第一个设备,Unix 习惯上从0开始计数,第三部分的分区序号为s1,注意这里为第一个分区,因为s1是从1开始向下排列的,与一般Unix 的习惯不同,这是因为分区的概念是一个DOS概念,因此这里也使用与DOS相对应的顺序,最后一个a为FreeBSD 子分区的顺序,每个UFS基本分区可以有8个子分区,这8个分区按照习惯用于不同的目的,例如wd0s1a用于根文件系统,wd0s1b用做交换分区,使用wd0s1c表示整个硬盘分区wd0s1。因此可以将fd0c用于对整个软盘fd0进行存取,wcd0c用于对整个光盘wcd0进行存取等。

  传统名字,例如wd0a,可以用于表示第一个UFS分区上的a子分区,如wd0s1a。一般一个硬盘上只有一个UFS分区,因此可以直接使用传统名字标识磁盘分区。

  在使用ls命令列表时,系统使用c(character)标识一个字符设备文件,使用b(block)标识块设备文件。

$ ls -l /dev/*wd0s1

crw-r----- 1 root operator 3, 131072 Oct 31 19:59 /dev/rwd0s1

brw-r----- 1 root operator 0, 131072 Oct 31 19:59 /dev/wd0s1

  虽然硬盘设备为块设备,用于随机存取的目的。但它也可以被顺序存取,这种方式称为raw方式。使用raw方式存取硬盘,就需要一个对应的字符类型的设备文件,对应wd0s1硬盘设备的字符类型硬盘设备为rwd0s1,设备名中第一个字母使用r表示对硬盘的raw方式顺序存取。

  由于设备文件就代表了整个设备,就可以使用FreeBSD的标准命令以raw方式直接操作设备文件,从而直接访问硬件设备。利用这种方式,能完成很多有用的工作,但是这种方式也非常危险,例如对硬盘设备文件的操作失误会破坏整个硬盘的数据。幸好大部分直接访问设备的操作都为读取相应数据的操作,而不需要写入磁盘设备。

  当某个设备不可使用,则其对应的设备文件也不能正常访问,因此直接访问设备文件可以判断对应的设备是否真正正常。例如,判断连接到第一个串口,ttyd0上的鼠标是否正常工作,使用命令 “cat </dev/ttyd 0” 来查看ttyd0上的输入数据,如果连接的有鼠标且工作正常,那么在移动鼠标的同时屏幕上就会显示出接收到的杂乱数据。如果没有反应,说明鼠标工作不正确。但这也可能是其他程序接管了这个设备,例如系统运行了moused。如果 moused控制了鼠标端口,那么 “cat < /dev/sysmouse” 会给出答案。

  cat或其他命令,没有控制具体接收到数据的多少,更有效的系统工具是dd,它能精确输入输出一定数量的数据。例如:# dd if=/dev/rwd0 of=mbr count=1 bs=512

  这将以512字节为单位,读取硬盘wd0上一个单位的数据,保存到名字为mbr的文件中,通常这是硬盘wd0 上的主引导扇区。

    * 终端设备

  终端设备文件为标识用户与系统连接的终端设备的设备文件,这是一种典型的字符设备文件。普通的终端一般使用串口和主机相连接,系统使用终端文件来描述这个连接的终端。通常第一个串口连接的设备为ttyd0(标准个人计算机第一个串口连接的常常是鼠标),第二个串口为ttyd1,依次类推。

  如果用户是使用telnet或其他远程登录的方式,那么系统使用一个伪设备文件与用户的伪终端相对应,这些伪终端设备文件为ttyp0到ttysv,ttyP0到ttySv。这样就能支持相当多用户同时登录系统。

  Unix是多用户、多任务系统,但是个人计算机仅仅有一个屏幕,熟练Unix用户喜欢同时进行几个工作,例如在一边下载文件,一边进行编程等,对于直接使用控制台的FreeBSD用户来讲,FreeBSD提供的虚拟终端能完美的解决这个问题。

  对于在控制台上的虚拟终端,对应的终端设备文件为ttyv0、ttyv1、ttyv3等,与键盘上的12个功能键相对应。控制台设备被系统用来输出很多必要的信息,包括各种登录信息等对系统安全非常相关的信息。由于在控制台上操作就是在个人计算机前面操作,因此通常在控制台上能完成许多在其他终端上不能完成的操作,例如:使用Ctrl+Alt+Del 重起系统等。为了保证系统安全,必须限制对控制台的物理访问。

  对于不在控制台的用户,就需要额外的应用程序的支持,在X终端上能使用X Window系统开出多个窗口,每个窗口对应一个伪终端。在字符终端上,也可以通过应用程序screen打开几个伪终端,但这需要安装相应的软件。这些伪终端都使用ttyp0等伪设备文件。

  与终端相关的另一个问题为不同的终端设备分为不同的终端类型,这是因为虽然终端是字符型设备,但又要求它能够具备更复杂的功能,例如进行全屏幕操作等。这样就要求终端设备能接受和识别一些控制字符,而不同的终端设备具备不同的控制字符。登录用户可以使用TERM环境变量来告诉应用程序当前使用的终端类型,常用的终端类型有vt100,ansi 等,FreeBSD控制台的终端类型为cons25,但是其他Unix中一般不识别这个类型,因此如果在FreeBSD 上通过telnet等连接到其他Unix上之后,应该改变TERM变量的值为ansi。

  在FreeBSD中,终端类别对应的控制字符使用termcap的方法定义,而System V中使用ter minfo的方式。所有的终端类型记录在/usr/share/misc/termcap文件中,并定义这些终端对应的控制字符。

  登录到系统之后,将有一个终端设备文件与用户的这个登录过程相联系。这个终端设备文件在控制台上登录时可能是 /dev/ttyv0,如果从网络上远程登录可能是/dev/ttyp0,但无论是那种情况,系统总使用/dev/t ty来代表用户当前使用的终端,直接访问/dev/tty将对当前的终端进行直接操作。

  除了这些与设备相联系的设备文件之外,还有一些特殊的设备文件。例如/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。下面使用dd命令将从zero设备中创建一个10K大小(bs决定每次读写1024字节,count定义读写次数为10次),但内容全为0的文件。

  # dd if=/dev/zero of=file count=10 bs=1024

  10+0 records in

  10+0 records out

  10240 bytes transferred in 0.001408 secs (7267903 b ytes/sec)

  另一个特殊设备文件为/dev/null,永远无法写满,写入的内容被系统立即丢弃。如果不想看到程序的输出,可以使用它作输出。

  # make world > /dev/null

  去除了屏幕输出,使整个程序执行过程非常平静。

    * 设备文件的创建

  通常情况下,安装系统时已经创建了常用的设备文件,可以直接访问这些设备文件来访问设备。但在用户重新定制内核,并添加了新硬件驱动程序之后,新驱动程序对应的设备文件就可能不存在。在FreeBSD中,最常见的例子就是在内核中增加声卡的驱动程序时,就需要创建相应设备文件。

  创建设备文件可以使用/dev目录下的shell程序MAKEDEV来完成,首先进入/dev目录,然后再执行MAKEDEV。

  # cd /dev

  # ./MAKEDEV snd0

  MAKEDEV将使用设备名作参数创建设备文件,同时也创建这个设备文件依赖的其他相关设备文件。MAKEDEV 的参数,并不一定为创建的设备文件名。例如建立 “MAKEDEV vty8” 将建立ttyv0到ttyv7共 8个设备文件,使用 “MAKEDEV wd1s1a” 命令,将建立wd1、wd1s1、wd1s2等,以及wd1s1a、wd1s1b 等设备文件。也可以使用all做MAKEDEV的参数,这将首先清除/dev目录下的所有设备文件,然后MAKEDEV创建所有预设的设备文件。一般情况下这将创建足够多的设备文件,其中的大部分设备文件在具体的系统中不会用得到。

  如果对一个系统中没有(或者内核没有探测到)的设备对应的设备文件进行操作,则系统返回Device not configured 的错误信息。

  MAKEDEV将使用mknod和对应设备的正确参数,包括字符或块设备、主设备号和从设备号来建立相应的设备文件。管理员也可以直接使用mknod创建设备文件,但这就必须将这些设备参数统统指定正确才行。因此除非对系统中的硬件驱动程序特别熟悉,一般不直接使用mknod来创建设备文件。

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

FreeBSD连载(17):安装文件系统

安装文件系统

  FreeBSD将文件保存在磁盘等存储设备上,由操作系统来具体处理访问硬件设备的问题,用户只需要面对操作系统,就能进行具体的文件操作。操作系统首先将用于存储的设备进行格式化之后,该设备才能用于存储文件,这个设备可以是软盘,可以是一个硬盘分区,或者其他允许随机存取的块设备存储介质。在Unix上将格式化后的存储设备统称为文件系统,格式化的过程称为创建文件系统。(由于磁带是一种顺序存取的设备,因此在磁带上不能创建文件系统。)

  对于不同介质、不同的操作系统对磁盘进行格式化和管理的方式也不同,这样就形成了不同类型的文件系统。但操作系统给用户提供了一种标准的通用存取方式,这样在存取文件时就不需要考虑是在对哪种文件系统进行操作。但是不同的文件系统仍然有一些差异,例如光盘文件系统是只读介质,还有一些文件系统并非为Unix系统而设计的,因此文件名、文件属性等标准就与Unix不同,FreeBSD在访问这些文件系统时尽量转换这些差别,补充这些文件系统没有、但Unix 标准文件系统需要的属性。这样这些文件系统就与标准文件系统看起来完全相同,只是某些操作受文件系统本身的物理限制,例如企图将光盘上文件加上写属性,显然无法完成。FreeBSD支持多种文件系统,其中最常见的有:

  UFS文件系统:是FreeBSD上的标准文件系统,它实现了所有的标准文件属性,如文件属主和组、存取权限等属性。

  cd9660文件系统:支持ISO 9660格式的CD-Rom,这种格式只支持8位基本长度3位扩展长度、不区分大小写的文件名,但FreeBSD支持它的Rock Ridge扩展,使其能使用Unix风格的长文件名。

  NFS文件系统:网络文件系统,通过它Unix能在网络上共享文件系统。

  msdos文件系统:DOS和Windows使用的FAT文件系统,基本上是使用8.3的文件名,Windows95 之后扩展了文件名的长度,但仍然不区分大小写。FreeBSD支持Windows95的长文件名扩展和FAT 32格式的分区。

  ext2fs文件系统:Linux使用的文件系统,这个类型不是缺省支持的文件系统,需要重新配置内核。

  NTFS文件系统:Windows NT使用的文件系统,这个类型同样需要重新配置内核。

  在个人计算机的硬盘管理方式中,文件是直接放在硬盘的分区中,而FreeBSD使用的UFS文件系统则又在基本分区中进行了划分,文件系统建立在BSD风格的子分区中。这样每个UFS分区中能有多个文件系统,每个文件系统或交换空间各有一个标签(DiskLabel),来标识其本身的起始和结束。当真正要使用文件系统时,就需要获得硬盘上文件系统(UFS分区和分区内部各个文件系统的DiskLabel)的具体信息。这些硬盘上文件系统的信息应该由管理员维护,同时也记录在硬盘上,可以使用FreeBSD中的系统工具fdisk和disklabel,或者安装程序Sysinstall ,来获得保存在硬盘本身中的信息。

  当使用Sysinstall中的Fdisk和Disklabel来分区和划分磁盘空间时,当用户完成操作之后,应该使用W命令将改变写入磁盘之后再退出Fdisk或Disklabel。

  与Sysinstall不同,命令行的fdisk和disklabel为交互模式,而非sysinstall 的全屏幕界面,因此较为难用一些。使用硬盘名称作为fdisk的参数,fdisk将报告硬盘上所有四个分区的详细信息:

# fdisk wd0

******Working on device /dev/rwd0 ******

parameters extracted 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)

 

Media sector size is 512

Warning: BIOS sector numbering starts with sector 1

Information from DOS bootblock is:

The data for partition 1 is:

sysid 6,(Primary ‘big’ DOS (>32MB))

   start 16065, size 2056320 (1004Meg), flag 80

      beg: cyl 1/ sector 1/ head 0;

      end: cyl 128/ sector 63/ head 254

The data for partition 2 is:

sysid 7,(OS/2 HPFS, QNX or Advanced UNIX)

   start 2072385, size 1044225 (509Meg), flag 0

      beg: cyl 1/ sector 1/ head 0;

      end: cyl 128/ sector 63/ head 254

The data for partition 3 is:

sysid 165,(FreeBSD/NetBSD/386BSD)

   start 3116610, size 2024190 (988Meg), flag 0

      beg: cyl 1/ sector 1/ head 0;

      end: cyl 128/ sector 63/ head 254

The data for partition 4 is:

sysid 5,(Extended DOS)

   start 5140800, size 3293325 (1608Meg), flag 0

      beg: cyl 1/ sector 1/ head 0;

      end: cyl 128/ sector 63/ head 254

  从这个fdisk的执行结果中可以看出这个硬盘的四个分区分别为不同的操作系统所占用,第一个分区为DOS基本分区,第二个标识为HPFS,事实上它是NTFS分区,第三个分区wd0s3为BSD分区,而第四个分区为扩展分区。因此就可以针对第三个FreeBSD系统分区,使用disklabel来检查其上的BSD子分区信息。

# disklabel  wd0s3

# /dev/rwd0s3c:

type: ESDI

disk: wd0s3

label:

flags:

bytes/sector: 512

sectors/track: 63

tracks/cylinder: 255

sectors/cylinder: 16065

cylinders: 126

sectors/unit: 2024190

rpm: 3600

interleave: 1

trackskew: 0

cylinderskew: 0

headswith: 0           # milliseconds

track-to-track seek: 0     # milliseconds

drivedata: 0

 

8 partitions:

#     size   offset   fstype  [fsize bsize bps/cpg]

  a:  65536      0    4.2BSD    0  0  0  # (cyl.  0 - 4*)

  b: 151248  65536      swap             # (cyl.  4*- 13*)

  c:2024190      0    unused    0  0  0  # (cyl.  0 - 125)

  e:  61440 216784    4.2BSD    0  0  0  # (cyl.  13*- 17*)

  f:1745966 278224    4.2BSD    0  0  0  # (cyl.  17*- 125*)

  可以看出disklabel除了显示各个子分区a-f之外,还显示了硬盘的参数。事实上BSD的分区管理工具要早于个人计算机的分区概念,而disklabel是BSD的分区管理工具,并不需要fdisk的帮助就能完成所有的磁盘管理操作。fdisk是用于将FreeBSD与其他操作系统进行兼容的目的,它是使用个人计算机分区概念的系统工具。如果一个硬盘不被其他个人计算机操作系统访问,完全可以抛弃fdisk,而仅仅使用disklabel和BSD传统风格的设备文件,来运行FreeBSD。

    * 文件系统的安装

  在存储设备上建立的文件系统必须安装到Unix目录树上,用户才能访问上面的文件。目录树只是一种逻辑概念,而具体的文件都保存在安装到目录树上的各个文件系统中。由于每个文件都保存的自己的目录中,这样目录中保存的是相对位置,一旦将一个文件系统安装到一个目录下,则这个文件系统中的所有文件和目录,都位于目录树中的这个目录的下方,可以选择将这个文件系统安装到不同的目录下。

  安装文件系统要使用命令mount,这个命令必须以root身份执行,例如安装光盘文件系统的命令(IDE光驱)使用:

# mount -t cd9660 /dev/wcd0c  /cdrom

  参数指明了不同的选项,-t后面跟文件系统的类型,这个命令中使用cd9660,用于光盘使用的ISO 9660 文件系统,同样也可以根据文件系统的不同而选用ufs、nfs、msdos等,其中ufs类型是缺省的文件系统类型;根据文件系统的类型不同,可使用的选项也不同。/dev/wcd0c是指定CD-Rom设备文件,也可以使用/dev/wcd0 来安装光盘,BSD的习惯做法是除了raw方式访问设备之外,最好使用子设备c来表示整个设备,主要原因是使用子设备c,那么就能通过访问分区的disklabel,来获得存储设备的信息,虽然现代BSD下这个因素的影响已经很小,但使用子设备更符合BSD习惯。/cdrom指定了安装目录,此后光盘上的所有文件都位于/cdrom目录下,但是在执行这个命令前必须创建这个/cdrom目录。

  Mount命令可以通过-o参数指定相关的安装选项,例如-o ro指定了使用只读(Read Only)选项,由于CD-Rom是只读介质,即使不使用这个选项指明这个介质是只读类型的,系统也会将这个文件系统设置为只读。对于以只读方式安装的文件系统,任何时候企图写这个目录下的文件都会得到错误信息。对于物理上可写的文件系统,可以使用ro选项将能保护数据不被改变,因而十分有用。

  同样安装一个DOS格式的软盘应该使用:

# mount -t msdos /dev/fd0 /floopy

如果安装顺利,则就可以访问这个软盘上的DOS文件了。同样也可以访问硬盘上FAT格式的文件系统,包括DOS基本分区和扩展分区上的逻辑盘(逻辑盘在FreeBSD下的设备文件从5开始,例如wd1扩展分区上的第一个逻辑盘为wd1s5)。

安装一个其他计算机通过NFS共享出的文件系统应该使用:

# mount -t nfs remote:/directory /mnt

  与安装其他文件系统的不同在于,本地硬盘上的文件系统使用设备文件,但NFS使用远程主机的名字和目录来确定文件系统的位置,其格式为主机名与该主机上目录名,中间使用 “:” 分隔开。

  将文件系统安装到目录上之后,使用这个介质上的文件就非常简单了。FreeBSD将假定存储设备将一直停留在这个安装位置上由系统使用,因此FreeBSD使用内存来为这些文件系统建立缓冲区,以最高效的使用文件系统,这种方式为异步模式的文件安装方式(async)。这样磁盘上的内容与内存中是非同步的,系统定期或在需要的时候,才去更新磁盘上的物理信息。(sync命令将强迫系统更新磁盘)这种非同步的方式就使得管理员要移去文件系统必须通过系统来完成卸载,而不应该直接取出(如软盘等可移动介质)。如果直接移去软盘,或者因为系统突然掉电而造成没有正确卸载文件系统,就会直接造成磁盘上的数据不正确,从而不得不使用fsck来检查和修复这些文件系统。也可以在执行mount命令的时候使用sync的安装选项,使硬盘数据和内存缓冲区保持同步,这样虽然降低了存取效率,但更适合对数据的完整性提出较高要求的系统。

  即使对于一个只读类型的介质,FreeBSD仍然使用这种控制机制,直到卸载才释放对文件系统的控制权。因此在FreeBSD下使用mount命令安装了光盘之后,光驱前面板上的eject键将不再起作用,直到将这个文件系统卸载下来。

  使用命令umount可以卸载一个安装到确定目录下的文件系统。

# umount /cdrom

  执行这个命令将文件系统与其安装到的目录相脱离,对于异步模式安装的文件系统还将同步缓冲区和磁盘上的数据。以后该目录就能用来安装另一个文件系统了。而直到此时才能使用eject键退出光盘,更换或拿开盘片。

# cd /cdrom

# umount /cdrom

umount: /cdrom : Device busy

# cd /

# umount /cdrom

  在执行这个命令时如果系统报告 “Device busy” 错误信息,说明有其他程序仍然正在使用这个文件系统中的文件,很可能是某个shell的当前路径仍然位于这个文件系统的目录中,造成这个文件系统的目录文件没有关闭。检查所有的登录界面,保证没有shell的当前目录在/cdrom的目录下。

    * 设置fstab文件

  在系统启动时,系统将自动安装上必需的文件系统。而管理员所要做的是告诉FreeBSD应该安装那个文件系统、安装到那个目录上和有关安装参数选项。所有的这些信息都必须写入文件/etc/fstab中。在安装FreeBSD 时,这个文件已经具有必要的文件系统了,此后所需要作的只是这个文件中再增加其他的文件系统。

# 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/wcd0c       /cdrom       cd9660  ro,noauto   0     0

/dev/wd0s1       /dos         msdos   rw,noauto   0     1

  这个文件中的每一行为一种文件系统或交换设备定义对应的设备文件及安装选项。其中根文件系统具备一定的特殊之处,因为这个文件/etc/fstab以及FreeBSD的内核文件,其实是在根文件系统中的,因此系统必须首先安装了根文件系统,才能正常访问这些文件。事实上根文件系统在FreeBSD内核中已经有了设置,启动时先以只读方式安装根文件系统,并读取根文件系统中相关文件的内容,然后再根据文件内容装载各个文件系统。

  这个文件的第一列为设备文件名字,或者NFS使用的远程文件系统的名字。第二列为文件系统的安装位置,第三列为文件系统的类型,其中UFS是FreeBSD使用的标准本地文件系统的类型,procfs是FreeBSD用于管理进程的进程文件系统。第四列为安装的选项,rw表示该文件系统能进行读写操作,ro表示该文件系统是只读的,sw用于交换分区,noauto表示启动时并不立即安装这个文件系统,而是由管理员在以后手工安装。第五列和第六列的数字是系统程序dump和fsck程序使用的标志,通常不需要改变,这个标志对根文件系统都是1,而对其他UFS类型的文件系统都是2,其他类型的文件系统为0。

  注意,由于fstab文件非常重要,如果这个文件有错误,就有可能造成系统不能正常启动,因此向fstab添加数据应非常小心。不是必须安装的文件系统就不应该进行自动装载,例如上面将CDROM对应的行参数设置为noauto ,表示这个文件系统不是启动时自动装载的系统。

  在使用了fstab文件之后,mount命令的写法就可以简化了。mount命令将查看fstab文件中的内容以进行匹配,来选定正确的参数。例如,使用下列命令均可以安装上CD-Rom。

# mount /dev/wcd0c /cdrom

# mount /dev/wcd0c

# mount /cdrom

  在安装了文件系统之后,可以使用不加参数的mount命令或df命令查看当前已安装的文件系统信息。

# mount

/dev/wd0s3a on / (local, writes: sync 117 async 796)

/dev/wd0s3f on /usr (local, writes: sync 1189 async 4948)

/dev/wd0s3e on /var (local, writes: sync 362 async 1354)

procfs on /proc (local)

/dev/wd1s2e on /disk2 (local, writes: sync 4 async 41)

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

FreeBSD连载(18):软盘操作

软盘操作

  FreeBSD支持软盘操作,虽然当前计算机上软盘的重要性已经大大减小,但在少量传送数据时,软盘仍不失为一种有效的工具。在软盘上可以使用UFS文件系统或msdos文件系统。

  在软盘上建立UFS文件系统,便需要使用fdformat作软盘的低级格式化,使用disklabel建立文件系统的标签,然后使用newfs初始化文件系统,最后才使用mount将它安装到目录树上:


# fdformat /dev/rfd0

Format 1440K floppy `/dev/rfd0'? (y/n): y

Processing VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV done.

# disklabel -r -w fd0 fd1440

# newfs /dev/rfd0

Warning: Block size restricts cylinders per group to 6.

Warning: 1216 sector(s) in last cylinder unallocated

/dev/rfd0:      2880 sectors in 1 cylinders of 1 tracks, 4096 sectors

        1.4MB in 1 cyl groups (6 c/g, 12.00MB/g, 736 i/g)

super-block backups (for fsck -b #) at:

32,

# mount /dev/fd0 /A

  当操作完毕之后必须使用umount /A卸载软盘。

  也可以直接安装和卸载已有的msdos格式的软盘,并进行访问。


# mount -t msdos /dev/fd0 /A

# ls /A

# umount /A

  使用mtools工具能在软盘上建立msdos文件系统,并进行访问,此时软盘设备并没有安装到目录树上, mtools是使用raw方式对软盘进行访问的。mtools的命令与对应的DOS命令用法相同,只是每个命令以m开头,并且都是小写形式。如mdir对应DOS下的DIR命令,mcd对应DOS下的CD命令,mcopy对应DOS下的 COPY,并且能在FreeBSD的文件系统与DOS的软盘之间传递文件,等等。


# mformat A:

# mdir A:

# mcopy hello.c  A:

  但是DOS的文本格式和Unix是不同的,Unix下只使用换行字符来表示换行,而DOS下同时使用换行和回车字符。因此如果将DOS的文件复制到Unix下时,有时候会造成一些小麻烦。如果在vi下打开这种文件,可能会看到这样结果:


main(){ ^M

printf(“Hello! World!”); ^M

}^M

  ^M代表换行字符,在mcopy中加上-t参数,就可以消除在不同文件系统之间复制文件时的这些问题。如果对已有的文件去除换行字符,可以直接在vi中使用模式替换将这个特殊字符消除(使用^V^M来表示这个特殊字符,即在按下Ctrl键的同时输入V和M),或者使用tr命令:

$ tr -d “\015” < hello.c > hello.unix.c

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

本版积分规则

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