linux 学习

转帖自  http://space.itpub.net/439945/viewspace-448788

 

鸟哥的linux私房菜(基础学习篇)

linux文件、目录与磁盘格式

硬盘与硬件管理

学习shell

linux用户管理

linux系统管理员

 

 

鸟哥的linux私房菜(基础学习篇)

 

1.概述:
linux就只是一个内核(就是控制硬件的东西),它提供了一个完整操作系统中最底层的硬件控制与资源管理的完整架构.

有些公司将一些需要的软件套件装载到linux核心程序中,并且以光盘发行,这种光盘数据就是发行版,即俗称的"distribution"

2.硬盘代号
A.硬件与硬件代号:

         硬件设备               在linux中的代号

         IDE硬盘                 /dev/hd[a-d] (方括号内的字母为a-d的任何一个,表示/dev/hda,/dev/hdb等等)

        SCSI硬盘               /dev/sd[a-p]

        光驱                        /dev/cdrom

        打印机                   /dev/lp

        鼠标                        /dev/mouse

        磁盘                     /dev/ht0 (IDE) or /dev/st0(SCSI)

        网卡                       /dev/ethn(n从0开始)


   B.硬盘数据线与硬盘代号
    通常在586之后生产的主机板上都有两条数据线的接口(数据线就是用来连接硬盘与主机板的东西),我们称这种接口为IDE接口,这也是目前的主流硬盘接口,为了区分硬盘读取的先后顺序,主机板上的这两个接口分别被称为Primary(主要的)与Secondary(次要的)。如果您仔细观察,每一条数据线上还有两个插孔,也就是说一条数据线可以接两个IDE接口的设备(硬盘或光驱),而您有两条数据线,因此一个主机板在默认情况下,应该可以接4个IDE接口的设备。好了,那么如何判别哪一个数据线是主硬盘(Master),哪一个是从硬盘(Slave)呢?这时就需要调整硬盘上的跳针(jump)才可以知道。请查看您的硬盘驱动器,上面应该会有图示说明。
    所以,如果我有一个光驱,那么在我的主机上最多只能再安装3块IDE接口的硬盘。由于我的硬盘与Linux的硬盘代号有关,我怎么知道这个硬盘代号呢?先从IDE 1(Primary IDE)的主硬盘计算,最后是IDE 2的从硬盘,所以各个硬盘的代号如表3.1所示。
  
 IDE / Jumper  IDE 1(Primary)  IDE 2(Secondary)
 主硬盘           /dev/hda  /dev/hdc
 从硬盘           /dev/hdb  /dev/hdd

3.主机硬盘的主要规划

 A: 最简单的分区模式:
  linux安装的过程中,至少要有两个分区才行,一个是根目录,",",一个是虚拟内存"Swap",(大小一般为机器物理内存的一倍或两倍就行了),另一个比较重要的是/boot。grub启动时需要的文件都在/ b o o t 目录。这样就算工作分区出了问题,只要这个分区没有问题,同样可以启动.

B: MBR
     硬盘分为两个区域:MBR,放置实际数据文件的地方
 MBR(Master Boot Recorder)主引导扇区,放置硬盘的信息。MBR 可以说是整个硬盘最重要的地方了,因为在 MBR 里面记录了两个重要的东西,分别是:开机管理程序,与磁盘分区表 ( partition table )。所以我们所做的硬盘分区,也就是在修改partition table。 由于这个 MBR 区块的容量有限,所以,当初设计的时候,就只有设计成 4 个分区纪录,这些分区记录就被称为 Primary ( 主分区 ) 及 Extended ( 扩展分区 ) ,也就是说,一颗硬盘最多可以有 4 个 Primary + Extended 的扇区,其中,Extended 只能有一个,因此,你如果要分区成四块磁盘分区的话,那么最多就是可以:

P + P + P + P

P + P + P + E

的情况来分区了。需要特别留意的是,如果上面的情况中, 3P +E 只有三个『可用』的磁盘,如果要四个都『可用』,就得分区成 4P 了!( 因为 Extended 不能直接被使用,还需要分区成 Logical 才行)
思考一:如果我要将我的大硬盘暂时分区成四个 partition ,同时,还有其它的空间可以让我在未来的时候进行规划,那么该如何分区?

由刚刚的说明,我们可以知道, Primary + Extended 最多只能有四个 partition,而如果要超过 5 个 partition 的话,那么就需要 Extended 的帮忙。因此,在这个例子中,我们千万不能分区成四个 Primary 为什么呢?假如您是一个 20 GB 的硬盘,而 4 个 primary 共用去了 15 GB ,您心想还有 5 GB 可以利用对吧?错!剩下的 5 GB 完全不能使用,这是因为已经没有多余的 partition table 纪录区可以记录了,因此也就无法进行额外的分区,当然啰,空间也就被浪费掉了!因此,请千万注意,如果您要分区超过 4 槽以上时,请记得一定要有 Extended 分区区,而且必须将所有剩下的空间都分配给 Extended ,然后再以 logical 的分区区来规划 Extended 的空间。

思考二:我可不可以仅分区 1 个 Primary 与 1 个 Extended 呢?

当然可以!基本上, Logical 可以有 64 个,因此,你可以仅分区一个主分区,并且将所有其它的分区都给 Extended ,利用 Logical 分区来进行其它的 partition 规划即可!

思考三:假如我的硬盘安装在 IDE 1 的 Master ,并且我想要分区成 6 个可以使用的硬盘扇区,那么每个磁盘在 Linux 底下的代号为何?

说明:

由于硬盘在 Primary + Extended 最多可以有四个,因此,在 Linux 底下,已经将 partition table 1 ~ 4 先留下来了,如果只用了 2 个 P + E 的话,那么将会空出两个 partition number 呦!再详细的说明一下,假设我将四个 P + E 都用完了。其中Extended /dev/hda4包括三个逻辑分区。

实际可以使用的是 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5, /dev/hda6, /dev/hda7 这六个 partition!至于 /dev/hda4 这个 Extended 扇区本身仅是用来规划出让 Logical 可以利用的磁盘空间而已!

那么万一我只想要分区 1 个 Primary 与 1 个 Extended 呢?

因为 1~4 号已经被预留下来了,所以第一个 Logical 的代号由 5 号开始计算起来,而后面在被规划的,就以累加的方式增加磁盘代号啰!而其中 /dev/hda3, /dev/hda4 则是空的,被保留下来的代号。


4.开关机及指令输入
A.字符启动界面


第一行显示的是linux发行商与发布的版本
第二行显示的是linux核心版本以及硬件等级
第三行显示主机名称,login后需要你输入登陆用户的帐号
第四行在第三行输入后才有,让你输入密码,但是在你输入密码时,界面不会出现任何字样
第五行是上次登陆的时间和终端。
第六行是正确登陆后的才有的信息,最左边的是当前用户的帐号,@连接的是主机名称,~指当前所在目录,

B.图形和字符界面的切换

Ctrl   +   Alt   +   F1...F6这是Text界面,Ctrl   +   Alt   +   F7是XWindows界面

从文字界面切换到图形界面,在命令行界面输入startx,前提是 XFree86需要设置OK.

修改预设的启动界面,修改/etc/inittab文件

里的id:5:initdefault:(图形)为id:3:initdefault:(字符)

B.指令的输入

[root@test root]#command [-options] parameter1 parameter2...
                  指令    选项       参数1       参数2


说明:1.指令和参数区分大小写
     2.command为实际的指令名称,例如cd ,ls等
     3.在选项中,中括号是不必要的,在进行参数设定时,通常为"-"号,若为完整的参数名称,则输入"--"符号
     4. parameter1 parameter2为option后面的参数或是command的参数
     5.指令太长时,可以使用"/"符号是指令连接到下一行


   ctrl+c 在linux下,是指中断当前程序
   q是很多指令定义的退出键

      C:在线求助man命令解析

     [vbird@www ~]$ man date
DATE(1)                          User Commands                         DATE(1)
# 請注意上面這個括號內的數字
NAME  <==這個指令的完整全名,如下所示為date且說明簡單用途為設定與顯示日期/時間
       date - print or set the system date and time

SYNOPSIS  <==這個指令的基本語法如下所示
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION  <==詳細說明剛剛語法談到的選項與參數的用法
       Display  the  current  time  in  the given FORMAT, or set the system
       date.

       -d, --date=STRING  <==左邊-d為短選項名稱,右邊--date為完整選項名稱
              display time described by STRING, not 'now'

       -f, --file=DATEFILE
              like --date once for each line of DATEFILE

       -r, --reference=FILE
              display the last modification time of FILE
....(中間省略)....
       # 找到了!底下就是格式化輸出的詳細資料!
       FORMAT controls the output.  The only valid option  for  the  second
       form  specifies  Coordinated  Universal Time.  Interpreted sequences
       are:

       %%     a literal %

       %a     locale's abbreviated weekday name (e.g., Sun)

       %A     locale's full weekday name (e.g., Sunday)
....(中間省略)....
ENVIRONMENT  <==與這個指令相關的環境參數有如下的說明
       TZ     Specifies the timezone, unless  overridden  by  command  line
              parameters.   If  neither  is  specified,  the  setting  from
              /etc/localtime is used.

AUTHOR  <==這個指令的作者啦!
       Written by David MacKenzie.

REPORTING BUGS  <==有問題請留言給底下的email的意思!
       Report bugs to <bug-coreutils@gnu.org>.

COPYRIGHT  <==受到著作權法的保護!用的就是 GPL 了!
       Copyright ? 2006 Free Software Foundation, Inc.
       This is free software.  You may redistribute copies of it under  the
       terms      of      the      GNU      General      Public     License
       <http://www.gnu.org/licenses/gpl.html>.  There is  NO  WARRANTY,  to
       the extent permitted by law.

SEE ALSO  <==這個重要,你還可以從哪裡查到與date相關的說明文件之意
       The  full  documentation for date is maintained as a Texinfo manual.
       If the info and date programs are properly installed at  your  site,
       the command

              info date

       should give you access to the complete manual.

date 5.97                          May 2006                            DATE(1)


   
  DATE(1)                          User Commands                         DATE(1)中括号中的数字1指一般使用者可使用的指令

常見的幾個數字的意義是這樣的:

代號 代表內容
1 使用者在shell環境中可以操作的指令或可執行檔
2 系統核心可呼叫的函數與工具等
3 一些常用的函數(function)與函式庫(library),大部分為C的函式庫(libc)
4 裝置檔案的說明,通常在/dev下的檔案
5 設定檔或者是某些檔案的格式
6 遊戲(games)
7 慣例與協定等,例如Linux檔案系統、網路協定、ASCII code等等的說明
8 系統管理員可用的管理指令
9 跟kernel有關的文件

舉例來說,如果你下達了『man null』時,會出現的第一行是:『NULL(4)』,對照一下上面的數字意義, 嘿嘿!原來null這個玩意兒竟然是一個『裝置檔案』呢!很容易瞭解了吧!

D:shutdown,reboot,sync,halt


shutdown [-cfFhknr(参数名称)] [-t 秒数] 时间 [警告信息]


具体各参数功能:


-c 取消前一个shutdown命令。值得注意的是,当执行一个如“shutdown -h 11:10”的命令时,只要按“Ctrl+C”键就可以中断关机的命令。若是执行如“shutdown -h 11:10 & ” 的 命 令 将 shutdown转到后台时,则需要使用shutdown -c将前一个shutdown命令取消。


-f 重新启动时不执行fsck(注:fsck是Linux下的一个检查和修复文件系统的程序)。


-F 重新启动时执行fsck。


-h 将系统关机,在某种程度上功能与halt命令相当。


-k 只是送出信息给所有用户,但并不会真正关机。


-n 不调用init程序关机,而是由shutdown自己进行(一般关机程序是由shutdown调用init来实现关机动作),使用此参数将加快关机速度,但是不建议用户使用此种关机方式。


-r shutdown之后重新启动系统。


-f<秒数> 送出警告信息和关机信号之间要延迟多少秒。警告信息将提醒用户保存当前进行的工作。


[时间] 设置多久时间后执行shutdown命令。时间参数有hh:mm或+m两种模式。hh:mm格式表示在几点几分执行shutdown命令。例如 “shutdown 10:45”表示将在10:45执行shutdown。+m表示m分钟后执行shutdown。比较特别的用法是以now表示立即执行shutdown。 值得注意的是这部分参数不能省略。


[警告信息] 要传送给所有登入用户的信息。


应用举例:


指定现在立即关机: # shutdown -h now


指定5分钟后关机,同时送出警告信息给登入用户:# shutdown +5 “System will shutdown after 5 minutes”


halt----最简单的关机命令
   其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。
   参数说明:
   [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
   [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
   [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
   [-f] 没有调用shutdown而强制关机或重启。
   [-i] 关机〔或重启〕前﹐关掉所有的网络接口。
   [-p] 该选项为缺省选项。就是关机时调用poweroff。


sync指令是数据回填指令

reboot是重启指令

1.概述:
linux就只是一个内核(就是控制硬件的东西),它提供了一个完整操作系统中最底层的硬件控制与资源管理的完整架构.

有些公司将一些需要的软件套件装载到linux核心程序中,并且以光盘发行,这种光盘数据就是发行版,即俗称的"distribution"

2.硬盘代号
A.硬件与硬件代号:

         硬件设备               在linux中的代号

         IDE硬盘                 /dev/hd[a-d] (方括号内的字母为a-d的任何一个,表示/dev/hda,/dev/hdb等等)

        SCSI硬盘               /dev/sd[a-p]

        光驱                        /dev/cdrom

        打印机                   /dev/lp

        鼠标                        /dev/mouse

        磁盘                     /dev/ht0 (IDE) or /dev/st0(SCSI)

        网卡                       /dev/ethn(n从0开始)


   B.硬盘数据线与硬盘代号
    通常在586之后生产的主机板上都有两条数据线的接口(数据线就是用来连接硬盘与主机板的东西),我们称这种接口为IDE接口,这也是目前的主流硬盘接口,为了区分硬盘读取的先后顺序,主机板上的这两个接口分别被称为Primary(主要的)与Secondary(次要的)。如果您仔细观察,每一条数据线上还有两个插孔,也就是说一条数据线可以接两个IDE接口的设备(硬盘或光驱),而您有两条数据线,因此一个主机板在默认情况下,应该可以接4个IDE接口的设备。好了,那么如何判别哪一个数据线是主硬盘(Master),哪一个是从硬盘(Slave)呢?这时就需要调整硬盘上的跳针(jump)才可以知道。请查看您的硬盘驱动器,上面应该会有图示说明。
    所以,如果我有一个光驱,那么在我的主机上最多只能再安装3块IDE接口的硬盘。由于我的硬盘与Linux的硬盘代号有关,我怎么知道这个硬盘代号呢?先从IDE 1(Primary IDE)的主硬盘计算,最后是IDE 2的从硬盘,所以各个硬盘的代号如表3.1所示。
  
 IDE / Jumper  IDE 1(Primary)  IDE 2(Secondary)
 主硬盘           /dev/hda  /dev/hdc
 从硬盘           /dev/hdb  /dev/hdd

3.主机硬盘的主要规划

 A: 最简单的分区模式:
  linux安装的过程中,至少要有两个分区才行,一个是根目录,",",一个是虚拟内存"Swap",(大小一般为机器物理内存的一倍或两倍就行了),另一个比较重要的是/boot。grub启动时需要的文件都在/ b o o t 目录。这样就算工作分区出了问题,只要这个分区没有问题,同样可以启动.

B: MBR
     硬盘分为两个区域:MBR,放置实际数据文件的地方
 MBR(Master Boot Recorder)主引导扇区,放置硬盘的信息。MBR 可以说是整个硬盘最重要的地方了,因为在 MBR 里面记录了两个重要的东西,分别是:开机管理程序,与磁盘分区表 ( partition table )。所以我们所做的硬盘分区,也就是在修改partition table。 由于这个 MBR 区块的容量有限,所以,当初设计的时候,就只有设计成 4 个分区纪录,这些分区记录就被称为 Primary ( 主分区 ) 及 Extended ( 扩展分区 ) ,也就是说,一颗硬盘最多可以有 4 个 Primary + Extended 的扇区,其中,Extended 只能有一个,因此,你如果要分区成四块磁盘分区的话,那么最多就是可以:

P + P + P + P

P + P + P + E

的情况来分区了。需要特别留意的是,如果上面的情况中, 3P +E 只有三个『可用』的磁盘,如果要四个都『可用』,就得分区成 4P 了!( 因为 Extended 不能直接被使用,还需要分区成 Logical 才行)
思考一:如果我要将我的大硬盘暂时分区成四个 partition ,同时,还有其它的空间可以让我在未来的时候进行规划,那么该如何分区?

由刚刚的说明,我们可以知道, Primary + Extended 最多只能有四个 partition,而如果要超过 5 个 partition 的话,那么就需要 Extended 的帮忙。因此,在这个例子中,我们千万不能分区成四个 Primary 为什么呢?假如您是一个 20 GB 的硬盘,而 4 个 primary 共用去了 15 GB ,您心想还有 5 GB 可以利用对吧?错!剩下的 5 GB 完全不能使用,这是因为已经没有多余的 partition table 纪录区可以记录了,因此也就无法进行额外的分区,当然啰,空间也就被浪费掉了!因此,请千万注意,如果您要分区超过 4 槽以上时,请记得一定要有 Extended 分区区,而且必须将所有剩下的空间都分配给 Extended ,然后再以 logical 的分区区来规划 Extended 的空间。

思考二:我可不可以仅分区 1 个 Primary 与 1 个 Extended 呢?

当然可以!基本上, Logical 可以有 64 个,因此,你可以仅分区一个主分区,并且将所有其它的分区都给 Extended ,利用 Logical 分区来进行其它的 partition 规划即可!

思考三:假如我的硬盘安装在 IDE 1 的 Master ,并且我想要分区成 6 个可以使用的硬盘扇区,那么每个磁盘在 Linux 底下的代号为何?

说明:

由于硬盘在 Primary + Extended 最多可以有四个,因此,在 Linux 底下,已经将 partition table 1 ~ 4 先留下来了,如果只用了 2 个 P + E 的话,那么将会空出两个 partition number 呦!再详细的说明一下,假设我将四个 P + E 都用完了。其中Extended /dev/hda4包括三个逻辑分区。

实际可以使用的是 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5, /dev/hda6, /dev/hda7 这六个 partition!至于 /dev/hda4 这个 Extended 扇区本身仅是用来规划出让 Logical 可以利用的磁盘空间而已!

那么万一我只想要分区 1 个 Primary 与 1 个 Extended 呢?

因为 1~4 号已经被预留下来了,所以第一个 Logical 的代号由 5 号开始计算起来,而后面在被规划的,就以累加的方式增加磁盘代号啰!而其中 /dev/hda3, /dev/hda4 则是空的,被保留下来的代号。


4.开关机及指令输入
A.字符启动界面


第一行显示的是linux发行商与发布的版本
第二行显示的是linux核心版本以及硬件等级
第三行显示主机名称,login后需要你输入登陆用户的帐号
第四行在第三行输入后才有,让你输入密码,但是在你输入密码时,界面不会出现任何字样
第五行是上次登陆的时间和终端。
第六行是正确登陆后的才有的信息,最左边的是当前用户的帐号,@连接的是主机名称,~指当前所在目录,

B.图形和字符界面的切换

Ctrl   +   Alt   +   F1...F6这是Text界面,Ctrl   +   Alt   +   F7是XWindows界面

从文字界面切换到图形界面,在命令行界面输入startx,前提是 XFree86需要设置OK.

修改预设的启动界面,修改/etc/inittab文件

里的id:5:initdefault:(图形)为id:3:initdefault:(字符)

B.指令的输入

[root@test root]#command [-options] parameter1 parameter2...
                  指令    选项       参数1       参数2


说明:1.指令和参数区分大小写
     2.command为实际的指令名称,例如cd ,ls等
     3.在选项中,中括号是不必要的,在进行参数设定时,通常为"-"号,若为完整的参数名称,则输入"--"符号
     4. parameter1 parameter2为option后面的参数或是command的参数
     5.指令太长时,可以使用"/"符号是指令连接到下一行


   ctrl+c 在linux下,是指中断当前程序
   q是很多指令定义的退出键

      C:在线求助man命令解析

     [vbird@www ~]$ man date
DATE(1)                          User Commands                         DATE(1)
# 請注意上面這個括號內的數字
NAME  <==這個指令的完整全名,如下所示為date且說明簡單用途為設定與顯示日期/時間
       date - print or set the system date and time

SYNOPSIS  <==這個指令的基本語法如下所示
       date [OPTION]... [+FORMAT]
       date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION  <==詳細說明剛剛語法談到的選項與參數的用法
       Display  the  current  time  in  the given FORMAT, or set the system
       date.

       -d, --date=STRING  <==左邊-d為短選項名稱,右邊--date為完整選項名稱
              display time described by STRING, not 'now'

       -f, --file=DATEFILE
              like --date once for each line of DATEFILE

       -r, --reference=FILE
              display the last modification time of FILE
....(中間省略)....
       # 找到了!底下就是格式化輸出的詳細資料!
       FORMAT controls the output.  The only valid option  for  the  second
       form  specifies  Coordinated  Universal Time.  Interpreted sequences
       are:

       %%     a literal %

       %a     locale's abbreviated weekday name (e.g., Sun)

       %A     locale's full weekday name (e.g., Sunday)
....(中間省略)....
ENVIRONMENT  <==與這個指令相關的環境參數有如下的說明
       TZ     Specifies the timezone, unless  overridden  by  command  line
              parameters.   If  neither  is  specified,  the  setting  from
              /etc/localtime is used.

AUTHOR  <==這個指令的作者啦!
       Written by David MacKenzie.

REPORTING BUGS  <==有問題請留言給底下的email的意思!
       Report bugs to <bug-coreutils@gnu.org>.

COPYRIGHT  <==受到著作權法的保護!用的就是 GPL 了!
       Copyright ? 2006 Free Software Foundation, Inc.
       This is free software.  You may redistribute copies of it under  the
       terms      of      the      GNU      General      Public     License
       <http://www.gnu.org/licenses/gpl.html>.  There is  NO  WARRANTY,  to
       the extent permitted by law.

SEE ALSO  <==這個重要,你還可以從哪裡查到與date相關的說明文件之意
       The  full  documentation for date is maintained as a Texinfo manual.
       If the info and date programs are properly installed at  your  site,
       the command

              info date

       should give you access to the complete manual.

date 5.97                          May 2006                            DATE(1)


   
  DATE(1)                          User Commands                         DATE(1)中括号中的数字1指一般使用者可使用的指令

常見的幾個數字的意義是這樣的:

代號 代表內容
1 使用者在shell環境中可以操作的指令或可執行檔
2 系統核心可呼叫的函數與工具等
3 一些常用的函數(function)與函式庫(library),大部分為C的函式庫(libc)
4 裝置檔案的說明,通常在/dev下的檔案
5 設定檔或者是某些檔案的格式
6 遊戲(games)
7 慣例與協定等,例如Linux檔案系統、網路協定、ASCII code等等的說明
8 系統管理員可用的管理指令
9 跟kernel有關的文件

舉例來說,如果你下達了『man null』時,會出現的第一行是:『NULL(4)』,對照一下上面的數字意義, 嘿嘿!原來null這個玩意兒竟然是一個『裝置檔案』呢!很容易瞭解了吧!

D:shutdown,reboot,sync,halt


shutdown [-cfFhknr(参数名称)] [-t 秒数] 时间 [警告信息]


具体各参数功能:


-c 取消前一个shutdown命令。值得注意的是,当执行一个如“shutdown -h 11:10”的命令时,只要按“Ctrl+C”键就可以中断关机的命令。若是执行如“shutdown -h 11:10 & ” 的 命 令 将 shutdown转到后台时,则需要使用shutdown -c将前一个shutdown命令取消。


-f 重新启动时不执行fsck(注:fsck是Linux下的一个检查和修复文件系统的程序)。


-F 重新启动时执行fsck。


-h 将系统关机,在某种程度上功能与halt命令相当。


-k 只是送出信息给所有用户,但并不会真正关机。


-n 不调用init程序关机,而是由shutdown自己进行(一般关机程序是由shutdown调用init来实现关机动作),使用此参数将加快关机速度,但是不建议用户使用此种关机方式。


-r shutdown之后重新启动系统。


-f<秒数> 送出警告信息和关机信号之间要延迟多少秒。警告信息将提醒用户保存当前进行的工作。


[时间] 设置多久时间后执行shutdown命令。时间参数有hh:mm或+m两种模式。hh:mm格式表示在几点几分执行shutdown命令。例如 “shutdown 10:45”表示将在10:45执行shutdown。+m表示m分钟后执行shutdown。比较特别的用法是以now表示立即执行shutdown。 值得注意的是这部分参数不能省略。


[警告信息] 要传送给所有登入用户的信息。


应用举例:


指定现在立即关机: # shutdown -h now


指定5分钟后关机,同时送出警告信息给登入用户:# shutdown +5 “System will shutdown after 5 minutes”


halt----最简单的关机命令
   其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。
   参数说明:
   [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
   [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
   [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
   [-f] 没有调用shutdown而强制关机或重启。
   [-i] 关机〔或重启〕前﹐关掉所有的网络接口。
   [-p] 该选项为缺省选项。就是关机时调用poweroff。


sync指令是数据回填指令

reboot是重启指令

 

 

 

 

linux文件、目录与磁盘格式

 

1.linux 文件权限

    -rw-r--r--   1 root root      915  4月 25 14:58 100

   解释:
    A.-rw-r--r--  代表文件属性  一共十个属性

     第1列是文件的属性:

    d:表示是一个目录,目录是一个特殊的文件。

    -:表示这是一个普通的文件。

    l: 表示这是一个符号链接文件,实际上它指向另一个文件。

    b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件。

    s、p:这些文件关系到系统的数据结构和管道,通常很少见到。
  
     第2-10列是三个属性为一组,一共三组,代表用户对这个文件的权限

     r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。

     w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

     x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
    
     -:表示不具有该项权限

     2-4列是拥有者权限,即owner,
     5-7列是群组权限,即group
     8-10列是非本群组的用户权限,others
  
     下面举例说明:
     
       -rwx------: 文件所有者对文件具有读取、写入和执行的权限。

      -rwxr—r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。

      -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
  
     注意:这里x与目录的关系相当重要,如果你在该目录下不能执行任何指令,那么自然就无法ls,cd等指令,当然就无法进入目录.因此,如果 你想开放某个目录,那么请将该目录的x属性也打开.
         另外,liunx下文件是否能执行是由x属性来决定的,跟文件的后缀名没什么关系


    
      B. 1
     这一栏表示链接数(如果是目录,通常与该目录下的子目录数有关)

      C: root  root
     这两栏前一个代表文件或目录的拥有者,后一个表示拥有者的群组

      D:915
      这一栏表示文件的大小
 
      E:4 月25 14:58
      这一栏表示文件的建档时间或最近的修改时间
     
      F:100
      这一栏表示文件名,如果文件名前面多一个".",那么表示这个文件为隐藏文件.在ls -al显示出来,如果无a参数,文件名带有"."的文件是无法显示出来的


   表示目录所有者本身具有所有权限,其他用户无法进入该目录。执行mkdir命令所创建的目录,其默认权限为rwxr-xr-x,用户可以根据需要修改目录的权限。
   此外,默认的权限可用umask命令修改,用法非常简单,只需执行umask 777 命令,便代表屏蔽所有的权限,因而之后建立的文件或目录,其权限都变成000,依次类推。通常root帐号搭配umask命令的数值为022、027和077,普通用户则是采用002,这样所产生的权限依次为755、750、700、775

    

    2.改变文件的权限
   A.改变群组 chgrp(change group)


    B.改变拥有者 chown(change owner) 加上-R参数修改目录下的所有子目录或文件的拥有者


    C.改变权限  chmod -R xyz 文件或目录
    文件和目录的权限表示,是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。

   r: 对应数值4

   w: 对应数值2

   x:对应数值1

   -:对应数值0

  将同一组的数字相加,即可得到数字表示

  如有一个文件的权限属性为-rwxr-x---
    即有rwx=4+2+1=7
    r-x=4+0+1=5
    ---=0+0+0=0
那么这个文件的权限数字表示法为750

 也可根据符号类型来改变文件形态
  按照顺序,三个一组即可得到user,group,others三组,可以用u,g,o来表示3个组的属性,a即all可表示全部三组,
 范例 :将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt

将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt

将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt

将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py

将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *

+表示增加权限
-表示删除权限


  3.文件格式和文件种类
  
   linux能否支持某个文件格式与核心是否将其编译进去有关,在/lib/modules/`uname -r`/kernel/fs里面看有相应的文件格式

   ext3作为linux的文件格式 :

   最近发布的Linux版本大多已经默认采用ext3或reiserfs这种具有日志式管理的文件系统了。

什么是日志式文件系统呢?或者,ext3与ext2有什么不同?ext3其实只是多做了一个日志式数据的记录。要将数据写入硬盘时,ext2是直接将数据写入,但ext3则会将这个“要开始写入”的信息写入日志式记录区,然后才开始写入数据。在数据写入完毕后,又将“完成写入动作”的信息写入日志式记录区,这有什么好处呢?最大的好处就是数据的完整性与“恢复力”。

什么是“恢复力”呢?早期的ext2文件系统如果遇到断电,文件系统就要检查文件一致性。这个检查过程要将整个分区内的文件进行完整的比较,很慢,时间很久。如果是ext3,那么只要通过检查“日志记录区”就可以知道,断电时有哪些文件正在进行写入,只要检查这些地方即可。这样就能够节省很多文件检查的时间。

所以我们要选择ext3。Red Hat公司首席核心开发人员Michael K. Johnson说:

“为什么要从ext 2转换到ext3呢?有4个主要的理由:可利用性、数据完整性、速度及易于转换”。“可利用性”,他指出,这意味着从系统中止到快速重新复原,而不是持续让e2fsck执行长时间的修复。ext3的日志式条件可以避免数据毁损的可能。他也指出:“除了写入若干数据超过一次的情况,ext3往往会比ext2更快,因为ext3的日志使硬盘读取头的移动能更有效地进行”。然而,或许决定因素还是在Johnson先生的第4个理由中。

“我们可以轻松地从ext2更改到ext3,获得强有力的日志式文件系统,而不需要重新做格式化”。这是正确的,为了体验ext3的好处,不需要去做长时间的、冗长乏味的且易于产生错误的备份工作及重新格式化的动作。


 
   Linux的文件种类主要有下面这几种:

• 普通文件(regular file):就是一般我们存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:
 纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容为我们可以直接读到的数据,例如数字、字母等等。设置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。
 二进制文件(binary):我们在GNU发展史中提过,系统其实仅认识且可以执行二进制文件(binary file)。Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令cat就是一个二进制文件。
 数据格式的文件(data):有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(data file)。举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。但使用cat时,会读出乱码。因为它是属于一种特殊格式的文件。
• 目录(directory):就是目录,第一个属性为 [d],例如 [drwxrwxrwx]。
• 连接文件(link):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。
• 设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:
 块(block)设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]。
字符(character)设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。
• 套接字(sockets):这类文件通常用在网络数据连接。我们可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。
• 管道(FIFO, pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]。
那么,使用“ls -al”命令,就可以简单通过判断每一个文件的第一个属性来了解这个文件是何种类型。
除了设备文件是系统中很重要的文件,最好不要随意修改之外(通常它也不会让你修改),另一个比较有趣的文件就是连接文件。如果常常将应用程序放到桌面,就应该知道在Windows下面有所谓的“快捷方式”。同样,可以将Linux 下的连接文件简单视为一个文件或目录的快捷方式。套接字与管道文件比较难理解,因为它们与进程(process)密切相关,到将来了解进程(第17章)之后,再回来查看吧。此外,也可以通过man fifo及man socket来查看系统说明。
Linux文件扩展名
基本上,Linux文件是没有“扩展名”的,我们知道,Linux文件能否执行,与它第一列的10个属性有关,与文件名一点关系也没有。这与Windows不同。在Windows中,能执行的文件扩展名通常是 .com、.exe、.bat等等,而在Linux中,只要属性中有x,例如 [-rwx-r-xr-x] 即表示这个文件可以执行。
,x表示这个文件具有可执行的能力,但能不能执行成功,当然就要看该文件的内容。
下面有数种常用的扩展名:
• *.sh:批处理文件(scripts,脚本),因为批处理文件使用shell写成,所以扩展名就编成 .sh。
• *Z, *.tar, *.tar.gz, *.zip, *.tgz:经过打包的压缩文件。这是因为压缩软件分别为gunzip、tar等等的,根据不同的压缩软件而取其相关的扩展名。
• *.html, *.php:网页相关文件,分别表示HTML语法与PHP语法的网页文件。.html的文件可使用网页浏览器来直接打开, .php的文件则可以通过客户端的浏览器来浏览服务器端,以得到运算后的网页结果。

另外,还有程序语言如Perl的文件,其扩展名也可能取成 .pl。
另外,在Linux中,每一个文件或目录的文件名最长可以到255个字符,加上完整路径时,最长可达4096个字符,是相当长的文件名。


4.linux目录配置

  linux的树状目录如下图:
 

  请注意,每个目录都是依附在 / 根目录下面,所以,在安装的时候,一定要有一个 / 对应的分区才能安装的原因即在于此。这也就是我们俗称的“树状目录”。根据FHS定义出来的每个目录内应该放置的文件内容如表6-1所示。
表6-1  目录内容
目录
 应放置的文件内容
 
/
 根目录root(/),一般建议在根目录下面只有目录,不要直接有文件。根目录是启动时系统第一个载入的分区,所以,所有启动过程会用到的文件应该都放在这个分区中。举例来说,/etc、/bin、/dev、/lib、/sbin这5个子目录都应该要与根目录连在一起,不可独立成为某个分区
 
/bin,
/usr/bin,
/usr/local/bin
 除了 /bin之外,/usr/local/bin、/usr/bin也是放置“用户可执行的二进制文件的目录”。举例来说,ls、mv、rm、mkdir、rmdir、gzip、tar、cat、cp、mount等重要命令都放在这个目录中
 
/boot
 这个目录的主要目的是放置Linux系统启动会用到的文件。启动会用到Linux的核心文件。这个目录下面的文件vmlinuz就是Linux的核心。非常重要。如果引导程序(loader)选择grub,那么这个目录内还有 /boot/grub子目录
 
/dev
 在Linux系统上,任何设备都以文件类型存在于这个目录中。存取这个目录下面的某个文件,就等于存取某个设备。设备又分为字符设备(character device),例如键盘、鼠标等;以及块设备(block device),例如硬盘、光盘等等。在此目录下的文件会多出两个属性,分别是主设备号(major device number)与辅设备号(minor device number)。系统核心就是通过这两个号码来判断设备的。重要的文件有 /dev/null、/dev/tty[1-6]、/dev/ttyS*、/dev/lp*、/dev/hd*、/dev/sd* 等等
 
/etc
 系统主要的设置文件几乎都放在这个目录内,例如人员的账号密码文件、各种服务的起始文件等等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但只有root有权修改。并且,在此目录下的文件几乎都是ASCII的纯文本文件。不过,FHS建议不要在这个目录中放置可执行文件。比较重要的文件有:/etc/inittab、/etc/init.d/、/etc
/modprobe.conf、/etc/X11、/etc/fstab、
/etc/sysconfig/ 等等。另外,其下重要的目录有:

·          /etc/init.d/:所有服务的默认启动脚本都放在这里,例如要启动或者关闭iptables的话:

/etc/init.d/iptables start

/etc/init.d/iptables stop
 
 
 ·          /etc/xinetd.d/:这就是所谓的超级守护程序(super daemon)管理的各项服务的设置文件目录。

·          /etc/X11:与X Window有关的各种设置文件都在这里,尤其是xorg.conf或XF86Config这两个X Server的设置文件
 
/home
 这是系统默认的用户家目录(home directory)。在新增一般用户账号时,默认的用户家目录都会放到这里。比较重要的是,家目录有两种代号:

~:表示当前这个用户的家目录,而

~dmtsai:则表示dmtsai的家目录
 
/lib,
/usr/lib,
/usr/local/lib
 系统会使用到的函数库的目录。程序在运行过程中,可能会调用一些额外的功能参数,这需要函数库的协助。这些函数库就放在此处。比较重要的是 /lib/modules目录内会放核心的相关模块
 
/lost+found
 系统出现异常,产生错误时,会将一些遗失的片段放于此目录下,通常这个目录会自动出现在某个分区最顶层的目录下。例如在 /disk中加装硬盘,在这个目录下就会自动产生一个这样的目录: /disk/lost+found
 
/mnt

/media
 这是软盘与光盘的默认载入点;通常软盘挂在 /mnt/floppy下,而光盘挂在 /mnt/cdrom下,不过也不一定。随便找一个地方来载入也可以。另外,当前也规划出另一个 /media的目录。与 /mnt有点类似
 
/opt
 这是给主机额外安装软件所放的目录。举例来说,FC4使用Fedora团体开发的软件,如果今天想要自行安装新的KDE桌面软件,可以将该软件安装在这个目录下。不过,以前的Linux系统中,我们还是习惯放在 /usr/local目录下
 
/proc
 这个目录本身是一个“虚拟文件系统”。它放置的数据都在内存中,例如系统核心、形成信息、外部设备的状态及网络状态等等。因为这个目录下的数据都在内存中,所以本身不占任何硬盘空间。比较重要的文件有/proc/cpuinfo、/proc/dma、/proc/ interrupts、/proc/ioports、/proc/net/* 等等
 
/root
 系统管理员(root)的家目录。之所以放在这里,是因为我们提过,系统第一个启动就载入的分区为 /,而我们希望 /root能够与 / 放在同一块分区上
 
/sbin,
/usr/sbin,
/usr/local/sbin
 放一些系统管理员才会用到的执行命令,例如:fdisk、mke2fs、fsck、mkswap、mount等等。与 /bin不太一样的地方是,这几个目录是给root等系统管理用的。但本目录下的执行文件还是可以让一般用户用来“查看”而不能设置
 
/srv
 一些服务启动之后,这些服务所需要取用的数据目录。举例来说,WWW服务器需要的网页数据就可以放在 /srv/www里
 
/tmp
 这是让一般用户或者是正在执行的程序临时放置文件的地方。这个目录是任何人都能存取的,所以需要定期清理。当然,重要数据不可放在此目录
 
/usr
 根据FHS规范的第二层内容,在 /usr目录下,包含系统的主要程序、图形界面所需要的文件、额外的函数库、本机自行安装的软件,以及共享的目录与文件等等。事实上,它有点像Windows操作系统中的“Program files”与“WinNT”这两个目录的结合。在此目录下的重要子目录有:

·          /usr/bin, /usr/sbin:一般身份用户与系统管理员可执行的文件放置目录。

·          /usr/include:c/c++ 等程序语言的文件头(header)与包含文件(include)放置处,当以tarball方式(*.tar.gz的方式安装软件)安装某些数据时,会使用到里头的许多包含文件。

·          /usr/lib:各应用软件的函数库文件放置目录。

·          /usr/local:本机自行安装的软件默认放置的目录。当前也适用于 /opt目录。在安装完Linux之后,基本上所有的配置都有了,但软件总是可以升级的,例如要升级代理服务,则通常软件默认的安装地方就是在 /usr/local(local是“当地”的意思),同时,安装完毕之后所得到的执行文件,为了与系统原执行文件有分别,升级后的执行文件通常放在 /usr/local/bin。建议将后来才安装的软件放在这里,便于管理
 
 
 ·          /usr/share:共享文件放置的目录,例如下面两个目录:

n             /usr/share/doc:放置一些系统帮助文件的地方,例如安装了grub,那么在该目录下面找一找,就可以查到lilo的帮助文件了。很方便。

n             /usr/share/man:manpage的文件文件目录。就是使用man的时候查询的路径。例如使用man ls命令时,就会查出 /usr/share/ man/man1/ls.1.gz帮助文件的内容。

Ÿ    /usr/src:Linux系统相关的程序代码放置目录,例如 /usr/ src/linux为核心源码。

Ÿ    /usr/X11R6:系统内的X Window System所需的执行文件几乎都放在这里
 
/var
 这个目录也很重要,也是FHS规范的第二层目录内容。它主要放置系统执行过程中经常变化的文件。举例来说,例如缓存(cache)或者是随时更改的登录文件(log file)。此外,某些软件执行过程中会写入的数据库文件,例如MySQL数据库,也都写入这个目录中。很重要。它下面的重要目录有:

·          /var/cache:程序文件在运行过程当中的一些暂存盘。

·          /var/lib:程序执行的过程中,需要使用到的数据文件放置的目录。举例来说,locate数据库与MySQL及rpm等数据库系统,都写在这个目录内。

·          /var/log:登录文件放置的目录。很重要。例如 /var/log/ messages就是总管所有登录文件的文件。

·          /var/lock:某些设备具有一次性写入的特点,例如tab(磁带机),此时,为了避免被其他人干扰而破坏正在运行的操作,因此,会将该设备lock(锁)起来,以确定该设备只能被单一程序所用。

·          /var/run:某些程序或者是服务启动后,会将它们的PID放在这个目录下。

·          /var/spool:是一些队列数据存放的地方。举例来说,主机收到电子邮件后,就会放到 /var/spool/mail中,若信件暂时发不出去,就会放到 /var/spool/mqueue目录下,用户工作任务分配(cron)则是放在 /var/spool/cron中
 


5.文件与目录管理
 
  A. 目录概述:
  下面这些就是比较特殊的目录,要记下来:
          .         表示此层目录
          ..        表示上一层目录
          -         表示前一个工作目录
          ~         表示“当前用户身份”所在的家目录
          ~account  表示account用户的家目录
   在目录下面有两个目录是一定会存在的,就是 . 与 .. 。分别表示此层与上层目录

   cd(切换目录)cd是Change Directory(改变目录)的缩写,这是用来切换工作目录的命令。注意,目录名与cd命令之间有一个空格
     eg:
    [root@linux ~]# cd /var/spool/mail# 这就是绝对路径的写法。直接指定要去的完整路径名称。
    [root@linux mail]# cd ../mqueue# 这个是相对路径的写法,我们由 /var/spool/mail去 /var/spool/mqueue就这样写。

   pwd(显示当前所在的目录) pwd是Print Working Directory(显示工作目录)的缩写,也就是显示当前所在目录,
   参数:-P : 显示出实际路径,而非使用连接(link)路径。
   eg:
   [root@linux mail]# pwd
   /var/mail
   [root@linux mail]# pwd -P
   /var/spool/mail   <== 怎么回事?有没有加 -P差很多。
    [root@linux mail]# ls -l /var/maillrwxrwxrwx  1 root root 10 Jun 25 08:25 /var/mail -> spool/mail
    # 看到这里应该知道原因了吧?因为 /var/mail是连接文件,连接到 /var/spool/mail# 所以,加上pwd -P的参数后,会不以连接文件的数据显示,而是显示正确的完整路径

   mkdir(建立新目录)如果想要建立新目录,就使用mkdir(make directory,生成目录)。
   参数:-m : 设置文件的权限。直接设置,不要管默认权限。
         -p : 帮助你直接建立所需要的目录递归。
   eg:
   [root@linux tmp]# mkdir -p test1/test2/test3/test4# 加了这个 -p的参数,可以自行建立多层目录。
   [root@linux tmp]# mkdir -m 711 test2
   [root@linux tmp]#  ls -l
    drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
    drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
    drwx--x--x  2 root  root 4096 Jul 18 12:54 test2# 仔细看上面的权限部分,如果没有加上 -m来强制设置属性,系统会使用默认属性。# 那么,你的默认属性是什么?这要通过下面介绍的umask才能了解。

    rmdir(删除“空”目录) 如果想要删除现有目录,就使用rmdir。而且被删除的目录里,必定不能有其他目录或文件
    如果要将所有目录下的东西都删除,就必须使用rm -rf directoryname

    B 环境变量PATH:

    PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻。用以下命令可以看到PATH的值。 

     $ echo $PATH
    
     要修改所有用户的PATH值,您可以以root身份编辑/etc/profile文件,修改其中包含“PATH=”的一行。(每一个 path 之间要用 “:“ 分隔。)
    如果只是要修改某一个用户的PATH值,就应该编辑该用户主目录中的.bash-profile文件。
   注意:在修改了PATH值或任何环境变量后,都要用export将其输出,新的PATH值才能生效如果要及时生效,在命令行输入source 文件名.即可生效

   C 文件与目录的管理
  
   ls  查看文件和目录

   cp  复制文件或目录

   rm  删除文件或目录
  
   如果要连目录下的内容都一起删除,例如子目录里面还有子目录,就要使用 -rf参数。不过,使用“rm -rf”命令之前,请千万注意,因为该目录或文件“肯定”会被root删除。因为系统不会再次询问是否要删除。所以这是非常重要的命令,需要特别注意。不过,如果确定该目录不要了,使用rm -rf来循环删除是不错的方式。


   mv  移动文件与目录,或重命名


   D  查看文件内容
 
    cat 由第一行显示文件内容
    tac 从文件的最后一行开始显示
    more 一页一页地显示文件的内容
    less 与more相似,但其优点是可以往前翻页
    head 只看头几行
    tail 只看末尾几行
    nl 显示同时输出行号
    od 以二进制方式读取文件内容
 
   cat(concatenate) -n 连同行号显示在屏幕上
   head [-n number] 看文件开头的几行
   tail [-n number] 看文件末尾的几行
   nl和cat -n的用法相似

    E:链接文件
     1.索引结点(inode):
     block是记录文件内容数据的区域,inode是记录该文件的属性及其放置在哪个block之内的信息.即使该文件没有数据,也会占用一个inode.
     linux查找文件时,也是先搜寻inode table表找到这个文件的属性和数据存放的地点,然后去block中取出数据,即在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。
     一个分区被格式化一个文件系统后,基本上有inode table和数据这两个区域.
    
     2.ln
     硬链接(hard link):硬链接说白了是一个指针,指向文件索引节点(inode),系统并不为它重新分配inode,删除一个硬连接后,链接数同时减一,只有将所有指向文件内容的指针,也即链接数减为0时,内核才会把文件内容从磁盘上删除
     限制:(1)不可以在不同文件系统的文件间建立硬链接(2)不能可以为目录创建硬链接。
     软链接(Soft Link),软链接又称为符号链接(Symbolic link)
     硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,总之,建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。

    F:文件与目录权限
  chown 改变文件的拥有者  [-R 循环的改变该目录下的所有文件的拥有者]
  chgrp 改变文件的所属群组
  chmod 改变文件的权限
  unmask 改变预设的建立文件或目录的属性[该值指定的是取消的权限](可以在/etc/bashrc中改变,也可以直接命令改变.)
   1. 如果建立的是文件,则默认没有可执行项(X),最大为666(建立的文件的最终权限就是666-unmask)
   2. 如果建立的是目录,则所有的权限都放开了,即最大权限为777(建立目录的最终权限就是777-unmask)
  chattr 改变文件的特殊属性
  chattr [+-=] [ASacdistu] [文件或目录名称]
  +-=:操作符`+'用来在文件已有属性的基础上增加选定的属性; `-'用来去掉文件上的选定的属性;而`='用来指定该文件的唯一属性
  当修改设置了'A'属性的文件时,它的atime记录不会改变. 这可以在笔记本电脑系统中避免某些磁盘I/O处理.
  设置了`a'属性的文件只能在添加模式下打开用于写入. 只有超级用户可以设置或清除该属性.
  设置了`c'属性的文件在磁盘上由内核自动进行压缩处理. 从该文件读取时返回的是未压缩的数据. 对该文件的一次写入会在保存它们到磁盘之前进行数据压缩.
  设置了`d'属性的文件不能对其运行 dump(8) 程序进行备份.
  设置了`i'属性的文件不能进行修改:你既不能删除它, 也不能给它重新命名,你不能对该文件创建链接, 而且也不能对该文件写入任何数据. 只有超级用户可以设置或清除该属性.
  当删除设置了`s'属性的文件时,将对其数据块清零并写回到磁盘上.
  当修改设置了`S'属性的文件时, 修改会同步写入到磁盘上;这与应用到文件子系统上的`sync'挂载选项有相同的效果.
  当删除设置了`u'属性的文件时, 将会保存其内容. 这使得用户可以请求恢复被删除的文件.
  lsattr 显示文件的特殊属性
  lsattr [-aR]
  -a:将隐藏文件的属性也显示出来
  -R:连同子目录的数据一并显示出来.

    G:搜寻文件或目录
    which 查看可执行程序的位置,主要通过PATH环境变量到该路径内寻找可执行文件.
    whereis 查看文件的位置
    whereis只能查二进制文件、说明文档,源文件
    locate  查看文件的位置
    find [路径] [参数](可以使用通配符*,速度慢而且费硬盘)
 
    H.SUID,SGID,Sticky bit与file指令
    UID和GID代表用户代号和群组代号,root的都是0
   
    -r-s--x--x  1 root root 21200 2005-06-17  /usr/bin/passwd

     在原来的x位置有一个s属性,这个就是所谓的SUID,如果是-r-x--s--x,那么这里的s就是所谓的SGID.当一个文件具有 SUID,同时other群组具有可执行权限,那么当others群组执行该程序时,others将拥有该文件的owner权限,同理,当一个文件具有 SGID,同时other群组具有可执行权限,那么当others群组执行该程序时,others将拥有该文件的group权限.
    设置文件或目录的suid或sgi属性:
    那么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! ( 註:通常我們使用chmod xyz filename 的方式來設定filename的屬性時,則是假設沒有SUID, SGID 及Sticky bit 啦! )
     4为SUID
     2为SGID
     1 為Sticky bit 1为Sticky bit
假設要將一個檔案屬性改為『-rwsr-xr-x』時,由於s 在使用者權限中,所以是SUID ,因此,在原先的755 之前還要加上4 ,也就是:『 chmod 4755 filename 』來設定!假设要将一个档案属性改为『-rwsr-xr-x』时,由于s在使用者权限中,所以是SUID ,因此,在原先的755之前还要加上4 ,也就是:『 chmod 4755 filename 』来设定! 此外,還有大S 與大 T 的產生喔!此外,还有大S与大T的产生喔! 參考底下的範例啦!参考底下的范例啦! ( 注意:底下的範例只是練習而已,所以鳥哥使用同一個檔案來設定,您必須瞭解 SUID 不是用在目錄上,而SBIT 不是用在檔案上的喔! )


     具有Sticky bit属性的目录,其下的文件或目录只有文件拥有者及root才有权删除.
系统中存在这样的目录,即/tmp目录
      drwxrwxrwt   19 root root  4096  9月 27 04:02 tmp
      最末位是t

       file指令可以用来看文件的类型,还可以用来查看文件是否被加入了SUID信息.

 

 

 

 

 

 

 

 

 

 

硬盘与硬件管理

 

3.1 认识硬盘
    物理组成:主引导区(mbr),块(block),superblock(文件系统起始位置的block),inode
    这里要注意的是一个block最多容纳一个文件,所以当一个文件不足一个块的大小时,这个块剩下的空间也将被浪费.但是如果块太小,则磁盘的block会大增,造成inode在指向block时搜索的时间大大增加,即大文件读写效率低下。
    superblock,存储这个文件系统(每个磁盘分区就是一个文件系统)的相关信息,使用这个文件系统进行数据存储的时候,这是第一个要读的,如果superblock已坏,那么这个文件系统就丢失了.

3.2 查看硬盘或目录的容量
df  查看硬盘的总容量、已用容量与inode
du  查看文件已用容量

语法:df [选项]
  说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况
 该命令各个选项的含义如下:
        -a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
        -k 以k字节为单位显示。
        -i 显示i节点信息,而不是磁盘块。
        -t 显示各指定类型的文件系统的磁盘空间使用情况。
       -x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
   -T 显示文件系统类型。
    -h 使用人类可读的格式


例1:列出各文件系统的磁盘空间使用情况。
$ df
Filesystem 1 K-blocks Used Available Use% Mounted on
/dev/hda2 1361587 1246406 44823 97% /

df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);
第2列给出分区包含的数据块(1024字节)的数目;
第3,4列分别表示已用的和可用的数据块数目。
用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数。这是因为缺省的每个分区都留了少量空间供系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。
清单中Use% 列表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间。
最后,Mounted on列表示文件系统的安装点。

例2:列出各文件系统的i节点使用情况。
$ df -ia
Filesystem Inodes IUsed IFree Iused% Mounted on
/dev/ hda2 352256 75043 277213 21% /
none 0 0 0 0% /proc
localhost:(pid221) 0 0 0 0% /net

例3:列出文件系统的类型。
$ df -T
Filesystem Type 1K-blocks Used Available use% Mounted on
/dev/hda2 ext2 1361587 1246405 44824 97% /
 本例中的文件系统是ext2类型的。


du(disk usage)

功能说明:显示目录或文档的大小。

语  法:du [-abcDhHklmsSx][--help][--version][目录或文档]

补充说明:du会显示指定的目录或文档所占用的磁盘空间。

参  数:
  -a或-all   显示目录中个别文档的大小。
  -b或-bytes   显示目录或文档大小时,以byte为单位。
  -c或--total   除了显示个别目录或文档的大小外,同时也显示任何目录或文档的总和。
  -h或--human-readable   以K,M,G为单位,提高信息的可读性。
  -k或--kilobytes   以1024 bytes为单位。
  -s或--summarize   仅显示总计
  --help   显示帮助。
  --version   显示版本信息。


df命令算出的文件系统使用块数的值与通过du命令得出的值是不一致的
该值差异的存在是由于du与df命令实施上的不同: du -s命令通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数;
而df命令通过查看文件系统磁盘块分配图得出总块数与剩余块数。
文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。这些数据对大多数用户级的程序来说是不可见的,通常称为Meta. Data。
du命令是用户级的程序,它不考虑Meta. Data,而df命令则查看文件系统的磁盘分配图并考虑Meta. Data。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。
  


3.3磁盘分割与格式化
fdisk    硬盘分区工具
e2label  修改硬盘的label(表头名称)的工具
mke2fs   liunx下重要的格式化工具

1.fdisk [-l] 设备名称

fdisk -l 直接列出该硬盘设备的分区表,通过fdisk -l 可以直接查看机器所挂硬盘个数及分区情况

关于fdisk -l 一些数值的说明

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

这个硬盘是80G的,有255个磁面;63个扇区;9729个磁柱;每个 cylinder(磁柱)的容量是 8225280 bytes=8225.280 K(约为)=8.225280M(约为);

2.fdisk 设备名称

其实fdisk 设备名称最主要的工作是修改分区表,这个工具只有root才能执行,
设备名称不要加数字,因为分区是针对整个硬盘而不是某一个分区的.

fdisk的命令行用法为: fdisk 硬盘设备名

进入fdisk后,首先键入'm',即可显示fdisk全部菜单。

再键入'p',显示当前分区表状态。

键入'n',增加一个分区,然后会提示你选择分区类型(基本分区或扩展分区),再选择分区号(1-4)。注:每块硬盘最多可划分四个主分区(包括基本分区和扩展分区),其中:基本分区最多可划分四个,扩展分区最多可划分一个,但扩展分区内可再划分多个逻辑分区,选中你要建立的分区类型和分区号后,会提示输入起始柱面,从1开始;然后再输入终止柱面,此时可输入实际的柱面数,也可用"+分区尺寸"的方式输入,如:+1024M表示在起始柱面后加上1024M。主分区的设备名依次为:/dev/hda1,/dev/hda2,/dev/hda3,/dev/hda4,逻辑分区的设备名依次为:/dev/hda5,/dev/hda6,/dev/hda7...等等。

键入’d‘,删除分区,输入分区号即可删除。注意,删除扩展分区时,将会同时删除所有的逻辑分区。

键入’t‘,改变分区标志(这是Linux的fdisk最精华的部份!),新建的分区默认标志是83(Linux Ext2),你可以把它改为82(Linux 交换区)、或是'b'(FAT32)、'f'(FAT32 Extend,只限于扩展分区)、'86'(NTFS)。。。等几十种类型。这样一来,使用多操作系统的朋友们就可以用Linux的fdisk划分出你想要的所有分区了!

键入'a',切换分区激活开关。请注意:每键入一次,被选的分区就会在激活与非激活间变化一次,但你必须保证最后只有一个分区被激活。这时就用得到'p'命令了,被激活的分区上会有个'*'号。

除以上的几个命令外,还有其它几个,但不太常用。

最后,键入’w',你对分区所做的改变被写入硬盘;键入'q',则放弃所有的修改。


在fdisk完成后,需要用格式化工具mke2fs进行格式化,
    然后装载到指定目录(mount)
    mount -t ext3 /dev/sda2 /test
    或 修改/etc/fstab如下重新启动计算机就行了
    /dev/sda2 /test ext3 defaults 1 1


   3.mke2fs

   功能说明:建立ext2文件系统
    -b<区块大小>   指定区块大小,单位为字节。
    -c   检查是否有损坏的区块。
    -j   建立ext3这个具有日志管理功能的文件格式.
    -i   设定inode的值
    -L<标签>   设置文件系统的标签名称。

     [root@localhost beinan]# mkfs.ext3 /dev/sda6 注:把该设备格式化成ext3文件系统
     [root@localhost beinan]# mke2fs -j /dev/sda6 注:把该设备格式化成ext3文件系统
     [root@localhost beinan]# mkfs.ext2 /dev/sda6 注:把该设备格式化成ext2文件系统 

   4.e2label  

   这个指令主要是用来更改磁盘的表头数据,也就是设定磁盘代号,用在/etc/fstab中.这里的卷标和挂载的目录不是一个意思,卷标只是一个字符串,标识磁盘而已

   eg:
     显示文件系统的卷标:
    e2label /dev/hda5
     /home

    给磁盘设置加上卷标:
    mke2fs -j -L iscsi /dev/sdb1
    iscsi卷标名称,/dev/sdb1 磁盘设备

     更改文件系统卷标:
     e2label /dev/sdb1 iscsi66

    e2label的用法:
    [root@mail ~]# e2label
    Usage: e2label device [newlabel]

   
  3.4 检查硬盘坏轨与数据同步写入
   fsck 检查硬盘坏轨
     sync 数据同步写入

    1.fsck

    在/目录下有一个特殊的目录,即lost+found目录,就是当执行完fsck命令后,如果程序发现有任何错误文件,会将该文件的数据丢到这个目录当中.
   
     指令:fsck
使用方式 : fsck [-aACr]  filesys

说明 : 检查与修复 Linux 档案系统,可以同时检查一个或多个 Linux 档案系统

参数 :
filesys : device 名称(eg./dev/sda1),mount 点 (eg. / 或 /usr)
-A : 对/etc/fstab 中所有列出来的 partition 做检查
-C : 显示完整的检查进度
-a : 如果检查有错则自动修复
-r : 如果检查有错则由使用者回答是否修复
例子 :
检查  /dev/hda5 是否正常,如果有异常便自动修复 :

fsck  -a /dev/hda5
 注意 :
此指令可与 /etc/fstab 相互参考操作来加以了解。

    2.sync
 
     Linux 系统中欲写入硬盘的资料有的时候会了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块记忆体空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了,sync 指令会将存于 buffer 中的资料强制写入硬盘中


     3.5 关于启动盘
    mkbootdisk  制作启动软盘
      fdformat    用来低级格式化软盘
   
     3.6 硬盘的装载
  
     装载点就是该硬盘所在的目录,且该目录下的所有目录都属于该硬盘所有.装载硬盘的时候得先建立目录(即装载点)
   
    mount  装载文件系统
    umount  卸载文件系统 ( 除了直接指定文件系统外,也可以用设备名称或挂入点来表示文件系统。)

mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
说明 :
将某个档案的内容解读成档案系统,然后将其挂在目录的某个位置之上。当这个命令执行成功后,直到我们使用 umnount 将这个档案系统移除为止,这个命令之下的所有档案将暂时无法被调用。
  
 -V  显示程序版本
 -h   显示辅助讯息
 -a   将 /etc/fstab 中定义的所有档案系统挂上。
 -l   列出当前已经装载的设备、文件系统名称与装载点

 -t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs

-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集

eg:
mount -t iso9660 /dev/cdrom /mnt/cdrom
装载光驱

mount -a
将 /etc/fstab 中定义的所有磁盘系统挂上

umount /home
直接卸载/home所在的文件系统.

 3.7 文件系统的装载

  1.装载windows分区
  使用fdisk指令可以知道windows分区在哪个硬盘,然后建立目录装载
eg:
  mkdir /mnt/win98
  mount -t vfat /dev/hda1 /mnt/win98---用fdisk知道/dev/hda1为win98分区
  mount -t vfat -o iocharset=cp950 /dev/hda5 /mnt/win98  ---iocharset=cp950可以让win98分区中的文件能正确显示中文
 
  2.硬盘的装载
 fdisk  设备名称                 --- 硬盘分区
 mke2fs 分区标识                 --- 格式化硬盘
 mkdir  目录名称                 --- 建立目录
 mount  分区标识  目录名称       ----  装载硬盘

  3.设定启动时的装载方式
 
  修改/etc/fstab 配置文件
  etc/fstab其实就是一个文本文件,用gedit或者vi都可以打开,当然,前提是root权限。在这个文件中,每个文件系统(包括分区或者设备)用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为 fsck,mount或umount等程序在做它们的工作时会按此顺序进行.
 
eg:
dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2
/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0
/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0
proc /proc proc defaults 0 0
/dev/hda1 swap swap pri=42 0 0

第一列表示设备的名称,第二列表示该设备的挂载点,第三列是文件系统,第四列是挂载选项,第五列是dump选项(用一个数字表示),第六列(接下来的数字)表示文件系统检查选项

 第一、二列:设备和默认挂载点


说实话,第一列和第二列的内容是最简单最直接的,它们的作用就是告诉mount命令,我想挂载什么分区或者什么设备,以及我所希望的挂载点在哪里。在fstab中为某一个设备指定的挂载点是其默认挂载点,也就是当你在挂载目录的时候没有手工指定其他目录的话,系统就将该设备挂载到这个目录。大多数 Linux发行版都会为挂载点创建专门的目录,大多数是在/mnt下

按照我们给出的fstab示例,如果你敲入命令

$ mount /dev/fd0

你的软驱就将挂载到/media/floppy,因为这是你告诉系统的软驱默认挂载点。如果没有这个信息,当你敲入mount命令时,mount会感到很困惑:该死的,你想让我把这玩意挂载到哪里去呢?当然,如果你看fstab中发行版给你指定的默认挂载点不顺眼,也可以自由修改它,修改成任何一个你希望的目录都可以。如果还不存在,就首先创建这个目录。要知道,fstab是不会把所有工作都给你包干的哦。

另外,有一些分区和存储设备是在Linux系统启动的时候就自动挂载的,比如,让我们看看刚才列出来的fstab示例信息,有两行是这样的:
/dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2

正如刚才我们讲到的那样,这两行表示/dev/hda2默认挂载到/根目录,而 /dev/hdb1则默认挂载到/home目录,。这些工作在你Linux系统启动的时候就会通过读取fstab自动完成,否则的话……想象你会遭受什么样的折磨吧,所有的程序都在/根目录下,而你却无法使用,因为你没有挂载/根目录!

除了显示的使用设备名,你可以使用设备的UUID或设备的卷标签,例如,你可以在这个字段写成“LABAL=root”或“UUID= 3e6be9de- 8139-11d1-9106-a43f08d823a6”,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个SCSI硬盘,这有可以改变你的设备名,但它不会修改你的卷标签。

对于NFS mount操作,这个字段应该包含host:dir格式的信息,例如:knuth.aeb.nl:/,对于进程文件系统procfs,使用proc。

第三列:文件系统类型

fstab中的第三列指示了设备或者分区的文件系统类型。它支持很多种类的文件系统,我们在这里只介绍最为常用的。如果想了解你的kernel目前支持哪些文件系统,可以查看/proc/filesystems的内容。如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。

ext2 和 ext3: 

reiserfs: ReiserFS是一个非常优秀的文件系统。也是最早用于Linux的日志文件系统之一,其机制比Ext3要先进得多,
swap: Swap,即交换区,把它想象成虚拟内存就行了。

vfat 和 ntfs:一看就知道是Windows分区格式了,呵呵。98,me等系统都是使用的vfat,也就是最流行的fat32格式,而NT系列则多使用NTFS,当然也不是固定的,因此2000或者XP系统要具体情况具体分析。当初Linux对NTFS的写入支持不好,所以大多数资料都建议用户使用vfat格式,但是现在支持已经很好了,

auto:当然,这不是一个文件系统类型。auto只是表示,文件系统的类型将被自动检测。在上面的示例中,你会发现软驱和光驱的文件系统类型都是auto,为什么呢?因为它们的文件系统类型随时都可能改变,比如软驱,优盘这种设备,可能今天是vfat格式,明天你就把它格式化成了ntfs,因此,最明智的做法就是告诉系统,我没法确定这东西的当前类型,还是你自己检测吧。

udf: 由于刻录光驱越来越流行,现在很多发行版自带的fstab中,光驱的文件格式类型是UDF,UDF是Universal Disc Format的缩写,与ISO 9660格式相容。它采用标准的封装写入技术(PW,Packet Writing)将CD-R/CD-RW当作硬盘使用,用户可以在光盘上修改和删除文件。利用UDF格式进行刻录时,刻录软件将数据打包,并在内存中临时建立一个特殊文件目录表,同时接管系统对光盘的访问。

iso9660: 很多光驱也使用的这个选项。ISO9660是一种描述适合CD盘片的电脑文件结构的国际标准。采用此标准的盘片可以在不同的操作系统上使用,如MAC和Windows。

第四列:挂载选项

fstab中的第四列表示设备或者分区所需要的挂载选项。这一列也是fstab中最复杂最容易出错的一列,只是分析最常用的一些选项,如果你想知道更多的东西,还是求助于man吧。

auto 和 noauto: 这是控制设备是否自动挂载的选项。auto是默认选择的选项,这样,设备会在启动或者你使用mount -a命令时按照fstab的内容自动挂载。如果你不希望这样,就使用noauto选项,如果这样的话,你就只能明确地通过手工来挂载设备。

user 和 nouser:这是一个非常有用的选项,user选项允许普通用户也能挂载设备,而nouser则只允许root用户挂载。nouser是默认选项,这也是让很多 Linux新手头疼的东西,因为他们发现没有办法正常挂载光驱,Windows分区等。如果你作为普通身份用户遇到类似问题,或者别的其他问题,就请把 user属性增加到fstab中。

exec 和 noexec: exec允许你执行对应分区中的可执行二进制程序,同理,noexec的作用刚好相反。如果你拥有一个分区,分区上有一些可执行程序,而恰好你又不愿意,或者不能在你的系统中执行他们,就可以使用noexec属性。这种情况多发生于挂载Windows分区时。exec是默认选项,理由很简单,如果 noexec变成了你/根分区的默认选项的话……

ro: 以只读来挂载文件系统。

rw: 以可读可写的属性来挂载系统。

sync 和 async:对于该文件系统的输入输出应该以什么方式完成。sync的意思就是同步完成,通俗点讲,就是当你拷贝一个东西到设备或者分区中时,所有的写入变化将在你输入cp命令后立即生效,这个东西应该立马就开始往设备或者分区里面拷贝了。而如果是async,也就是输入输出异步完成的话,当你拷贝一个东西到设备或者分区中时,可能在你敲击cp命令后很久,实际的写入操作才会执行,换句话说,就是进行了缓冲处理。

有时候这种机制蛮不错的,因为sync会影响你系统的运行速度,但是这也会带来一些问题。想一想,当你希望将一个文件拷贝到u盘上时,你执行了cp 命令,却忘记执行umount命令(它会强行将缓冲区内容写入),那么你拷贝的文件实际上并没有在u盘上面。如果你是使用的mv命令,而你又很快将u盘拔出……恭喜你,文件会从这个星球上消失的。因此,虽然async是默认属性,但是对于u盘,移动硬盘这种可移动存储设备,最好还是让他们使用sync选项。

defaults: 所有选项全部使用默认配置,包括rw, suid, dev, exec, auto, nouser, 和 async。

一般用户没有特殊需求,直接使用defaults就可以了。看完介绍,我们再回过头去看看前面的示例内容,以光驱为例,主要关注挂载选项这里,可以看到,光驱和其他分区设备的不同是ro,因为普通光驱是只读的。而exec则让你可以从光驱上直接执行某些程序。

第五、六列:dump和fsck选项

Dump和fsck?这是什么东西?恩,dump是一个备份工具,而fsck是一个文件系统扫描检查工具。我不会在这里详细介绍它们,因为用man或者google都可以获得更加详细的信息。

fstab的第五列是表示dump选项,dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0,dump就会被忽略,事实上,大多数的dump设置都是0。而第六列是fsck选项,fsck命令通过检测该字段来决定文件系统通过什么顺序来扫描检查,根文件系统/对应该字段的值应该为1,其他文件系统应该为2。若文件系统无需在启动时扫描检查,则设置该字段为0。


/etc/mtab文件的作用:

记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等,如果手动装载文件系统,这个mtab就会跟着变动;
而/etc/fstab是系统准备装载的。直接使用mount和确定就是通过查询它而来的。

 4.建立与装载虚拟内存文件

  A。建立swap分区:
  fdisk先建立一个分区,
  mkswap 分区来格式化为swap格式
  swapon 分区来启动swap

  B.建立虚拟内存文件
  dd指令建立swapfile
  mkswap 将swapfile文件格式化为swap格式
  swapon 启动该文件
  swapoff 关闭该文件

 dd指令
 功能:把指定的输入文件拷贝到指定的输出文件中,并且在拷贝过程中可以进行格式转换。
 语法:dd [选项]

if =输入文件(或设备名称)。

of =输出文件(或设备名称)。

ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。

skip = blocks 跳过读入缓冲区开头的ibs*blocks块。

obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。

bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。

cbs = byte 一次转换bytes字节。

count=blocks 只拷贝输入的blocks块。

文件的容量是bs*count

eg:
dd if=/dev/zero f=/tmp/swap bs=4k count=16382

那么建立的swap文件的大小就为4*16382大约为64MB

 

 

 

 

学习shell 

 

4.1  vi处理器

    4.1.1 vi简易说明
   
    vi分为三种模式,分别是"一般模式","编辑模式","命令行模式".
 
    一般模式是指用vi处理文件时,一进入该文件就是一般模式,可以处理删除,复制,粘贴等动作,但文法编辑
   
    编辑模式是指在一般模式下按下i,I,o,O,a,A,r,R等字母后才进入的模式,这种情况下才能输入字符写入文件中.在编辑模式下
 
按下ESC键后,才退出编辑模式

    命令行模式是指在一般模式下,输入":","/"就可以将光标移动到最后一行,在这个模式下,可以搜寻数据,读取,存盘,字

符替换、退出vi等动作

   4.1.2 简易范例

   4.1.3 常用指令
  
   一般模式(光标移动):

   nG 光标移至第 n 行首
   n+ 光标下移 n 行
   n- 光标上移 n 行
  
   一般模式(查找与替换):

   /word 在光标之后查找一个名为word的字符串
   ?word 在光标之前查找一个名为word的字符串

  一般模式(删除、复制与粘贴):
 
  dd   删除光标所在行的整行
  ndd  删除光标所在行的向下n行
  dG   删除光标所在行到最后一行的所有数据
  yy   复制光标所在行的整行
  nyy  删除光标所在行的向下n行的数据
  p,P  p,将缓冲区的内容粘贴到光标的后面;P,将缓冲区的内容粘贴到光标的前面

  编辑模式:

  i               在光标左侧输入正文
  a               在光标右侧输入正文
  o               在光标所在行的下一行增添新行
  O               在光标所在行的上一行增添新行
  I               在光标所在行的开头输入正文
  A               在光标所在行的末尾输入正文

 命令行模式:

:q             在未作修改的情况下退出
:q!            放弃所有修改,退出编辑程序
:w             将编辑的数据写到文件中
:w!            若文件属性为只读,强制写入该文件
:w [filename]  将编辑的数据保存为另外的文件
:wq            保存后退出,若为:wq!,则为强制保存后退出


 4.2 学习BASH

 4.2.1 什么是SHELL

 Shell是一种具备特殊功能的程序,它是介于使用者和 UNIX/Linux 操作系统之核心程序(kernel)间的一个接口,简单的说,使

计算机主机工作是核心的任务,但是操作核心来替用户工作,却是shell的工作.

4.2.2 BASH Shell

  输入指令的方式:

   [root@test /root]# command [-options] parameter1 parameter2 ...
                    指令     选项      参数(1) 参数(2)
    1. command为指令的名称,例如变换路径的指令为cd
    2. 中括号[]并不存在于实际的指令中,在加入参数时,通常为“-”符号,
    有时候完整名称会输入“--”符号。例如ls --help
    3. parameter1 parameter2为依附在option之后的参数,或者是  command的参数
    4. command, -options, parameter1这几项之间以空格分隔, 不论空几格shell都视为一格
    5. 指令太长的时候,可以使用 / 符号来跳转Enter,使指令连续到下一行


4.2.3 变量与变量的设定
 
    我们在执行程序的时候,系统怎么知道您的ls指令放在哪里?这是因为有PATH变量。系统通过这个变量中设定的路径依序寻

找该指令系统,如果找不到,屏幕上会显示command not found字样。这些是系统默认的变量,还可以自定义变量

    简单地说,变量就是以一组文字或符号取代一些设定或一串数据.

4.2.3.1 echo

   要显示当前的PATH变量,可以使用echo指令,而为了要分辨其是否为变量,Linux系统预设变量名称前会加一个$符号,所以就

写成echo $PATH的形式。

4.2.3.2 env

   既然环境变量很重要,那么在Linux系统中到底有多少环境变量呢?简单地使用env指令就可以知道了。

4.2.3.3 set

  set的使用方法就是直接输入set。它除了会显示当前的环境变量,也会显示您的自定义变量

  比较有趣的是$与?变量,尤其是?变量,如果您上一个命令执行过程中没有发生错误,那么这个变量会被设为0,如果上个命令

出现错误信息,那么这个变量会变成1

4.2.3.4 变量设定规则

   设定变量的规则如下:

   1. 变量与变量内容以等号“=”连结;
   2. 等号两边不能直接接空格符;
   3. 变量名称只能是英文字母与数字,其中数字不能是开头字符;
   4. 若有空格符,可以使用双引号或单引号将变量内容结合起来,但要特别留意,双引号内的特殊字符可以保留变量特性,单引号内的特殊字符则仅为一般字符;
   5. 必要时以跳转字符“/”将特殊符号(如Enter,$,/,空格符,'等)变成一般符号;
   6. 在一串指令中,还需要借助其他指令提供的信息,这时可以使用quote“` command`”;
   7. 若该变量为扩增变量内容时,则需以双引号及$变量名称(如"$PATH":/home)继续累加内容;
   8. 若该变量需要在其他子程序执行,则以export使变量可以动作,如export PATH;
   9. 通常大写字符为系统预设变量,自定义变量可以使用小写字符,方便判断(纯粹依照用户兴趣与嗜好);
   10. 取消变量的方法为:unset 变量名称。

4.2.3.5 export
 
   当您取得一个bash之后,即得到了一个程序,但是若您再次执行bash,那么将进入子程序,程序的概念我们放在第16章详谈,

这里您有个概念即可。由于您已经进入了该子程序,所以父程序中的变量设定将不继续存在。如果想让该变量内容继续在子程序

中使用,请执行export 变量

   在引用他人的文件或其他程序时,export相当重要,尤其在需要两三个文件互相引用时,如果忘记设定export,那么不同文件

中的相同变量值将需要一再地重复设定。所以,只要在头一个文件使用export,那么后续的文件引用该变量时,将会自动读取该

变量内容

4.2.3.6 unset

   直接取消该变量内容。
 
   unset 变量


4.2.4 命令别名与历史命令

4.2.4.1 alias与unalias

 alias的定义规则与变量定义规则几乎相同.

 所以在输入命令alias + 别名=' 指令 参数'后,输入别名,就是执行的'指令+参数',如要取消,使用unalias.

4.2.4.2 history

 history 查询曾经输入的指令

使用history命令来显示列表,可以跟一个整数表示希望显示最后的多少条命令。如下:
$  history 10
  526  ls web/
  527  clear
  528  ls -a
  529  history 10
  530  date
  531  make -v
  532  sudo apt-get --help
  533  history 10
  534  gcc -v
  535  history 10

    每条命令前都有一个序号标示,你可以使用下面的方法回忆出以前执行过的命令。

    !n    这个n表示序号,假如你想重新执行第528条命令ls -a,那么你可以使用!528

    !!     这将会重新执行上一条命令

    !?String?   这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。比如你输入 !?gc? 那第534条命令gcc -v就会执行。

    fc n    这个n表示某个历史命令的序号,这将打开一个文本编辑窗口并显示这条命令。然后你可以编辑修改这条命令,让它满足你的需要。当你退出这个编辑窗口时,该命令就会得到执行。

4.2.4.3 bash shell的配置文件

 分为两部分,系统设定值与个人设定值

 所谓的系统设定值,也就是每个用户进入到bash shell之后先读取的配置文件。默认的配置文件有下列几个:
     /etc/profile:这个文件设定了几个重要变量,例如PATH,USER,MAIL,HOSTNAME,HISTIZE,umask等,也同时规划出/etc/inputrc这个针对键盘热键设定的文件数据内容。您可以在这里设定总体的PATH等信息。同时这个 文件还规划出/etc/profile.d及/etc/inputrc这两个文件,其中,inputrc作用于history(历史指令)。修改这个文件时需要小心,因为所有的用户都会用到这个文件的信息。此外,最好将HISTIZE改为比较小的一个值,这样安全些。
    /etc/bashrc:这个文件用于规划humask,同时规划提示符的内容。这个文件在各个不同版本的Linux里摆放的位置不一样,所以需要查询。
   /etc/man.config:这个文件或许根bash shell没有太大相关性,但是对于系统管理员来说,确实很重要的一个文件!这个文件的内容规范了使用man时man page的路径到哪里寻找。当自己安装程序时,可能需要手动将程序的manual路径放到/etc/man.config中,否则man不能找到相关的说明文档.

  个人的自定义设置在个人目录下的几个隐藏文件中,分别会用到下面的几个文件(注意,下面的文件都是隐藏文档,需要使用ls -al才能都显示出来)。

    ~/.bash_profile:里面定义了个人路径(PATH)与环境变量的文件名称。您可以修改您的个人路径,当然,也可以在          .bashrc这个个人设定变量文件中修改。有的时候可以使用~/.profile或者~/.bash_login等文件在取代这个文件
    ~/.bashrc:这个文件对于个人喜好的bash设定是最重要的,因为我都是在这里设定我的个人变量,例如命令别名的设定,路径的重新定义等。
     ~/.bash_history:这个文件用于将您曾经用过的命令记录下来,而当您再次以上下键搜寻或者直径以history搜寻时,就可以找到曾经用过的指令。需要注意的是:
在这一次执行过程中用到的指令,将在您推出shell之后才会被记录到这个文件中,否则将先被写到高速缓存中;
可以通过history指令将其中的记录搜寻出来
这个文件的指令记录笔数与HISTIZE有关,您可以自行在~/.bashrc中设定,或者直接由root在/etc/profile中设定。
     ~/.bash_logout:这个文件则是在您注销shell的时候BASH为您所做的事情。通常默认是只有清除屏幕这件事,不过,您也可以将一些备份或其他您认为重要的工作的写在这个文件中(例如清空暂存空间),那么当您退出出Linux时,就可以解决一些烦人的事情。
      当修改完个人文件后,配置不能生效,需要使用source 变量配置文件来使配置生效。这样就不用每次重新登录了。

  source 直接读入变量配置文件,既将当前的文件内容读入,不需要重新注销后登陆.

4.2.4.4 通配符与特殊符号

   ?,匹配任意单个字符。

   *,匹配任意字符串。

  [set],匹配set中的任意字符。[!set]是取反操作,匹配不在set中的任意字符,如:


     [a-z]          匹配所有小写字符

     [0-9]          匹配所有数字

     [akz]          匹配a,k,z三个字符

     [.,;]          匹配句点,逗号和分号

     [!abc]         匹配除a,b,c之外的所有字符

     ` `            两个`中间的为先执行的指令
  
    连续输入指令的方式:

   指令间用分号";",command1;command2 意思是不论command1执行结果为何,command2都会被执行
  
   指令间用"&&",command1&&command2 意思是command1成功执行,command2才会被执行

   指令间用"||",command1||command2 意思是command1执行失败,command2才会被执行

4.2.4.5 绝对路径和相对路径

4.2.4.6 命令重定向

   什么是重定向(redirect),就是把你目前的所得数据转到其他地方.

 I/O概念:

  a、 I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9;
 
  b、 常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、 

monitor、monitor有关;

  c、 用 < 来改变读进的数据信道(stdin),使之从指定的档案读进;

  d、 用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;

  e、 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;

  f、 在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;

 基本IO

cmd > file 把 stdout 重定向到 file 文件中;

cmd >> file 把 stdout 重定向到 file 文件中(追加);

cmd 1> fiel 把 stdout 重定向到 file 文件中;

cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;

cmd 2> file 把 stderr 重定向到 file 文件中;

cmd 2>> file 把 stderr 重定向到 file 文件中(追加);

cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);

cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;

cat <>file 以读写的方式打开 file;

cmd < file cmd 命令以 file 文件作为 stdin;

cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。


/dev/null  垃圾设备.收集垃圾

4.2.4.7   管线命令

管线命令"|"仅能处理经由前一个指令传来的正确信息,也就是标准输出信息,对于标准错误信息并没有直接处理能力。


4.2.4.7.1 cut
#cut -d '分隔字符' -f fields

参数

-d: 后面接分隔字符,与-f一起使用

-f: 依据-d的分隔字符将一段信息分割成为数据,用-f取取第几段的意思

-c: 以字符(characters)的单位取出固定字符的区间

eg:
cat /etc/passwd|cut -d ":" -f 1

cat /etc/passwd|cut -c1-20


4.2.4.7.2 sort

 sort命令的功能是对文件中的各行进行排序

  Sort [选项] 文件

说明:Sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用"- ",则表示排序内容来自标准输入。

Sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

改变缺省设置的选项主要有:
 
- u 对排序后认为相同的行只留其中一行。
 
- f 将小写字母与大写字母同等对待。

- r 按逆序输出排序结果。

+posl - pos2 指定一个或几个字段作为排序关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则关键字为从posl到行尾。字段和字符的位置从0开始。

- b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。

- t separator 指定字符separator作为字段分隔符。

eg: cat /etc/passwd|sort -t: +2n
将个人帐号以用户ID排序,(以:为分隔符,第三个为ID,但第一个代号为0,即ID的代号为2)


4.2.4.7.3 wc
wc    计算文件内容的一个工具

参数说明:
-l 多少行
-m 多少字符
-w 多少字(一个字包括多个字符)

eg:cat /etc/passwd|wc -l

这个文件里有多少行

cat /etc/passwd|wc -w

这个文件有多少字

4.2.4.7.3 uniq
uniq   删除重复的行只取一个

tee   使用tee,数据会同时现在屏幕上和文件中
eg:last |tee last.list

last命令的结果同时会出现在屏幕上和last.list文件中

4.2.4.7.4 tr
tr     替换文本
tr [-ds] SET1

-d 删除SET1这个字符串
-s 取代重复的字符

eg:last |tr '[a-z]' '[A-Z]'
将小写改成大写

cat /etc/passwd |tr -d :
将/etc/passwd中的:符号才删除

4.2.4.7.5 split
split  分割文件

split [-bl] 输入文件 输出文件前导字符

-b  以文件size来分
-l  以文件行数来分

eg:split -l 5 /etc/passwd test

会产生testa,testb,tesc等文件.


4.3 压缩指令与正规表示法

4.3.1 压缩指令

4.3.1.1  compress

   解压:uncompress FileName.Z 或compress -d FileName.Z
  压缩:compress FileName

  以compress压缩后,不带其它参数,那么原始文件会被后来的*.Z文件取代

4.3.1.2 bzip2,bzcat

  压缩:bzip2 -z FileName
  解压缩:bzip2 -d FileName.bz2 或bunzip2 FileName.bz2
  读取文件数据: bzcat FileName.bz2(不会解压缩)
 
  以.bz,.bz2,.tbz,.tbz2为后缀的文件都可以用bzip2解压

4.3.1.3 gzip,zcat

 压缩:gzip [-#] FileName -----#为数字,指压缩等级,1最不好,9为最好,6为默认值
 解压缩:gzip -d FileName.gz 或gunzip  FileName.gz
 读取文件数据:zcat FileName.gz(不会解压缩)

4.3.1.4 tar

 tar [-cxtzjvfpPN] 文件与目录 ....
参数:
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
   『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
--exclude FILE:在压缩的过程中,不要将 FILE 打包!

eg:
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc<==打包后,以 gzip 压缩
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc<==打包后,以 bzip2 压缩
# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。
# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~
# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~
# 上述指令在执行的时候,会显示一个警告讯息:
# 『tar: Removing leading `/" from member names』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,
# 就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,
# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,
# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc
# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -cvf - /etc | tar -xvf -
# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!

4.3.1.4 cpio

cpio 命令
[root@linux ~]# cpio -covB > [file|device] <==备份
[root@linux ~]# cpio -icduv < [file|device] <==还原
参数:
-o :将资料 copy 输出到文件或装置上
-i :将资料自文件或装置 copy 出来系统当中
-t :查看 cpio 建立的文件或装置的内容
-c :一种较新的 portable format 方式储存
-v :让储存的过程中文件名称可以在萤幕上显示
-B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
   这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
-d :自动建立目录!由於 cpio 的内容可能不是在同一个目录内,
如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,
就可以自动的将需要的目录建立起来了!
-u :自动的将较新的文件覆盖较旧的文件!

范例:
范例一:将所有系统上的资料通通写入磁带机内!
[root@linux ~]# find / -print | cpio -covB > /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!
范例二:检查磁带机上面有什么文件?
[root@linux ~]# cpio -icdvt < /dev/st0
[root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content
# 第一个动作当中,会将磁带机内的档名列出到萤幕上面,而我们可以透过第二个动作,
# 将所有的档名通通纪录到 /tmp/content 文件去!

范例三:将磁带上的资料还原回来~
[root@linux ~]# cpio -icduv < /dev/st0
# 一般来说,使用 SCSI 介面的磁带机,代号是 /dev/st0 喔!

范例四:将 /etc 底下的所有『文件』都备份到 /root/etc.cpio 中!
[root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio
# 这样就能够备份啰~您也可以将资料以 cpio -i < /root/etc.cpio
# 来将资料捉出来!!!!


4.3.2 正规表示法

grep

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被

看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

^

锚定行的开始 如:'^grep'匹配所有以grep开头的行。

$

锚定行的结束 如:'grep$'匹配所有以grep结尾的行。

匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。

*

匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。

[]

匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。

[^]

匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。

/(../)

标记匹配字符,如'/(love/)',love被标记为1。

/<

锚定单词的开始,如:'//>

锚定单词的结束,如'grep/>'匹配包含以grep结尾的单词的行。

x/{m/}

重复字符x,m次,如:'0/{5/}'匹配包含5个o的行。

x/{m,/}

重复字符x,至少m次,如:'o/{5,/}'匹配至少有5个o的行。

x/{m,n/}

重复字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10个o的行。

/w

匹配文字和数字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。

/W

/w的反置形式,匹配一个或多个非单词字符,如点号句号等。

/b

单词锁定符,如: '/bgrepb/'只匹配grep。


4.4  学习使用SHell scripts

4.4.1 为什么学习脚本

4.4.2 脚本的执行

   1.将文件改为可以执行的属性即x属性,然后执行改文件
   2.文件后缀名为.sh,用sh来执行

   "和'最大的不同在于能不能保存变量内容,单引号里的内容都将变成单纯的字体,而不是特殊的字体.

4.4.3 卷标与运算符declare

   不定义变量,那么该变量是呈现字符串的形式,所以任何变量都是字符串

  number1=2*3+5*13-32+25
 declare number2=2*3+5*13-32+25

在最后输出结果时,$number1为2*3+5*13-32+25,而number2为64

4.4.4 交互式脚本

  最简单的交互式指令是read指令,read功能就是将键盘上输入的内容放到变量中.

  eg:[root@test test]# read name
     VBird
     [root@test test]# echo $name
     VBird

 怎么样定义脚本的参数代号
     [root@test test]myscript. opt1 opt2 opt3 opt4
                       $0      $1   $2   $3   $4
  从上面的例子可以看出,只要变量名称为$0,就表示为myscript也就是说 :

  $0:myscript. 亦即脚本的文件名
  $1:opt1,亦即第一个附加参数
  $2:opt2,
  $3:opt3

  eg:
 root@wwwvbird_shells]# cat parm.sh
#!/bin/bash
echo "This script's nmae => $0"
echo "parameters $1 $2 $3"

[root@www vbird_shells]# sh parm.sh hello1 hello2 hello3
This script's nmae => parm.sh
parameters hello1 hello2 hello3

4.4.5 脚本逻辑判断式与表达式

  逻辑判断式:
关于文件目录:
-f      常用!检测文件是否存在
-d      常用!检测目录是否存在
-b      检测是否为一个block文件
-c      检测是否为一个character文件
-S      检测是否为一个socket标签文件
-L      检测是否为一个符号链接文件
-e      检测某个东西是否存在!可以是任何东西.

关于程序
-G      检测是否由GID所执行的程序拥有
-O      检测是否由UID所执行的程序拥有
-p      检测是否为程序间传送信息的name pipe 或FIFO

关于文件的属性的检测
-r      是否为可读
-w      是否为可写
-x      是否为可执行
-s      是否为非空白文件
-u      是否具有SUID属性
-g      是否具有SGID属性
-k      是否具有sticky bit 属性

两个文件之间的判断比较
-nt    第一个文件比第二个文件新
-ot    第一个文件比第二个文件旧
-ef    第一个文件与第二个文件为同一个文件(如链接文件)

与或非
&&     逻辑与
||     逻辑或

运算符:
=      等于
!=     不等于
<      小于
>      大于
-eq    等于
-ne    不等于
-lt    小于
-gt    大于
-le    小于或等于
-ge    大于或等于
-a     双方都成立(and)
-o     单方成立(or)
-z     空字符串
-n     非空字符串

4.4.6 条件判断

4.4.6.1 if then fi

if [ 条件一 ] &&(||) [ 条件二 ]; then
elif [ 条件三 ] &&(||) [ 条件四 ]; then

else
fi

这里有强调的是
1.在[]中。只能有一个判断式
2.在[]和[]中,可以使用&&或||结合判断式
3.每一个独立的组件之间需要用空格键隔开


4.4.6.2 case .. esac

语法:
case 种类方式(string) in
      种类式一)
            程序执行段
            ;;
      种类式二)
            程序执行段
            ;;
        *)
          echo "Usage: {种类方式一|种类方式二}"
          exit 1
esac

种类方式(string)的格式有两种:

     直接输入与交互式(先read 变量名,在用$变量名)

4.4.6.3 循环

for:
for((条件1;条件2;条件3))

eg:
[root@www vbird_shells]# cat for.sh
#!/bin/bash

declare -i s
for ((i=1; i<=100;i=i+1))
do
        s=s+i
done
echo "The count is ====> $s"


for variable in variable1 variable2 ...

root@wwwvbird_shells]# cat foruser.sh
#!/bin/bash

account=`cut -d ":" -f1 /etc/passwd |sort`
echo "The following is your linux server's account "
for i in $account
do
        echo $i
done


while:
[root@www vbird_shells]# cat while.sh
#!/bin/bash

declare -i i
declare -i s
while [ "$i" != "101" ]
do
        s=s+i
        i=i+1
done
echo "The count is ====> $s"

until:
[root@www vbird_shells]# cat unitl.sh
#!/bin/bash

echo "Press Y/y to stop"
until [ "$yn" = "Y" ] || [ "$yn" = "y" ]
do
        read yn
done

4.4.6.3  调试脚本

#sh [-nvx] scripts
-n :不执行脚本,查询脚本内的语法,若有错则列出
-v :在执行脚本之前,先将脚本的内容输出在屏幕上
-x :将用到的脚本内容显示在屏幕上,与-v稍有不同.

 

 

 

 

 

linux用户管理

 

5.1 账号管理

5.1.1 管理账号

登陆linux主机,输入账号和密码后,liunx会:

1.查找/etc/passwd中是否有这个账号,如果没有就跳出,如果有,则将该账号对应的UID和GID读出来,另外,该账号的根目录与shell设定也一并读出来

2.然后核对密码表,这时linux会进入/etc/shadow中找出对应的账号和UID,然后核对刚刚输入的密码与其密码是否相符

3.一切妥当后,进入SHELL


认识UID,GID,SUID与SGID

UID(拥有者ID),GID(群组ID),SUID(set uid) ,SGID(set gid)

SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二

进制文件,不能用在批处理文件(shell脚本)上

SGID因为是程序在执行过程中拥有文件群组的权限,

认识/etc/passwd和/etc/shadow文件

/etc/passwd:即帐号文件,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。


下面是一个passwd文件的示例(部分摘录):


root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

......

desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin

mengqc:x:500:500:mengqc:/home/mengqc:/bin/bash


在该文件中,每一行用户记录的各个数据段用“:”分隔,分别定义了用户的各方面属性。各个字段的顺序和含义如下:


注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序


(1)注册名(login_name):用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的。这与MSDOS/Windows是不一样的。


(2)口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。


现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc/shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。


此外,需要注意的是,如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。


(3)用户标识号(UID):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要;而对于用户来说注册名使用起来更方便。在某些特定目的下,系统中可以存在多个拥有不同注册名、但UID相同的用户,事实上,这些使用不同注册名的用户实际上是同一个用户。


(4)组标识号(GID):这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。


(5)用户名(user_name):包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。


(6)用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。在Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每个用户配置了自己的主目录。个人用户的文件都放置在各自的主目录下。


(7)命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,如/bin/bash。


需要注意的是,系统管理员通常没有必要直接修改passwd文件,Linux提供一些账号管理工具帮助系统管理员来创建和维护用户账号。


/etc/shadow即 密码文件

root:$1$qnvzih07$LKCr9gldeq1ajos5tuLPH.:13670:0:99999:7:::

bin:*:13670:0:99999:7:::

daemon:*:13670:0:99999:7:::

adm:*:13670:0:99999:7:::

 

 共9栏“用户名:密码:最近更改密码日期:在多少天内不可以修改密码:在多少天内必须修改密

码:在必须修改密码的前多少天提醒用户:当过了必需修改密码的多少天后帐号仍有效:帐号失效日期:保留字段”


/etc/group文件与/etc/gshadow文件

/etc/group文件 /etc/group保存的是用户所在的组的信息,群组文件
/etc/gshadow文件 /etc/group保存的是群组密码.


注意:先增加群组,然后增加用户帐号


5.1.1.1 groupadd

groupadd - 建 立 新 群 组

语法
groupadd [-g gid]  groupname

描述
groupadd 可 指 定 群 组 名 称 来 建 立 新 的 群 组 帐 号 。 需 要 时 可 从 系 统 中 取 得 新 群 组 值 。 groupadd 有 下 列 选 项 可 用 。
-g gid
group的ID 值 。 除 非 使 用 -o 参 数 不 然 该 值 必 须 是 唯 一 , 不 可 相 同 。 数 值 不 可 为 负 。 预 设 为 最 小 不 得 小 于 500 而 逐 次 增 加 。 0~499 传 统 上 是 保 留 给 系 统 帐 号 使 用 。
作用到的文件只有/etc/group和/etc/gshadow文件.

5.1.1.2 groupdel

groupadd - 删 除 群 组

语法
groupdel groupname

注意:删除群组前,请先将该群组的Primary用户删除,primary就是/etc/passwd中其gid设定为这个群组的gid的用户.

5.1.1.3 useradd

[root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group]  -[Mm] [-c 说明栏] [-d home] [-s shell] username
参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
-g :后面接的那个群组名称就是 initial group 啦~
该 group ID (GID) 会被放置到 /etc/passwd 的第四个栏位内。
-G :后面接的群组名称则是这个帐号加入的其它群组。
这个参数会修改 /etc/group 内的相关资料喔!
-M :强制!不要建立使用者家目录
-m :强制!要建立使用者家目录!
-c :这个就是 /etc/passwd 的第五栏的说明内容啦
-d :指定某个目录成为家目录,而不要使用预设值;
-s :后面接一个 shell ,预设是 /bin/bash

建立默认账号(即用useradd username建立的用户)
建立默认账号的基本设定就在/etc/login.defs和/etc/default/useradd中,预先设置的数据都在这两个文件中.
/etc/login.defs 包括电子邮件目录,口令寿命,用户id与组id号,生成主目录的设置,这个文件中的默认变量是一目了然的.不用说,可以通过其它配置文件进一步调整这些设置.
通常默认账号的UID将会取当前在/etc/passwd最大的那个UID+1
/etc/default/useradd内容:
GROUP=100 ---默认用户群组
HOME=/home---默认用户的根目录建立的目录
INACTIVE=-1---是否启动
EXPIRE=  ----是否设定到期时间
SHELL=/bin/bash-----默认shell
SKEL=/etc/skel-----用户根目录的内容
建立一个默认账号,默认的根目录就是/home/username,而这个目录的内容就是由/etc/skel拷贝过去的,所以想让用户的根目录内容变动时,可以直接写入数据到 /etc/skel中.

5.1.1.4 userdel

[root@linux ~]# userdel [-r] username  删除用户账号

    参数:

   -r:将该账号的[home directory]与[/var/spool/mail/username]一并删除

   注意:如果想让一个账号站暂时不启用,那么将/etc/shadow中倒数第一个字段设为0就可以让该账

号无法使用.

   5.1.1.5 chsh 

[root@linux ~]# chsh [-l] [-s shellname] 

参数:

-l:列出当前机器上能用的shell
-s:将当前的shell变为shellname

5.1.1.6 chfn

chfn - 改 变 您 的 finger 讯 息

即改变/etc/passwd中用户说明字段的信息

5.1.1.7 userconf 界面方式新增用户


5.1.2  密码管理与设定 passwd

用户自行修改密码:passwd
root协助用户修改密码:passwd username

5.1.3  用户身份切换

5.1.3.1 su

这个指令一般用来将一般用户转换成超级用户,输入su root后,直接输入密码.

    su [OPTION选项参数] [用户]

  -, -l, ——login 登录并改变到所切换的用户环境;

  -c, ——commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;

       注意1.su root和su - root指令的不同,如果没有-,那么用户环境还是不变,为初始用户的环境,否则,切               换到新的用户环境
           2.su - root 注:这个和su - 是一样的功能;

 
5.1.3.2 sudo

[root @test /root]#sudo [-u username] [command]

-u:将身份变成username的身份

通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su

来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;

sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份

执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;

    sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存出

错时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;

/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可

以用/号来续行,这样看来一个规则也可以拥有多个行;

/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;

别名规则定义格式如下:

  Alias_Type NAME = item1, item2, ……

  或

  Alias_Type NAME = item1, item2, item3 : NAME = item4, item5

  别名类型(Alias_Type):别名类型包括如下四种

  Host_Alias 定义主机别名;

  User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)

  Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;

  Cmnd_Alias 定义命令别名;

  NAME 就是别名,item 是指成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的,item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配

授权规则定义格式如下:

   授权用户 主机=命令动作(意思是授权用户可以在主机里做相应的命令动作,在这里的授权用户,主机,命令动作都可采用上面已经定义好的别名)
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数


实例一:

  beinan ALL=/bin/chown,/bin/chmod

  如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;

  值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码. 取消程序某类程序的执行,要在命令动作前面加上!号

复杂的定义格式:
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]……

  注解:

  凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;

  在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan),授权用户中如果是组,以%username表示.

         eg:/etc/sudoers文件内容如下:
#define alias
HOST_Alias CS=tigger,anchor,piper,moet,sigi
HOST_Alias PHYSICS=eprince,pprince,icarus

Cmnd_Alias Dump=/sbin/dump,/sbin/restore
Cmnd_Alias PRINTING=/usr/sbin/lpc,/usr/bin/lprm
Cmnd_ALias SHELLS=/bin/sh,/bin/tcsh,/bin/bash,/bin/ash,/bin/bsh

#permission
mark,ed  PHYCICS=ALL
herb     CS=/usr/sbin/tcpdump:PHYSICS=(operator)DUMP
lynda    ALL=(ALL)ALL,!SHELLS
%wheel   ALL,!PHYSICS=NOPASSWD:PRINTING

信息解释如下:
1.用户mark,ed在phycics组上的任何计算机上运行任何命令
2.用户herb在CS组上的计算机上只能运行/usr/sbin/tcpdump,在PHYSICS组能以operator运行DUMP组中的命令
3.用户lynda能在所有的机器上运行出SHELLS组以外的任何命令
4.用户组wheel能在除PHYSICS组外的任何计算机上不需要密码执行PRINTING组中的任何命令.

     sudo  [ -u username/#uid] -s command 
     sudo -l
    参数:   
     -l 显示出自己(执行 sudo 的使用者)的权限
     -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
   -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shel
-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )              command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令

eg:
sudo -l 列出目前的权限


5.1.4 用户查询

 id 查询用户的UID,GID及拥有的群组
 finger [-s  #完整列出] username  查询用户的一些相关信息
 groups  查询用户能够支持的群组


5.1.5 手动添加用户(数字账号)

现在支持数字账号的输入

手工添加账号的步骤:
1.建立群组          --------vi /etc/group
2.建立账号          --------vi /etc/passwd
3.将passwd和shadow同步  ----pwconv
4.建立该账号的密码      -----passwd account  
5.建立用户根目录        -----cp -r /etc/skel /home/account
6.更改根目录的属性       ------chown -R account.group /home/account

 

 5.2 磁盘配额

 5.2.1 什么是磁盘配额

  配额就是用来管理硬盘空间的.它是针对整个分区的.
 
  quota 这支程序的限制内容主要分为底下几个部分:
  soft :这是最低限制容量的意思,使用者在宽限期间之内,他的容量可以超过 soft ,但必需要宽限时间之内将磁盘容量降低到 soft 的容量限制之下!
  hard :这是『绝对不能超过』的容量,也就是说, soft 到 hard 之间的容量其实就是宽限的容量啦!可以达到针对使用者的『警示』作用!
  宽限时间:当使用者使用的空间超过了 soft limit ,却还没有到达 hard limit 时,那么在这个『宽限时间』之内,就必需要请使用者将使用的磁盘容量降低到 soft limit 之下!而当使用者将磁盘容量使用情况超过 soft limit 时,『宽限时间』就会自动被启动,而在使用者将容量降低到 soft limit 之下,那么宽限时间就会自动的取消.

 必须在/etc/fstab里给某个分区的挂载选项中加上usrquota参数,并且系统支持quota才能用磁盘配额.
  例子:
先列出几个主要的步骤来说明:
 
开启磁盘的 quota 功能:编辑 /etc/fstab ,使得准备要开放的 quota 磁盘可以支持 quota 啰;
预扫瞄磁盘的使用情况:使用 quotacheck 来扫瞄一下我们要使用的磁盘啰;
建立使用者的 quota :使用 edquota 来编辑每个使用者或群组的可使用空间啰;
启动 quota :使用 quotaon 吧!
 
整个步骤大致上就只有这几步,我们来瞧一瞧如何使用吧!!底下我们以一个简单的范例来进行 quota 的说明啰!整个范例的说明如下:
 
我们假设 test 这部主机里头有 test 与 test2 这两个使用者,且他们两个都挂在 test 这个群组下;
每个使用者总共有 50MB 的磁盘空间(不考虑 inode )限制!并且 soft limit 为 45 MB;
而宽限时间设定为 1 天,也就是说,这四个人可以突破 40MB 的限制,但是在一天之内必须要将多余的档案砍掉,否则将无法使用剩下的空间(也就是说,这个账号大概就不能使用了?);
test 这个群组考虑最大限额,所以设定为 90 MB 好了!
 
整个执行步骤可以照下面来执行看看:
建立 test2 这个使用者:
由于我们之前只有 test 这个使用者挂在 test 群组之中,所以必需要先设定一下 test2 这个使用者!因为他的群组必需是 test 这个,而我们去查了一下 /etc/group 发现 test 的 uid 为 501 ,因此,我们可以这样来设定 test2 呢!
  [root @test root]# useradd –m –g 501 test2
[root @test root]# passwd test2
Changing password for user test2.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
 
开启磁盘的 quota 功能:
由于 quota 需要在 ext 的 Linux 延伸格式档案才可以启动,所以你就必须要将准备开启 quota 的磁盘启动参数,写进入 quota 的磁盘设定才行 ( /etc/fstab )!以我的例子而言,我想要在 /home 底下进行 quota 的限制test, test2 这两个人!正巧 /home 是一个独立的扇区,这可以使用 df 来查询:此外,必需要特别留意的是,最好不要以根目录亦即是 / 进行 quota 啦!否则容易有些问题呢!另外,不要针对 root 做 quota 喔!
  [root @test root]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda1              1904920   1088136    720020  61% /
/dev/hdb1               976344     71504    854444   8% /backup
/dev/hdb2               101540      4252     92048   5% /home
 
嗯!我的 home 是独立的 partition ,并且他的装置名为 /dev/hdb2 ,好了!那么我就必须要启动 /home 这个 /dev/hdb2 的 quota 档案格式,好了!那么由于档案格式的设定是写在 /etc/fstab 里头,所以我们以 vi 来编辑他吧!只要在 /etc/fstab 里头增加了 usrquota, grpquota 就可以啦!『注:请特别留意,这两个项目请『务必』不要写错了!请再写入 /etc/fstab 之前好好的再次检查,因为写错之后,很有可能造成系统无法开机(虽然机率不高,但是有可能!?)』
  [root @test root]# vi /etc/fstab
# device        MountPoint      filesystem      parameters      dump    fsck
/dev/hda1       /               ext3            defaults        1       1
/dev/hda2       swap            swap            defaults        0       0
/dev/hdb1       /backup         ext3            defaults        1       1
/dev/hdb2       /home           ext3            defaults        1       1
none            /dev/pts        devpts          mode=0620       0       0
none            /proc           proc            defaults        0       0
上面的黄色字体改成底下的样子!
/dev/hdb2       /home           ext3            defaults,usrquota,grpquota 1 1
 
 
多了 usrquota,grpquota 注意,由 defaults,usrquota,grpquota 之间都没有空格!
 
这样就算加入了 quota 的磁盘格式了!不过,由于真正的 quota 在读取的时候是读取 /etc/mtab 这个档案的,偏偏这一个档案需要重新开机之后才能够以 /etc/fstab 的新数据进行改写!所以这个时候你可以选择:
 
(1)重新开机==>reboot;也可以选择
(2)重新 remount filesystem 来驱动设定值!
 
我是不太喜欢重新开机的人啦!所以我就这么做:
  [root@test /]# umount /dev/hdb2
[root@test /]# mount -a
[root@test /]# more /etc/mtab
/dev/hda1 / ext3 rw 0 0
none /proc proc rw 0 0
none /proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/pts devpts rw,mode=0620 0 0
/dev/hdb1 /backup ext3 rw 0 0
/dev/hdb2 /home ext3 rw,usrquota,grpquota 0 0
或者以下列的方式重新 mount 所有的磁盘:
[root @test /root ]# mount -a -o remount  <==这个指令可以重新将 /etc/fstab 的咚咚 mount 下来!
 
 
嘿嘿嘿嘿!这样我们就已经成功的将 quota 的功能写入 partition 当中啰!另外,我们这里是以 ext3 这个磁盘格式来测试 quota 的呦!
 
扫瞄磁盘的使用者使用状况,并产生重要的 aquota.group 与 aquota.user:
接着下来就是要来扫瞄一下我们所需要的磁盘到底有没有多余的空间可以让我们来设定 quota 呢?并且将扫瞄的结果输出到这个磁盘的最顶层去(也就是 /home 底下)这个时候就需要 quotacheck 这个指令的帮忙了!使用 quotacheck 就可以轻易的将所需要的数据给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与 aquota.user 这两个档案!
  [root@test /]# quotacheck -avug
quotacheck: Scanning /dev/hdb2 [/home] done
quotacheck: Checked 10 directories and 22 files
[root@test /]# ll /home
total 44
-rw-------    1 root     root         7168 Oct 28 14:05 aquota.group
-rw-------    1 root     root         7168 Oct 28 14:05 aquota.user
drwx------    2 root     root       16384 Oct 22 16:54 lost+found/
drwxr-xr-x    3 test     test         4096 Oct 28 01:45 test/
drwxr-xr-x    3 test2    test         4096 Oct 28 13:37 test2/
 
使用 quotacheck 就可以轻易的将所需要的数据给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与 aquota.user 这两个档案!注:但是很奇怪的是,在某些 Linux 版本中,我不能够以 aquota.user(group) 来启动我的 quota ,真的是很奇怪呢!所以我就另外做了一个 link 档案来欺骗 quota 啰:
  [root @test /root ]# cd /home 
[root @test /root ]# ls -l aquota* 
-rw-------    1 root     root         7168 May  6 22:16 aquota.group 
-rw-------    1 root     root         7168 May  6 22:16 aquota.user 
[root @test /root ]# ln -s aquota.group quota.group 
[root @test /root ]# ln -s aquota.user quota.user
 
启动 quota 的限额!
再来就是要启动 quota 啦!启动的方式也是很简单的!就是使用 quotaon -av 即可:
  [root@test /]# quotaon -av
/dev/hdb2 [/home]: group quotas turned on
/dev/hdb2 [/home]: user quotas turned on
 
注意:要看到上面有个 turned on 的出现,才是真的成功了!
 
编辑使用者的可使用空间:
由于我们有两个使用者要设定,先来设定 test 好了,使用 edquota 就对了
  [root @test /]# edquota –u test
Disk quotas for user test (uid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              32          0          0          8        0        0
将上面的原本设定改为底下的模样:
Disk quotas for user test (uid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              32     40000       50000          8        0        0
 
 
要特别留意的是,上面的黑体数值代表的是 KB 呦!转成 MB 是需要乘上 1024 倍,这里简单的计算一下就好了!这样就算编辑完毕了!接下来我们就需要将这个设定同时复制给 test2 这个家伙!
  [root@test /]# edquota -p test test2
 
接下来要来设定宽限时间,还是使用 edquota !
  [root@test /]# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/hdb2                     1days                  1days
 
将时间改为 1 天(原本是 7days 改成 1days ),好了!查询一下是否真的有设定进去呢?使用 quota -v 来查询
  [root@test /]# quota –vu test test2
Disk quotas for user test (uid 501):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      32   40000   50000               8       0       0
Disk quotas for user test2 (uid 502):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      28   40000   50000               7       0       0
 
特别注意到,由于我们的使用者尚未超过 40 MB,所以 grace ( 宽限时间 )就不会出现啦!这样很够清楚了吧?!
 
编辑群组使用空间:
其实也差不多,还是使用 edquota:
  [root@test /]# edquota -g test 
Disk quotas for group test (gid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              60          0          0         15        0        0
修改成底下这样:
Disk quotas for group test (gid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              60      80000      90000         15        0        0

[root@test /]# quota -vg test
Disk quotas for group test (gid 501):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      60   80000   90000              15       0       0
 
 
设定开机时启动:
开机的时候自动启动的设定在哪里还记得吗?没错!就是在 /etc/rc.d/rc.local 底下:所以你可以使用 vi 在这个档案的最后面加上一行:
  [root @test /root ]# vi /etc/rc.d/rc.local 
/sbin/quotaon -aug 
 
如果要关闭 qutoa 就是用 quotaoff 吧!没错!这样就将 quota 设定完毕了!很简单吧!!


5.3 例行性命令at与crontab

5.3.1 什么例行性命令

   at:      这个工作仅执行一次就从Linux系统的流程中取消
  crontab:  这个工作将持续例行性地做下去

5.3.2 at

at   这个指令其实就是atd这个服务.仅执行一次.
启动这个服务:   #chkconfig --add atd输入at这个动作会将工作流程写入/var/spool/at目录下,然后等待系统执行它.
at指令默认是所有人都能执行,不过root用户可以使用/etc/at.allow与/etc/at.deny这两个文件进行限制:其限制原理:
1.先找寻/etc/at.allow文件,存在于这个文件中的用户才能使用at,不在这个文件中的用户则不能使用at(即使没有写在at.deny文件中)
2.如果没有/etc/at.allow就寻找/etc/at.deny文件,存在于at.deny的用户不能使用at,而不存在at.deny文件中的用户就可以使用at
3.如果两个文件都不存在,则只有root用户可以使用

at的语法
#at [-m] TIME     (输入工作指令)
#atq              (查看当前工作流程)
#atrm [jobnumber] (删除流程)

在输入at之后便进入命令行模式,在这里你可以重复输入命令,但是离开时按下Ctrl+D就可以退出.退出之后,系统显示这个工作流程的编排顺序与用户

5.3.3 crontab

循环执行:  crontab这个循环的例行性命令其实就是cron服务(crond).输入crontab指令之后,会将命令写入/var/spool/cron目录中.
crontab指令的语法:#crontab [-u user][-l | -e | -r]
说明:-u user:  这个指令只有root能输入,查看或编译其他用户的crontab内容
     -l:       列出crontab的内容
     -e:       编辑crontab的内容
     -r:       删除crontab的内容
  编辑crontab的语法格式:
* * * * * command说明(从左至右依次说明)
*:   表示分钟(0-59),*代表每分钟,*/5代表每5分钟,1,3,5,10代表第1,3,5,10分钟的时候
  .*:   表示小时(0-23)
   *:   表示日期(1-31)
   *:   表示月份(1-12)
   *:   表示周(0-6)
   command: 表示要执行的命令

系统的crontab设定:  /etc/crontab编辑系统的crontab只要直接编辑/etc/crontab文件就可以.

注:由于crontab是读取到内存中,所以在修改完/etc/crontab之后可能不会马上执行,这时需要重新启动crond服务. /etc/rc.d/init.d/crond restart
解析/etc/crontab文件的内容
[root@mail bin]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@mail bin]#
MAILTO=root:  即当/etc/crontab文件中的例行性命令发生错误时,会将错误信息或屏幕显示的信息传给root用户,因为root无法在客户端收信,因此,这里通常被改成自己的账号,好及时了解到系统的状况.
01 * * * * root run-parts /etc/cron.hourly: 这一行说的就是在每个小时的第一分钟,系统会以root层级的用户到/etc/cron.hourly目录下执行所有可以执行的文件.root 代表执行的层级为root身份.run-parts表示后面接的/etc/hour.daily是一个目录内的所有可以执行的文件.


5.4 程序与资源管理

5.4.1 man的用法

[root@tsai root]man 5 passwd

查看的是passwd这个命令相关配置文件,设定档的相关信息,即配置文件的相关信息.

[root@tsai root]man  passwd

查看passwd这个命令本身的信息,即介绍怎么使用这个命令及相关的命令参数


5.4.2 linux多用户多任务环境

7个基本窗口,linux默认提供6个文字界面登入窗口,以及一个图形界面

ALT+F1~F7切换提供不同的终端界面.

5.4.3 背景工作管理

5.4.3.1 &与Ctrl+z

让屏幕中的工作(command)在背景下执行,可以使用&

[root @test /root ]# command &
参数说明:
范例:
[root @test /root]# find / -name testing & <==将该执行程序丢到背景执行
[root @test /root]# fg                      <==将该程序叫回屏幕前执行

由于是背景执行的,所以该程序的输出并不会显现在屏幕上,所以需要特别留意输出的信息的管线重导的问题!

另外,如何将该程序叫回来屏幕上面执行呢?就使用 fg 即可

   也可以使用 [Ctrl]+z 来将目前正在进行当中的工作丢到背景底下!

   5.4.3.2 jobs,fg与bg,kill

  知道目前你所进行的背景底下的工作有哪些呢?!很简单,就是使用 jobs 就可以观察到啦.

  [root @test /root ]# jobs
  参数说明:
  范例:
  [root @test /root]# vi .bashrc
   ^Z                              <==在 vi 当中的一般模式中键入[Ctrl]+z
  [1]+  Stopped                 vi .bashrc    <==这里会显示将数据丢到背景当中了!
  [root @test /root]# jobs
  [1]+  Stopped                 vi .bashrc    <==显示有一个工作在背景下,状态为停止。

  那个中括号([])里面的数字就是 jobs 的代号啰

 [root @test /root ]# fg %number
[root @test /root ]# bg %number
参数说明:
%      :后面接数字,表示 jobs 的工作代号
number :就是工作代号
范例:
[root @test /root]# find / -name test
^Z
[1]+  Stopped                 find / -name testing
[root @test /root]# vi .bashrc
^Z
[2]+  Stopped                 vi .bashrc    <==这里会显示将数据丢到背景当中了!
[root @test /root]# jobs
[1]-  Stopped                 find / -name testing
[2]+  Stopped                 vi .bashrc
[root @test /root]# bg %1
[root @test /root]# jobs
[1]-  Running                 find / -name testing &
[2]+  Stopped                 vi .bashrc
[root @test /root]# fg %2
进入 vi 画面啰!
 
 bg 是将『背景当中的程序由 stopped 变成 Running 』的一个手段,至于 fg 『则是将背景中的指令移到屏幕上

来动作』,那你怎么知道你的背景当中有多少的工作(jobs)在进行呢?!就是执行 jobs 来看看背景程序的代号啰!

然后以 bg %number 来将资料在背景中执行,而 fg %number 则是将代号为 number 的程序移动到屏幕前面动作!

  kill
  [root @test /root ]# kill -sigal %number
参数说明:
%number :背景工作的代号,可使用 jobs 查询
signal
    -1  :重新读取一次参数设定档(类似 reload )
    -2  :使用者中断该工作,类似 [Ctrl]+c 来中断一个工作
    -9  :立刻杀掉一个工作,不论该工作是否为僵尸程序
    -15 :停止一个工作(这是默认值)
范例:
[root @test /root]# jobs
[1]+  Stopped                 vi .bashrc
[root @test /root]# kill -9 %1


  5.4.4 程序资源管理

  5.4.4.1 ps

  [root @test /root ]# ps -aux
参数说明:
a   :选择所有的程序列出
u   :所有使用者的程序均列出
x   :所有 tty 的程序列出
范例:
[root @test /root]# ps -aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  1384  468 ?        S    Mar31   0:05 init [3]
root         2  0.0  0.0     0    0 ?        SW   Mar31   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SWN  Mar31   0:00 [ksoftirqd_CPU0]
root         4  0.0  0.0     0    0 ?        SW   Mar31   0:11 [kswapd]

USER:说明该程序是属于哪一个人的;
PID:该程序的代号;
%CPU:代表该程序使用了多少 CPU 资源;
%MEM:代表该程序使用了多少的 RAM ;
VSZ, RSS:占去的 ram 的大小( bytes );
TTY:是否为登入者执行的程序?若为 tty1-tty6 则为本机登入者,若为 pts/?? 则为远程登入者执行的程序
STAT:该程序的状态,( R )为可执行的,( S )为该程序正在睡眠中,就是没有执行了,( T )正在侦测或者是停止了,( Z )僵尸程序,就是 zombie 死掉的程序啦!需要以 kill 除去.
START:该程序开始的日期;
TIME:该程序跑了多久的时间
COMMAND:该程序的内容

  5.4.4.2 top

  [root @test /root ]# top
参数说明:
在执行 top 的程序中,可以输入下面的字符以进行排序
A  :以 age 亦即是执行的先后程序进行排序
T  :由启动的时间排序
M  :以所占的 memory 的大小排序
P  :以所耗用的 CPU 资源排序
范例:
[root @test /root]# top
 11:55pm  up 8 days,  7:40,  1 user,  load average: 0.22, 0.14, 0.10
71 processes: 69 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 24.6% user,  3.7% system,  0.0% nice, 71.5% idle
Mem:   255892K av,  222300K used,   33592K free,       0K shrd,   48084K buff
Swap:  289128K av,    8184K used,  280944K free                  110472K cached
  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
 9898 root       9   0  5976 5976  1364 S     5.5  2.3   0:00 mrtg
 4744 apache    14   0  5312 5052  3764 S     2.1  1.9   0:16 httpd
 9189 apache    14   0  4520 4256  3752 S     1.9  1.6   0:01 httpd
 9187 apache    10   0  4544 4276  3800 S     1.7  1.6   0:01 httpd
 9212 mysql      9   0  7280 4772  2716 S     0.7  1.8   0:00 mysqld
 9888 root      12   0  1064 1064   832 R     0.7  0.4   0:00 top

5.4.4.3 free
使用 free 来检查目前内存的使用情况.
[root @test /root ]# free
参数说明:
-k  :以 KBytes 来显示内存
-m  :以 MBytes 来显示内存
范例:
[root @test /root]# free
             total       used       free     shared    buffers     cached
Mem:        255892     222076      33816          0      49072     112272
-/+ buffers/cache:      60732     195160
Swap:       289128       7572     281556

5。4。4。4 sar
root @test /root ]# sar [-u] [-r] 秒数 次数
参数说明:
-u  :看 CPU 使用的情况
-r  :看 memory 使用的情况
秒数:几秒钟观测一次?
次数:共观测几次
范例:
[root @test /root]# sar -u 1 3
12:10:28 AM       CPU     %user     %nice   %system     %idle
12:10:29 AM       all      0.00      0.00      0.00    100.00
12:10:30 AM       all      0.00      0.00      0.00    100.00
12:10:31 AM       all     12.00      0.00      1.00     87.00
Average:          all      4.00      0.00      0.33     95.67
[root @test /root]# sar -r 1 3
12:11:11 AM kbmemfree kbmemused  %memused kbmemshrd kbbuffers  kbcached kbswpfree kbswpused  %swpused
12:11:12 AM     24416    231476     90.46         0     51068    112536    281556      7572      2.62
12:11:13 AM     24420    231472     90.46         0     51068    112536    281556      7572      2.62
12:11:14 AM     24392    231500     90.47         0     51068    112540    281556      7572      2.62
Average:        24409    231483     90.46         0     51068    112537    281556     


5。4。4。5 kill

root @test /root ]# kill -signal PID
参数说明:
那个 -signal 跟上面的 kill 一样:
-9  :杀掉该程序
-15 :停止该程序!
范例:
[root @test /root]# kill -9 2380

说明:
要杀掉一个程序的时后,自然需要知道该程序的 PID 才行!

5。4。4。6 uname

[root @test /root ]# uname [-apnr]
参数说明:
-a :所有的系统信息均列出
-p :列出 CPU 信息
-n :列出 host name
-r :列出 kernel 版本信息
范例:
[root @test /root]# uname -a
Linux tsai.adsldns.org 2.4.18 #2 Mon Mar 25 21:51:51 CST 2002 i586 unknown


5。4。5 程序的优先级

[root @test /root ]# ps -l
  F S   UID   PID  PPID  C PRI  NI ADDR    SZ WCHAN  TTY          TIME CMD
100 S     0  5624  5606  0  70   0    -   608 wait4  pts/0    00:00:00 bash
000 R     0  6944  5624  0  76   0    -   769 -      pts/0    00:00:00 ps
UID 代表执行者的身份;
PID 代表这个程序的代号;
PPID 代表这个程序是由那个程序发展出来的,亦即是父程序;
PRI 代表这个程序『可被执行的优先级』越小越早被执行!
NI 代表这个程序的 nice 值!

nice 值呢?就是『系统可被执行的修正数值!』
PRI(new) = PRI(old) + nice

如此一来,则当 nice 值为负值的时候,那么该程序将会提前被执行!就是变的优先处理啰!
只有具有 root 权限的身份者,可以将程序的 nice 调为负值

一般使用者可用 nice 值 : 0 ~ 19
root 管理员可用 nice 值: -20 ~ 19

nice
语法: [root @test /root ]# nice [-n number] command
参数说明:
-n :就是后面那个 number 即为 nice 值!
范例:
[root @test /root]# nice -n -5 find / -name core > /tmp/core

 

renice
renice
语法: [root @test /root ]# renice [number] PID
参数说明:
范例:
[root @test /root]# ps -aux
[root @test /root]# renice 5 234
说明:
这个 renice 的功能就不太一样了!由于 renice 是『将一个正在进行当中的程序的优先级降低』,所以必须要:
先取得该程序的 PID 才行!


所以啰,通常 renice 都与 ps 相互配合才对!先找处某个程序的 PID 之后,才来重新的设定其 nice 值!


5。4。6 信息管理

dmesg
语法: [root @test /root ]# dmesg
参数说明:
范例:
[root @test /root]# dmesg | more
说明:
在开机的时候你会发现有很多的讯息出现吧,例如 CPU 的形式、硬盘、光盘型号及硬盘分割表等等。但是讯息都是『刷』的一声就跑过去了!这些讯息有时候对于系统管理员是很重要的,因为他提供了系统的信息


uptime
语法: [root @test /root ]# uptime
参数说明:
范例:
[root @test /root]# uptime
 11:27pm  up 9 days,  7:12,  1 user,  load average: 0.07, 0.12, 0.14
说明:
知不知道你的 Linux 主机已经开机多久了?还有,过去 1, 5, 15 分钟的系统平均 loading 是多少呢?呵呵!使用 uptime 就对了!在上面的例子中,执行 uptime 之后,显示目前时间是 11:27pm, 而系统已经开机了 9 天又 7:12 之多,目前有一个使用者在在线,过去 1, 5, 15 分钟系统平均负荷为 0.07, 0.12, 0.14

语法: [root @test /root ]# who
[root @test /root ]# w
参数说明:
范例:
[root @test /root]# who
root     pts/0    Aug  2 20:43
[root @test /root]# w
  8:48pm  up 4 days,  5:08,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     pts/0    192.168.1.2       8:43pm  0.00s  0.38s   ?     -
 
说明:
这是用来视察目前在系统上的使用者指令,你也可以使用 w 这个指令来下达动作。基本上,who 与 w 的功能是相同的,只是 who 仅列出使用者名称与登入时间,至于 w 则会列出使用者的
来源地址(IP):就是 FROM 那一项即是IP;
登入时间:即是 LOGIN@ 那一项;
工作项目:就是 WHAT 那一项!
此外,不知道你有没有发现,在使用 w 的时候,开头会有一个讯息,『 8:48m up 4days ....』那个是 uptime 的输出结果!

    不过,可能由于执行程序的关系,常常会忘了到底自己的真实身份,这个时候 whoami 就可以解救你啦!如上面所示,虽然我的身份是 root ,不过,实际上我是 test 的啦!使用 su 变换身份而已

    语法: [root @test /root ]# last
参数说明:
-number :number 为数字,如果您的登入讯息太多了,可以使用这个指令!
范例:
[test @test /root]# last -5
test    pts/0        192.168.1.2      Tue Apr  9 20:34 - 20:35  (00:01)
test    pts/0        192.168.1.2      Tue Apr  9 20:14 - 20:30  (00:15)
test    ftpd21546    192.168.1.2      Tue Apr  9 02:55 - 03:06  (00:10)
test    ftpd15813    192.168.1.2      Tue Apr  9 01:20 - 01:21  (00:00)
test    pts/0        192.168.1.2      Mon Apr  8 20:14 - 00:27  (04:13)
wtmp begins Tue Apr  2 01:12:26 2002
说明:
要知道有没有被入侵,常常使用的就是 last 这个指令啰!包括 ftp, telnet, ssh 都会被纪录在这个讯息当中,不过目前是只有记录一个月的量!这个指令真的是不错用的!常常可以发现是否有不正常的人物登入信息呢

 

 

 

linux系统管理员

6.1  开关机流程与多重启动

6.1.1 开机流程

基本的流程为:

1.加载 BIOS 的硬件信息;

  记录在bios里的主机的硬件数据加载.

2.读取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)开机信息;

  硬盘的引导数据,在主引导扇区, Kernel Loader主要的功能在于选择硬盘上的系统,让你的硬件认识核心,以便加载内核

    3.加载 Kernel 的操作系统核心信息;
 
      加载内核

4.Kernel 执行 init 程序并取得 run-level 信息;

  取得系统登陆状态,由/sbin/init 来加载 /etc/inittab 的信息,获得登陆状态 .

  [root @test /root]# vi /etc/inittab
#   0 - halt (Do NOT set initdefault to this)  关机 
#   1 - Single user mode  单人使用(系统有问题时候的登入状况) 
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking) 多人但无网络 
#   3 - Full multiuser mode 文字界面登入的多人系统 
#   4 - unused      系统保留 
#   5 - X11           X-Windows 图形界面登入的多人系统 
#   6 - reboot (Do NOT set initdefault to this)  重新开机 

id:3:initdefault:

    『单人维护模式 ( run-level 为 1 )』?如果你有玩过 Windows 的话,那么你在开机的时候如果按下 F8 时,不是会出现

一些什么『安全模式』啦、『正常开机』啦或『 MS-DOS 模式』等等的进入 Windows 的状态吗?尤其是当你不正常关机的时候,

Windows 预设就会以『安全模式』来启动 Windows 啰!Windows 的『安全模式』几乎不加载一些复杂的模块,让你的 Windows

一定可以开机成功!那么 Linux 的维护模式状态即是使用单人模式( 就是 run_level 为 1 啦!)
  
    5.init 执行 /etc/rc.d/rc.sysinit 档案;

    需要将主机的信息给他读进去 Linux 系统!而 Linux 系统的第一个数据内容就是 /etc/rc.d/rc.sysinit 这个档案,这个档

案的内容包括了==>设定预设路径( PATH )、设定主机名称、执行 /etc/sysconfig/network 所记录的网络信息、挂载 /proc

这个保存在内存当中的主机基本讯息、以及其它几个 Linux 操作系统最基本的几个信息.

6.启动核心的外挂式模块 (/etc/modules.conf);

modules.conf有两个作用,一是告诉OS哪些模块开机自动加载,二是指明设备和模块的对应关系,比如:alias eth0

8139too,它告诉OS,设备eth0的驱动模块是8139too

7.init 执行 run-level 的各个批次档( Scripts );

run-level 所需要加载的模块并不相同,所以系统早就为不同的 run-level 设定了一些批次档( scripts )来做这件事,

而 run-level 早就在前面的时候以 /etc/inittab 当中取得,也就是说『当你以 文字模式 ( run-level=3 ) 启动 Linux 时,你

的系统在经过 BIOS、 MBR、 Kernel、 init、/etc/rc.d/rc.sysinit 之后,就会进入 /etc/rc.d/rc3.d 来启动一些服务』啰!

不过,需要注意的是,在 rc3.d (或其它目录下 rc0.d ~ rc6.d )目录中 S 开头的档案为执行该服务, K 为开头的档案则是杀

掉该服务的意思。那么那些数字代表的意义为何?那就是启动的顺序

8.init 执行 /etc/rc.d/rc.local 档案;

在 Linux 系统执行完了大部分的开机程序之后,接着下来就是要执行你的 Linux 主机的个人化设定.

9.执行 /bin/login 程序;

    10.登入之后开始以 Shell 控管主机。

 

6.1.2:变换预设的登入模式

你在安装的过程中选择了文字接口登入,但是后来却想以图形接口登入系统,应该怎么做?!简单的很!就直接修改 /etc/

inittab 这个档案的内容即可!如何做呢?!以 vi 或者是其它的文书编辑软件,进入 /etc/inittab 这个档案,

id:3initdefault: 里头的 3 改成 5 ,那么在下次的登入时就会变成是图形接口啰
 
    6.1.3:Lilo

   Lilo 的设定与安装方面必需要分成两个步骤,分别是设定 /etc/lilo.conf 这个设定档,设定完毕之后,还必需要给他改写

进去 MBR 或者是 Super block 才行!
 
  6.1.3.1 配置文件/etc/lilo.conf

  基本上, lilo 是加载 Linux 核心的重要开机数据的安装程序,他的参数设定档案就放在 /etc/lilo.conf 里头,那么我们来

看一看里面有什么设定参数吧,基本上他的设定参数有点像底下这样,可以分为两部分,一个是整体的设定方面,一个则是每一

个开机设定的核心档案:
 
[root @test linux]# vi /etc/lilo.conf 

# 第一部份,整体的设定部分
prompt   <==强制出现 boot 的开机讯息啰! 
Compact  <==可以整合一些读取的扇区,可以保持 map 较小,相当适合软盘开机时使用 
delay=50 <==如果有多重开机的话,可以设定这个延迟时间,单位0.1秒 
timeout=50 <==与 delay 有类似的关系!也是 0.1 秒,如果 5 秒内没有按键盘,直接以第一个 image 开机。 
default=linux-2.4.18 <==如果开机的过程中,出现了boot之后,使用者没有动作,
                          则以此设定的核心开机,与底下的label需对应 
boot=/dev/hda         <==Lilo 的开机信息写入到 /dev/hda 这颗硬盘的 MBR 当中。 
map=/boot/map         <==用来说明 local 主机的地图信息啰! 
install=/boot/boot.b <==关于开机区的讯息(boot sector),不用理他没关系! 
Linear                <==在较大容量的硬盘使用时,可以加入这一个参数试试看! 
lba32                 <==这个东西也是在大容量的硬盘使用时候会需要的参数! 
password=1234567      <==设定密码!如果为了安全起见,可以设定您的 lilo 密码哩! 
message=/boot/message <==那个 LILO 的讯息就是在里面出现的啦!

# 第二部分,个别的开机设定部分,一个 image 或 other 均代表一个开机设定!
image=/boot/vmlinuz-2.4.7-10     <==核心档案啦! 
        label=linux-2.4.7        <==请注意!label 前面以 [tab] 按键来作为分隔!
                                    这个字眼则是显示在 boot 里头挑选项目。 
        initrd=/boot/initrd-2.4.7-10.img 
        read-only              <==开机扇区挂载为只读!这是预设状况,实际在
                                    挂加载 Linux 系统时,会重新挂载成可写! 
        root=/dev/hda1           <==挂载成 / 这个 root 目录的磁盘! 
other=/dev/hdb1                  <==如果是『非 Linux 核心』就以 other 来设定
                                    开机的磁盘扇区! 
    label=Windows2k          <==同样的要有 label 来表示这个开机扇区的名称!

 
注意一下上面那几个咚咚:
 
delay 与 timeout 的设定是 0.1 秒,所以 delay=50 表示延迟时间为 5 秒!

linear 与 lba32 通常用在 SCSI 或者是较大的硬盘,例如扇区超过 1024 磁道的硬盘,可以使用这个项目来除错!不过,如果

是小于 8GB 的硬盘,这两个东西有没有设定就没有什么影响了!

default 需要设定成底下几个 image 或者是 other 的 label 才成!这个地方最常被忘记!因为常常会记得修改 label ,但是

忘记跟着改变 default 的内容!此外,如果你想要修正开机预设的操作系统选项,在这里改啦!

password 的用途在于安全防护方面,不过有个困扰,就是『如果你的计算机因为不正常关机(如断电后重开)而在电源恢复的时

候重新开机时,则会卡在这个阶段无法直接进入 Linux 系统』,因为你必须提供 password 才能继续的工作呀!

boot 显示的是开机的扇区选择! 这里也蛮重要的,如果你想要安装在 MBR 里面的话,如同上面的书写模式,就是写入 /dev/

hda ,后面不要加上每个 partition 的代码!但是,如果你是想写入 Super Block ,例如我想要写入的是 hda5 这个 Logical

的 partition 时,那么这里就必需要改写为 /dev/hda5 啰!所以,您应该只要一看到这个 boot 后面接的内容,就会知道那个

安装的扇区是 MBR 还是 Super Block 啰!

image 可以设定成多数个!如果你的 Linux 系统有多个核心档案的时候,例如我们刚刚编译完成的一个新的核心,然而你又不想

丢掉旧核心,就可以设定成两个不同核心的开机系统啰

  6.1.3.1 安装 lilo

既然设定好了,自然就是要安装他啰!安装的方式很简单,直接输入 lilo 即可!
  [root @test root]# lilo
Added linux *       <==有打星号的是『预设的开机设定档!』
Added failsafe
Added linux-test

   6.1.4 GRUB

     6.1.4.1 设定档 /boot/grub/menu.lst
  
     6.1.4.2  在 grub 里面,有一点是比较让人觉得不适应的,那就是他的硬盘代号与 lilo 还有 Linux 传统的代号不一样~他的代号主要有点像这样:
 
(hd0,0)

hd 指的是 IDE 的硬盘,而里面的 0,0 代表什么呢?第一个 0 代表他是第一个 IDE 的 master ,而第二个 0 代表他是第一块 partition 的代号,所以呢,这个代号就是 hda1 啦!所以,我们可以得到底下这个对应表:
  装置 Lilo Grub
IDE1 master hda, hda1, hda2 (hd0), (hd0,0), (hd0,1)
IDE1 slave hdb, hdb1, hdb2 (hd1), (hd1,0), (hd1,1)
IDE2 master  hdc, hdc1, hdc2 (hd2), (hd2,0), (hd2,1)
IDE2 slave  hdd, hdd1, hdd2  (hd3), (hd3,0), (hd3,1)


来谈谈这两种安装的方式:基本上的动作就是:
 
使用 root [磁盘代号] 选择开机根目录 / 所在磁盘代号;
使用 setup [磁盘代号] 选择 MBR 或 Super block 直接安装进去!
使用 quit 就可以离开 grub 了


6.2 套件管理RPM与Tarball

   ·RPM
  目前使用最广泛的套件管理程式之一,利用资料库管理的方式来进行套件的安装,具有相当容易的操作介

面,而且套件查询验证的功能相当强大,不过麻烦的地方在于他的属性相依的问题;

  ·Tarball
  直接以原始码( source code )经过编译后,进行安装。在安装上面具有较大的灵活度,可以随时更改使用

者喜好的参数。但是需要其他的套件协助,例如 gcc compiler, kernel-header, make 套件等等,并且在反安

装上面具有一定程度的困难度;

  6.2.1 RPM

  6.2.1.1 RPM及srpm简介
 
    RPM 全名是『 RedHat Package Manager 』简称则为 RPM,是以一种资料库记录的方式来将你所需要的套件

安装到你的 Linux 主机的一套管理程式

    还有 SRPM 这个东西! SRPM 是什么呢?他也是一种 RPM 啦!但是由于里面连同当初编译之前的原始码都

在里头,所以可以进行重新编译的动作。通常 SRPM 的附档名是 ****.src.rpm 这一种档案格式。由于 SRPM

包含了原始码及参数设定档案,所以在安装之前则必须重新的编译建立起包装的资讯档案套件才行!当然啰,

如果在编译的过程中发生了问题,也可以藉由里头的原始码更动来修正问题的所在呢!所以说, RPM 与 SRPM

最大的差异就是在于有没有包含原始码的程式啦!

    rpm和srpm的格式:  

    xxxxxxxxx.rpm  <==RPM 的格式,已经经过编译且包装完成的 rpm 档案;
 
    xxxxx.src.rpm  <==SRPM的格式,包含未编译的原始码信息。
 
那么我们怎么知道这个套件的版本、适用的平台、打包的次数呢?呵呵!只要透过档名就可以知道了!例如

rp-pppoe-3.1-5.i386.rpm 这的档案的意义为:
 
 rp-pppoe -  3.1    -   5  .   i386    .rpm

 套件名称   套件的版本信息   释出的次数   适合的硬件平台  附文件名 
 
 适合的 硬件平台:

这是个很好玩的地方,由于 RPM 可以适用在不同的操作平台上,但是由于不同的平台设定的参数还是有所差异

性!并且,我们可以针对比较高阶的 CPU 来进行最佳化参数的设定,所以就有所谓的 i386, i586, i686 与

noarch 等的文件名称出现了!
 
    i386 几乎适用于所有的 x86 平台,不论是旧的 pentum 或者是新的 pentum-IV 与 K7 系列的 CPU等等,

都可以正常的工作!那个 i 指的是 Intel 兼容的 CPU 的意思,至于 386 不用说,就是 CPU 的等级啦!

i586 就是 586 等级的计算机,那是哪些呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU

( socket 7 插脚 ) 等等的 CPU 都算是这个等级;

   i686 在 pentun II 以后的 Intel 系列 CPU ,及 K7 以后等级的 CPU 都属于这个 686 等级!

noarch 就是没有任何硬件等级上的限制。
 
需要额外说明的是, i386 的档案可以在任何的机器上面安装,不论是 586 或者是 686 的机器,但是 i686

则不一定可以使用于 386 或者是 586 的硬件上面,这是因为 i686 的 RPM 档案在编译的时候,主要是针对

686 硬件等级的 CPU 来进行最佳化编译,而 386/586 等级的硬件可能由于无法支持该最佳化参数,所以无法

使用呢!另外,在 686 的机器上使用 i686 的档案会比使用 i386 的档案,效能可能比较好一些!无论如何,

使用 i386 应该就是比较没有问题的啦

   6.2.1.2  RPM的相关指令:
 
   1.安装

   [root@test root]# rpm -ivh rp-pppoe-3.1-5.i386.rpm
Preparing...     ####################################### [100%]
   1:rp-pppoe    ####################################### [100%]
# -i :install 的意思
# -v :察看更细部的安装信息画面
# -h :以安装信息列显示安装进度,例如上面的 # 字符号!
 
# 如果要安装两个以上的套件时,可以这样:
[root@test root]# rpm -ivh a.i386.rpm b.i386.rpm *.rpm
# 后面可以接多个套件!

   2.升级

   使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可( 注:vh 的功能仍是在于显示细部信息与

安装进度而已 )!不过,这两种升级方式是不太一样的:

  -Uvh 后面接的套件即使没有安装过,则系统将予以直接安装;若后面接的套件有安装过旧版,则系统自动

更新至新版;

   -Fvh 如果后面接的套件并未安装到您的 Linux 系统上,则该套件不会被安装;亦即只有安装至您 Linux

系统内的套件会被『升级』!

  3.查询
 
   a. 从系统查询(由 /var/lib/rpm 数据库取得的数据)
[root @test /root]# rpm -q rp-pppoe                 <==仅列出 rp-pppoe 这个套件的版本;
[root @test /root]# rpm -qa                     <==列出所有安装过的套件与版本;
[root @test /root]# rpm -qi rp-pppoe            <==列出 rp-pppoe 这个套件的详细信息
[root @test /root]# rpm -ql rp-pppoe            <==列出 rp-pppoe 这个套件安装的文件与路径;
[root @test /root]# rpm -qf /etc/rc.d/init.d/pppoe  <==查询 pppoe 这个文件属于哪一个套件?
 
   b. 由档案查询档案的内容
[root @test /root]# rpm -qpi rp-pppoe-2.6-5.src.rpm  <==查询这个套件的详细信息;
[root @test /root]# rpm -qpl rp-pppoe-2.6-5.src.rpm  <== 查询这个套件里面有多少文件

  4.验证

[root @test /root]# rpm -V rp-pppoe <==单纯检查 rp-pppoe 这个已安装套件的文件内容与原先是否相同
[root @test /root]# rpm -Va           <==检查所有的 /var/lib/rpm 底下的数据库与 Linux 系统下是否相同的文件

 5.反安装与重建数据库

 [root @test /root]# rpm -e re-pppoe  <==解安装 rp-pppoe 
 
 [root @test /root]# rpm --rebuilddb  <==重建数据库


 6.2.2 Tarball

 6.2.2.1 Tarball简介
 
  其实tarball 就是以 *.tar.gz 压缩之后的 binary 原始文件.

  常我们会给您这样的建议:
 
最好将 tarball 的原始数据解压缩到 /usr/local/src 当中;

安装时,最好安装到 /usr/local 这个预设路径下;

考虑未来的反安装步骤,最好将每个套件单独的安装在 /usr/local 底下,例如安装 rp-pppoe-2.6.tar.gz

时,则可以指定该套件需要安装于 /usr/local/rp-pppoe 当中,如此一来,如果该套件会将所有的数据都写入

/usr/local/rp-pppoe 当中,因此,未来如果要移除该套件,只要将该目录删除即可视为成功的移除了!

不过单独安装某个套件在某一特定路径下的作法,会导致当有 man page 的时候,使用预设的 MANPATH 会找不

到相关的说明档案内容。这个时候就必须要将 man page 的路径加到 /etc/man.config 档案中了!否则使用

man 也查询不到指令的使用方法的。以上面的例子为例,如果是安装了 /usr/local/rp-pppoe 当中,通常 man

page 会放在 /usr/local/rp-pppoe/man 当中,所以,您就必需要在 /etc/man.config 里面差不多 40~50 行

左右的地方,加入底下这一行:
MANPATH /usr/local/rp-pppoe/man
这样就可以使用 man 来查询资料啰!

 6.2.2.2 TarBall 安装需要的套件

  1.kernel sources files: /usr/src/linux目录下的文件,该目录是需要安装或编译过核心才会存在的目录
 
  2.make及autoconfig等套件:需要安装,使参数配置文件(通常就是Makefile文件)顺利执行

  3.gcc或cc等编译软件:如果没有编译软件,自然也就无法将源代码编译成可执行文件,所以至少要有一种编

译器,在liunx下,通常使用gcc套件.注意,gcc和上面的make等套件都在安装linux时的软件开发包里.

 6.2.2.3 TarBall 安装的基本步骤

 1.将Tarball在/usr/local/src中解压缩
 
 2.在软件解压缩的路径下建立Makefile参数配置文件;

 3.以make这个程序并使用该目录下的Makefile作为它的参数配置文件,进行make(编译或其它)动作

 4.以make这个程序,并以Makefile参数配置文件依据install项的指定将其安装到正确的路径.

 Tarball软件的安装指令输入方式:

 1. ./configure  :这个步骤就是建立Makefile文件,即参数配置文件,这个步骤的相关信息应该参考该目录下

的README或INSTALL相关的文件

 2. make clean   : make会读取Makefile中关于clean的工作。这个步骤不一定会有,但最好是有,因为在进

行编译的时候,会产生一些*.o文件,例如有个abc.c的源代码,经过编译后会变成abc.o文件,我们称这个文件

为目标文件。这些文件如果之前己经过编译并保留下来的话,那么这次再编译的时候就不会编译该文件(即这次

不会重新编译,还是会采用上次*.o的文件),但由于我们可能己经修改了部分参数,因此该文件的编译结果事

实上应该会有所不同。故为了避免这样的结果,所以通常需要执行这个步骤

 3. make       :make会依据Makefile中的预设工作进行编译的行为,使用make就是要将源代码编译为可执行文

件,而这个可执行文件会放置在当前所在目录下,尚未被安装到预定目录中。

 4.make install: 通常这是最后的安装步骤,make会依据Makefile文件中关于install的项将上一步骤编译完

成的数据安装到预定目录中,就完成安装了。

 5.特别注意,上面的步骤是一步一步进行的,其中只要一个步骤无法成功,后续步骤就没有办法进行,因此,

要确保每一个步骤都是成功的。


 6.2.2.4  TarBall的移除与升级

     Tarball的移除难度跟当初设定参数文件时的安装目录与这个套件本身要求的放置目录有关.通常一个套件

在安装时会将它的内容分到四个目录中存放,分别是:etc(代有设定),lib(代表函数),man(代表在线说明文档),

bin(代表执行文件).

     以apache为例,如果在安装时使用默认值,在这些文件相应的会存放在/etc/httpd,/usr/lib,/usr/bin,/

usr/share/man中,这时在移除时就有会有困难了.但是如果在安装时指定了路径,如/usr/local/apache,则相应

的存放目录为:/usr/local/apache/etc,/usr/local/apache/lib,/usr/local/apache/man,/usr/local/apache/

bin.这时在移除时,只要删除/usr/local/apache就可以了.


 6.2.3  选择RPM还是Tarball

1.优先选择RPM

如果版本支持RPM安装并且没有严重的相依属性问题时,选择RPM安装是一个比较好的选择.此外,当一个套件经过

大幅修改,通常旧的RPM与新的RPM之间几乎无法完全兼容,升级或移除过程就很麻烦。

2.简易方法

使用Tarball可以自行编译并且安装在不同的路径,只要在启动时启动适当的版本,不同版本的套件可以同时存

在于一个系统中,而且可以通过选择启动文件来启动不同的版本。


6.3 核心编译与多重启动(这一章很难用上,暂时学个大概)

6.3.1 什么是核心

  linux Distribution

  kernel

  linux核心放在什么地方

6.3.2 为什么更新核心

    核心的编译重点在于『你要你的 Linux 作什么?』,是啦!如果没有必要的工作,就干脆不要加在你的核

心当中了!这样才能让你的 Linux 跑得更稳、更顺畅!这也是为什么我们要编译核心的最主要原因了!,核心

编译的最主要目地是想让系统更加稳定.

6.3.3 核心的版本与何处下载最新核心

6.3.3.1 核心的版本

    [root@linux ~]# uname -r

    2.6.13-1.1532_FC4

    [主版本].[次版本].[释出版本(release)]-[修改版本]

    整个版本的定义当中,最需要注意的是前两个,亦即主版本与次版本。 相同的[主][次]版本,代表他使用

的函式库是差不多的,所以,可以直接升级到较高的[释出版本]上。 值得注意的是,由于核心功能的增加速度

实在太快了,一般商业用户与一般使用者, 根本不需要很多的测试中的功能,因此,[主][次]版本中,依据

[次版本]的奇偶数, 又分为底下两种版本:

    如果[次版本]是奇数的话,例如 2.3, 2.5 等等,那表示他是一个『 测试性质功能的核心版本 』, 这种

核心通常是在推出稳定版本的核心之前,用来给 developer ( 核心维护更新测试者!) 测试用的!虽然功能较

为强大,但是由于是属于测试性质,所以可能会有些许的 bugs 也说不定;

    如果[次版本]是偶数的话,例如 2.4, 2.6 等等,那表示他是一个经过测试之后才释出的 『稳定核心版

本,这种核心较为稳定不容易出错, 比较适合一般个人或者是商业使用!

     这里还是要再提一遍!就是『 2.4 与 2.6 是两个具有相当大差异的核心版本, 两者之间使用到的函式

库基本上已经不相同了,所以在升级之前,如果您的核心原本是 2.4.xx 版,那么就升级到 2.4.xx 版本的最

新版,不要由 2.4.xx 直接升级到 2.6.xx 版.


6.3.3.2 核心下载 的 地点


6.3.4  开始设定核心的内容


6.4 基本的系统设定指令

6.4.1 基本的系统设定工具

   1. Mandrake :drakconf

   2. Red Hat  :setup,修改/etc/sysconfig目录中的文件

6.4.2 系统启动服务工具

6.4.2.1.service
  
   service命令用于管理Linux操作系统系统中服务的命令,让该项服务立即启动

   service [service name ][start|stop|restart]

1. 声明:这个命令不是在所有的linux发行版本中都有。主要是在redhat、fedora、mandriva和centos中。
 
此命令位于/sbin目录下,用file命令查看此命令会发现它是一个脚本命令。

3. 分析脚本可知此命令的作用是去/etc/init.d目录下寻找相应的服务,进行开启和关闭等操作。

4. 开启httpd服务器:service httpd start

start可以换成restart表示重新启动,stop表示关闭,reload表示重新载入配置。

5. 关闭mysql服务器:service mysqld stop


6.4.2.2 .chkconfig(注意这里的name是必须存在于/etc/rc.d/init.d目录下的)

chkconfig --list [name]                        -----列出run-level情况下该套件是否被开机启动
 
chkconfig --add name                        ----------增加一个service_name在开机时启动       

chkconfig --del name                        --------删除一个开机启动服务
 
chkconfig [--level levels] name    [on|off|reset]           ----改变指定服务的的启动信息

chkconfig [--level levels] name

eg:决定在运行级 2 禁止crond,

# chkconfig --level 2 crond off
(root执行)会在运行级 2 关掉 crond。

运行级文件

每个被chkconfig 管理的服务需要在对应的init.d 下的脚本加上两行或者更多行的注释。

第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那

么使用 - 代替运行级。

第二行对服务进行描述,可以用/ 跨行注释。

例如,random.init 包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for /
# higher quality random number generation.

表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80。

 

 6.4.3 检验软件正确性:md5sum

 6.4.4 核心模块的管理

 

6.5 认识系统服务

6.5.1 什么是daemon 

   操作系统的后台进程,通常具有root安全级别许可权。守护程序通常隐藏在后台,直至被某个事件(例如特

定的时间或日期、时间间隔、收到电子邮件等)触发后它才会进入活动状态。

   daemons 目前有两种基本的模式,分别是 stand_alone 与 super daemon 两种方式: 
 
   stand_alone : 就字面上的意思来说,stand alone 就是『独立的启动』的意思,也就是说,该 daemon

启动之后,就直接常驻在内存当中啰!他虽然会一直的占用系统的资源,但最大的优点就是,他会一直启动的

啦!所以当有要求来的时候,他就会很快速的响应啰!常常用在这一种 daemon 的网络服务如常见的 httpd

   super daemon : 相对于 stand alone 的执行方式,这一种服务的启动方式则是藉由统一的一个 daemon

来负责唤起该服务!这一个统一负责的 daemon 就是 inet 这支服务啦!不过,在后来的 Linux 发展套件中,

则是使用 xinet 这个设定.

6.5.1.2 /etc/services

    在 Linux 系统里面有个文件在说明哪个窗口与服务的  ( services and ports ) 对应!呵呵!那就是鼎

鼎大名的 /etc/services 这个文件.

6.5.1.3命名规则

    服务的名称被建立之后,被挂上 Linux 使用时,通常在服务的名称之后会加上一个 d ,例如例行性命令的建立的 at, 与 cron 这两个服务,通常会被称为 atd 与 crond,这个 d 代表的就是 daemon 的意思


6.5.2 系统的Daemons启动文件放在哪里

  stand alone : 这个放置在 /etc/rc.d/init.d/ 这个目录里面,几乎所有的 RPM 安装的套件之启动项目都

在这里啦!
 
  super daemon : 这个工作的那一支服务其实就是 xinet 或者是 inet 啦!请注意, xinet 也是一个

daemon 呢!他是 stand alone 启动的,也就是他会一直在监听大家的需求,所以 xinet 的启动 scripts 写

在 /etc/rc.d/init.d/xinetd 这个 scripts 里面啰!但是挂在这个 daemon 里头的服务之设定项目呢?嗯!

就是写在 /etc/xinetd.conf 与 /etc/xinetd.d/ 这个目录里面的任何文件!

6.5.3 解析xinetd.conf

    一般,在/etc/rc.d/init.d中的脚本都是相应的RPM提供的.可以由这个super daemon来管理我们的服务.

 默认的/etc/xinetd.conf文件的内容:

[root@rtest ~]# more /etc/xinetd.conf
#
# Simple configuration file for xinetd
#
# Some defaults, and include /etc/xinetd.d/

defaults
{
        instances               = 60
        log_type                = SYSLOG authpriv
        log_on_success          = HOST PID
        log_on_failure          = HOST
        cps                     = 25 30
}

includedir /etc/xinetd.d

如果没有指定services(defaults),那么就用{}中的设定来执行

includedir /etc/xinetd.d 这行表示,在/etc/xinetd.d里的所有文件都放入xinetd.conf中,这样一来,我们可

以一个一个设定不同的项,而不需要将所有的服务都写在xinetd.conf中.即每个服务有一个设定好的配置文件.

参看下面的目录下的文件.

[root@test ~]# cd /etc/xinetd.d
[root@test xinetd.d]# ll
总用量 120
-rw-r--r--  1 root root 560 10月 19 23:26 chargen
-rw-r--r--  1 root root 580 10月 19 23:26 chargen-udp
-rw-r--r--  1 root root 239 10月 19 23:26 cups-lpd
-rw-r--r--  1 root root 417 10月 19 23:26 daytime
-rw-r--r--  1 root root 437 10月 19 23:26 daytime-udp
-rw-r--r--  1 root root 339 10月 19 23:26 echo
-rw-r--r--  1 root root 358 10月 19 23:26 echo-udp
-rw-r--r--  1 root root 322 10月 19 23:26 eklogin
-rw-r--r--  1 root root 325 10月 19 23:26 gssftp
-rw-r--r--  1 root root 309 10月 19 23:26 klogin
-rw-r--r--  1 root root 322 10月 19 23:26 krb5-telnet
-rw-r--r--  1 root root 307 10月 19 23:26 kshell
-rw-r--r--  1 root root 317 10月 19 23:26 rsync
-rw-r--r--  1 root root 495 10月 19 23:26 time
-rw-r--r--  1 root root 515 10月 19 23:26 time-udp

[root@test xinetd.d]# more echo
# default: off
# description: An xinetd internal service which echo's characters back to clients. /
# This is the tcp version.
service echo
{
        disable         = yes
        type            = INTERNAL
        id              = echo-stream
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
}              

这里表示的就是echo这个服务运行时的一些属性.

6.5.4 TCP_Wrappers:/etc/hosts.allow与/etc/hosts.deny

除了xinetd外,还有一个方法限制利用某些服务进入linux主机,即/etc/hosts.allow与/etc/hosts.deny.

这两个配置文件的格式如下:
 
  #服务进程名:主机列表:当规则匹配时可选的命令操作
 
  server_name:hosts-list[:command]
 
  /etc/hosts.allow控制可以访问本机的IP地址,/etc/hosts.deny控制禁止访问本机的IP.如果两个文件的

配置有冲突,以/etc/hosts.allow为准

    ALL:127.0.0.1 #允许本机访问本机所有服务进程
 
  smbd:192.168.0.0/255.255.255.0 #允许192.168.0.网段的IP访问smbd服务
 
  ALL关键字匹配所有情况,EXCEPT匹配除了某些项之外的情况


6.5.5 系统开启的服务

6.5.5.1 netstat

       netstat命令的功能是显示网络连接、路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作。

 该命令的一般格式为:
   netstat [选项]
  
   命令中各选项的含义如下:
   -a 显示所有socket,包括正在监听的。
    -c 每隔1秒就重新显示一遍,直到用户中断它。
    -i 显示所有网络接口的信息,格式同“ifconfig -e”。
   -n 以网络IP地址代替名称,显示出网络连接情形。
   -r 显示核心路由表,格式同“route -e”。
    -t 显示TCP协议的连接情况
    -u 显示UDP协议的连接情况。
  -v 显示正在进行的工作。


6.5.5.2 chkconfig

6.5.5.3 各个服务的简单说明.

 

6.6 分析登陆文件

6.6.1 什么是登陆文件,为什么要分析登陆文件
  
     登陆文件就是记录系统活动记录的几个文件,例如:何时、何地(来源 IP )、何人( login

name )、做了什么动作,另外就是系统在什么时候做了什么样的行为时,发生了什么样的事件等等

      常见的登陆文件:
  
      1./var/log/secure  记录登入系统存取数据的文件
  
      2./var/log/wtmp  记录登入者的讯息数据,由于本档案已经被编码过,所以必须使用 last 这个指令

来取出档案的内容

      3./var/log/messages  这个档案相当的重要,几乎系统发生的错误讯息(或者是重要的信息)都会记

录在这个档案中
 
      4./var/log/boot.log   记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息;

      5./var/log/maillog    纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录

      6./var/log/cron       这个是用来记录 crontab 这个例行性服务的内容的

      7./var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log

分别是几个不同的网络服务的记录文件

6.6.2 linux登陆文件的规划

      针对 log 档案来设计的服务有这两支:
     
      syslogd:进行系统或者是网络服务的登录文件记录工作;

      logrotate:将旧的数据更名,并且建立新的登录文件,以保持登录文件的『新鲜』,并视设定将最旧的

登录文件删除。

6.6.2.1 syslog

    linux默认使用syslog程序来记录系统的登陆数据.它能接受访问系统的日志信息并且根据

/etc/syslog.conf 配置文件中的指令处理这些信息.

使用下列的句法来说明:

<服务名称.信息等级>   <存放或显示的地点>

.服务名称:例如像mail,http,cron等服务名称

.信息等级:emerg 或 panic 该系统不可用
 
 alert 需要立即被修改的条件
 
 crit 阻止某些工具或子系统功能实现的错误条件
 
 err 阻止工具或某些子系统部分功能实现的错误条件
 
 warning 预警信息
 
 notice 具有重要性的普通条件
 
 info 提供信息的消息
 
 debug 不包含函数条件或问题的其他信息
 
 none 没有重要级(即不记录到文件),通常用于排错
 
 * 所有级别,除了none

  与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。


.存放地点:通常使用的都是记录文件.但是也可以输出到设备。

注意:当我们的等级使用info时,任何大于info等级的(含info等级)之上的信息都会被记到后面的文件中.

eg:

1.  mail.info   /var/log/maillog

将mail的相关数据写到var/log/maillog中.

2. syslog允许人们使用三种限定符对优先级进行修饰:星号(*)、等号(=)和叹号(!)。
  
    星号 (*)的含义是“把本项服务生成的所有日志消息都发送到操作动作指定的地点”。就像它在规则表

达式里的作用一样,星号代表“任何东西”。在前面给出的例子 里,“mail.*”将把所有优先级的消息都发送

到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果 完全一样,后者也

将把所有类型的消息发送到指定地点。

    等号(=)的含义是“只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点”。比如说,

可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要

发送特定优先级别的消息时,就要使用等号限定符。

    就像它在编程时的用法一样,等号意味着等于且仅等于。叹号(!)的含义是“把本项服务生成的所有日志

消息都发送到操作动作指定的地点,但本优先级的消息不 包括在内”。比如说,这条syslog配置行将把除info

优先级以外的所有消息发送到/var/log/mail文件里:
   
   mail.*;mail.!info/var/log/mail

    在这个例子里,“mail.*”将发送所有的消息,但“mail.!info”却把info优先级的消息排除在外。就像它在编程时的用法一样,叹号意味着“非”。

   mail.*   /var/log/mail
  
   mail.=warn  /var/log/message

     在这个例子里,“mail.*”将发送所有的消息,但“mail.=warn”却把mail中的warn的消息单独记录在

/var/log/message中。


6.6.2.2 登陆文件的安全设定

    可以将syslog记录的文件利用chattr设定a属性,这样使这个文件只能新增而无法删除.

6.6.2.3 登陆文件的轮替 :logrotate

    登陆文件的轮替是在规定的时间到了后,进行日志文件的轮替行为.即这个logrotate程序是挂在cron下进

行的.
 
    logrotate程序的参数配置文件:/etc/logrotate.conf  /etc/logrotate.d 

    logrotate周期性地旋转日志文件,可以周期性地把每个日志文件重命名成一个备份名字,然后让它的守护

进程开始使用一个日志文件的新的拷贝。这就是为什么在/var/log/下看到许多诸如maillog、maillog.1、

maillog.2、boot.log.1、boot.log.2之类的文件名。它由一个配置文件驱动,该文件是/etc/logroatate.

conf,

     Red Hat Linux 缺省安装的文件内容是:

# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# send errors to root
errors root
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own lastlog or wtmp --we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
/var/log/lastlog {
monthly
rotate 1
}
# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行
weekly 指定所有的日志文件每周转储一次。

第五行
rotate 4 指定转储文件的保留 4份。

第七行
errors root 指定错误信息发送给root。

第九行
create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和原来的文件一样的权限。

第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件

include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个

主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以实现日志的转存.

6.6.3 登陆文件分析 :dmesg;last

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值