Linux系统目录结构

登录系统后,在当前命令窗口下输入 ls / 你会看到

以下是对这些目录的解释:
/bin binBinary的缩写这个目录存放着最经常使用的命令
/boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件
/dev devDevice(设备)的缩写该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的
/etc这个目录用来存放所有的系统管理所需要的配置文件和子目录
/home用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的
/lib这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件几乎所有的应用程序都需要用到这些共享库
/lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件
/media linux系统会自动识别一些设备,例如U光驱等等,当识别后,linux会把识别的设备挂载到这个目录下
/mnt系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了
/opt 这是给主机额外安装软件所摆放的目录比如你安装一个ORACLE数据库则就可以放到这个目录下默认是空的
/proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all。
/root该目录为系统管理员,也称作超级权限者的用户主目录
/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序
/selinux 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的
/srv 该目录存放一些服务启动之后需要提取的数据
/sys 这是linux2.6内核的一个很大的变化该目录下安装了2.6内核中新出现的一个文件系统 sysfs sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统针对设备的devfs文件系统以及针对伪终端的devpts文件系统该文件系统是内核设备树的一个直观反映当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统种被创建
/tmp这个目录是用来存放一些临时文件的
/usr 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录
/usr/bin:系统用户使用的应用程序
/usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序
/usr/src:内核源代码默认的放置目录
/var这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下包括各种日志文件

linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc
上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。 /var
这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里


下一章  如何正确关机

更改文件的权限

更改文件的权限,也就是更改所属主所属组以及他们对应的读写执行权限
1更改所属组 chgrp
语法:chgrp [组名] [文件名]



这里用到了groupadd 命令,其含义即增加一个用户组该命令在以后章节中做详细介绍,你只要知道它是用来增加用户组的即可
2更改文件的所属主 chown
语法:chown [ -R ] 账户名
文件名
chown [ -R ] 账户名:组名
文件名
这里的-R选项只作用于目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件全部更改

useradd 是增加一个账户,以后会详细介绍上例中,首先建立一个目录test,然后在test目录下创建一个普通文件test2,因为是以root的身份创建的目录和文件,所以所属主以及所属组都是root。chown user1 test 这使test的目录所属主由root变为了user1 ,然后test目录下的test2文件所属主以及所属组还是root。接着 chown –R user1:testgroup test 这样把test连同test目录下的test2 的所属主以及所属组都改变了
3改变用户对文件的读写执行权限 chmod

linux中为了方便更改这些权限,linux使用数字去代替rwx ,具体规则为r: 4 w:2 x:1 -:0 举个例子,-rwxrwx---用数字表示就是 770,具体是这样来的:
rwx = 4+2+1=7; rwx= 4+2+1=7; --- = 0+0+0=0
chmod 语法: chmod [-R] xyz 文件名
(这里的xyz,表示数字)
-R 选项作用同chown,级联更改
值得提一下的是,在linux系统中,默认一个目录的权限为 755,而一个文件的默认权限为644.



如果你创建了一个目录,而该目录不想让其他人看到内容,则只需设置成 rwxr----- (740) 即可
chmod 还支持使用rwx的方式来设置权限!从之前的介绍中我们可以发现,基本上就九个属性分别是(1)user (2)group (3)others 三群啦!那么我们就可以藉由 u, g, o 来代表三群的属性!此外, a 则代表 all 亦即全部的三群!那么读写的属性就可以写成了 r, w, x!也就是可以使用底下的方式来看:

现在我想把一个文件设置成这样的权限 rwxr-xr-x (755),使用这种方式改变权限的命令为

另外还可以针对u, g, o, a增加或者减少某个权限(读,写,执行),例如



另外linux下还有两个比较特殊的权限s和t,请点击linux下文件的特殊权限s和t

chattr 修改文件的特殊属性

语法: chattr [+-=][ASaci [文件或者目录名]
+-= :分别为增加减少设定
A:增加该属性后,文件或目录的atime将不可被修改;
S:增加该属性后,会将数据同步写入磁盘中;
a:增加该属性后,只能追加不能删除,非root用户不能设定该属性;
c:自动压缩该文件,读取时会自动解压;
i:增加后,使文件不能被删除重命名设定连接写入新增数据;





增加i属性后不能在该目录中建立文件





增加a属性后,只能追加不能删除
lsattr
列出文件/目录的特殊属性

语法: lsattr [-aR] [文件/目录名]
-a:类似与ls -a 选项,即连同隐藏文件一同列出;
-R:连同子目录的数据一同列出





在上例中,test4是在test3目录增加a属性后建立的,所以test4也有a属性,通过这个例子可以看出,chattr 的属性是级联生效的,不仅对当前目录生效而且会对目录下的文件同样生效

安装源码包

其实,在linux下面安装一个源码包是最常用的,笔者在日常的管理工作中,大部分软件都是通过源码安装的安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件如果你读得懂这些源代码,那么你就可以去修改这些源代码自定义功能,然后再去编译成你想要的使用源码包的好处除了可以自定义修改源代码外还可以定制相关的功能,因为源码包在编译的时候是可以附加额外的选项的

源码包的编译用到了linux系统里的编译器,常见的源码包一般都是用C语言开发的,这也是因为C语言为linux上最标准的程序语言。Linux上的C语言编译器叫做gcc,利用它就可以把C语言变成可执行的二进制文件所以如果你的机器上没有安装gcc就没有办法去编译源码你可以使用 yum install -y gcc 来完成安装
安装一个源码包,通常需要三个步骤:
1. ./config 在这一步可以定制功能,加上相应的选项即可,具有有什么选项可以通过”./config --help ”命令来查看在这一步会自动检测你的linux系统与相关的套件是否有编译该源码包时需要的库,因为一旦缺少某个库就不能完成编译只有检测通过后才会生成一个Makefile文件
2. make 使用这个命令会根据Makefile文件中预设的参数进行编译,这一步其实就是gcc在工作了
3. make install 安装步骤,生成相关的软件存放目录和配置文件的过程
上面介绍的3步并不是所有的源码包软件都一样的,笔者以前也曾经遇到过,安装步骤并不是这样,也就是说源码包的安装并非具有一定的标准安装步骤这就需要你拿到源码包解压后,然后进入到目录找相关的帮助文档,通常会以INSTALL或者README为文件名所以,你一定要去看一下下面笔者会编译安装一个源码包来帮你更深刻的去理解如何安装源码包
1. 下载一个源码包



这里要提一下,建议以后你把所有下载的源码包放到/usr/local/src/目录下,这个并不是必须的,只是一个约定方便你和你的同事将来更好的去运维这台服务器。wget即为下载的命令,后边跟源码包的下载地址该地址为笔者从网上找的一个apache的下载地址
2. 解压源码包



一般的源码包都是一个压缩包,如何解压一个.tar.gz的包

创建/修改一个用户的密码 “passwd [username]”

等创建完账户后,默认是没有设置密码的,虽然没有密码,但该账户同样登录不了系统只有设置好密码后方可登录系统
为用户创建密码时,为了安全起见,请尽量设置复杂一些你可以按照这样的规则来设置密码:a. 长度大于10个字符;b. 密码中包含大小写字母数字以及特殊字符(*&等);c. 不规则性(不要出现root, happy, love, linux, 123456, 111111等等单词或者数字);d. 不要带有自己名字公司名字自己电话自己生日等





passwd 后面不跟用户名则是更改当前用户的密码,当前用户为root,所以此时修改的是root的密码,后面跟test则修改的是test的密码

在linux下搜索一个文件

windows下有一个搜索工具,可以让我们很快的找到一个文件,这是很有用的然而在linux下搜索功能更加强大

which
用来查找可执行文件的绝对路径

在前面章节中已经多次用到该命令,需要注意的一点是,which只能用来查找PATH环境变量中出现的路径下的可执行文件这个命令用的也是蛮多的,有时候我们不知道某个命令的绝对路径,which一下很容易就知道了



当查找的文件在PATH变量中并没有时,就会报错
whereis 通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件

语法: whereis [-bmsu] [文件名称]
-b:只找binary 文件
-m:只找在说明文件manual路径下的文件
-s:只找source来源文件
-u:没有说明档的文件



说明:whereis 笔者几乎很少用到,如果你感兴趣请深入研究
locate
类似于whereis,也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里后边直接跟文件名如果你的linux没有这个命令,请安装软件包 mlocate ,这个软件包在你的系统安装盘里,后缀名是RPM,随后介绍的find命令会告诉你如何查找这个包如果你装的CentOS你可以使用这个命令来安装 yum install –y mlocate 。 前提是你的CentOS能连互联网至于yum这个命令如何使用,到后续章节你自然会明白如果你刚装上这个命令,初次使用会报错



这是因为系统还没有生成那个文件列表库你可以使用updatedb 命令立即生成(更新)这个库如果你的服务器上正跑着重要的业务,那么你最好不要去运行这个命令,因为一旦运行,服务器的压力会变大这个数据库默认情况下每周更新一次所以你用locate命令去搜索一个文件,正好是在两次更新时间段内,那你肯定是得不到结果的你可以到/etc/updated.conf 去配置这个数据库生成(更新)的规则。locate命令笔者用的也并不多,所以你只要明白有这么一个东西即可你用到时再去深究其用法吧
find 这个搜索工具是笔者用的最多的一个,所以请你务必要熟悉它

语法: find [路径] [参数] 下面介绍几个笔者经常用的参数
-atime +n :访问或执行时间大于n天的文件
-ctime +n :写入更改inode属性(例如更改所有者权限或者连接)时间大于n天的文件
-mtime +n :写入时间大于n天的文件

看到这里,你对这三个time是不是有些晕了,那笔者就先给你介绍一下这三个time属性

文件的 Access timeatime 是在读取文件或者执行文件时更改的文件的 Modified timemtime 是在写入文件时随文件内容的更改而更改的文件的 Create timectime 是在写入文件更改所有者权限或链接设置时随 Inode 的内容更改而更改的因此,更改文件的内容即会更改 mtime ctime,但是文件的 ctime 可能会在 mtime 未发生任何变化时更改,例如,更改了文件的权限,但是文件内容没有变化如何获得一个文件的atime mtime 以及ctime
ls -l 命令可用来列出文件的 atime、ctime mtime。
ls -lc filename         列出文件的 ctime
ls -lu filename         列出文件的 atime
ls -l filename          列出文件的 mtime   
atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息而这是加了 noatime 取消了, 不代表真实情況反正, 這三個 time stamp 都放在 inode mtime, atime 修改inode 就一定會改, 既然 inode 改了, ctime 也就跟著要改了
继续讲find常用的参数
-name filename 直接查找该文件名的文件,这个使用最多了



-type type :通过文件类型查找文件类型在前面部分已经简单介绍过,相信你已经大体上了解了。type 包含了 f, b, c, d, l, s 等等后续的内容还会介绍文件类型的



什么是shell

简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作

笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是shBourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢?
1)记录命令历史

我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令这些命令保存在用户的家目录中的.bash_history文件中有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中

与命令历史有关的有一个有意思的字符那就是”!”常用的有这么几个应用:(1!! (连续两个”!”),表示执行上一条指令;(2!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令



2)指令和文件名补全

在本教程最开始笔者就介绍过这个功能了,记得吗?对了就是按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名连续按两次tab键,系统则会把所有的指令或者文件名都列出来
3)别名

前面也出现过alias的介绍,这个就是bash所特有的功能之一了我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令如果不想用了,还可以用unalias解除别名功能直接敲alias会看到目前系统预设的alias




看到了吧,系统预设的
alias指令也就这几个而已,你也可以自定义你想要的指令别名。alias语法很简单,alias [命令别名]=[’具体的命令’]。
4)通配符

bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符



5)输入输出从定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>,稍后会详细介绍
6)管道符

前面已经提过过管道符”|”,就是把前面的命令运行的结果丢给后面的命令
7)作业控制

当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c

用户身份切换

Linux系统中,有时候普通用户有些事情是不能做的,除非是root用户才能做到这时就需要临时切换到root身份来做事了





test账号登录linux系统,然后使用su - 就可以切换成root身份,前提是知道root的密码





你可以使用echo $LOGNAME来查看当前登录的用户名





su 的语法为: su [-] username
后面可以跟”-”也可以不跟,普通用户su不加username时就是切换到root用户,当然root用户同样可以su到普通用户





”-“后会连同用户的环境变量一起切换过来。su test 后虽然切换到了test用户,但是当前目录还是切换前的/root目录,然后当用su - test时切换用户后则到了test的家目录/home/test。当用root切换普通用户时,是不需要输入密码的这也体现了root用户至高无上的权利

su是可以切换用户身份,如果每个普通用户都能切换到root身份,如果某个用户不小心泄漏了root的密码,那岂不是系统非常的不安全?没有错,为了改进这个问题,产生了sudo这个命令使用sudo执行一个root才能执行的命令是可以办到的,但是需要输入密码,这个密码并不是root的密码而是用户自己的密码默认只有root用户能使用sudo命令,普通用户想要使用sudo,是需要root预先设定的,即,使用visudo命令去编辑相关的配置文件/etc/sudoers。如果没有visudo这个命令,请使用” yum install -y sudo”安装





默认root能够sudo是因为这个文件中有一行” root ALL=(ALL) ALL” 在该行下面加入” test ALL=(ALL) ALL”就可以让test用户拥有了sudo的权利如果每增加一用户就设置一行,这样太麻烦了所以你可以这样设置





把这一行前面的”#”去掉,让这一行生效它的意思是,wheel这个组的所有用户都拥有了sudo的权利接下来就需要你把想让有sudo权利的所有用户加入到wheel这个组中即可




你不妨跟笔者试一下,非常有意思

linux的文件系统

搞计算机的应该都知道windows的系统格式化硬盘时会指定格式,fat 或者 ntfs。而linux的文件系统格式为Ext2,或者Ext3 。早期的linux使用Ext2格式,目前的linux都使用了Ext3。 Ext2文件系统虽然是高效稳定的。但是,随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了,因为Ext2文件系统是非日志文件系统。这在关键行业的应用是一个致命的弱点。Ext3文件系统是直接从Ext2文件系统发展而来,Ext3文件系统带有日志功能,可以跟踪记录文件系统的变化,并将变化内容写入日志,写操作首先是对日志记录文件进行操作,若整个写操作由于某种原因 (如系统掉电) 而中断,系统重启时,会根据日志记录来恢复中断前的写操作,而且这个过程费时极短。目前Ext3文件系统已经非常稳定可靠。它完全兼容Ext2文件系统。用户可以平滑地过渡到一个日志功能健全的文件系统中来。这实际上了也是ext3日志文件系统初始设计的初衷。

Linux文件系统在windows中是不能识别的,但是在linux系统中你可以挂载的windows的文件系统,linux目前支持MS-DOS,VFAT,FAT,BSD等格式。如果你使用的是Redhat或者CentOS,那么你不要妄图挂载NTFS格式的文件到linux下,因为它不支持NTFS。虽然有些版本的linux支持NTFS,但不建议使用,因为目前的技术还不成熟。

Ext3文件系统为Redhat/CentOS默认使用的文件系统,除了Ext3文件系统外,有些linux发行版例如SuSE默认的文件系统为reiserFS ,Ext3 独特的优点就是易于转换,很容易在 Ext2 和 Ext3 之间相互转换,而具有良好的兼容性,其它优点 ReiserFS 都有,而且还比它做得更好。如高效的磁盘空间利用和独特的搜寻方式都是Ext3 所不具备的,速度上它也不能和 ReiserFS相媲美,在实际使用过程中,reiserFS 也更加安全高效,据说反删除功能也不错。

ReiserFS 的优势在于,它是基于 B*Tree 快速平衡树这种高效算法的文件系统,例如在处理小于 1k 的文件比 Ext3 快 10 倍。再一个就是 ReiserFS 空间浪费较少,它不会对一些小文件分配 inode,而是打包存放在同一个磁盘块 (簇) 中,Ext2/Ext3 是把它们单独存放在不同的簇上,如簇大小为 4k,那么 2 个 100 字节的文件会占用 2 个簇,ReiserFS 则只占用一个。当然 ReiserFS 也有缺点,就是每升级一个版本,都要将磁盘重新格式化一次。

变量

前面章节中笔者曾经介绍过环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可你可以使用echo命令显示变量的值



除了PATH, HOME, LOGNAME外,系统预设的环境变量还有哪些呢?



使用env命令即可全部列出系统预设的全部系统变量了不过登录的用户不一样这些环境变量的值也不一样当前显示的就是root这个账户的环境变量了下面笔者简单介绍一下常见的环境变量:
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 前用户Shell类型
LANG 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PWD 当前目录
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来



限于篇幅,笔者在上例中并没有把所有显示结果都截图。set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来用户自定义变量?是的,用户自己同样可以定义变量



虽然你可以自定义变量,但是该变量只能在当前shell中生效,不信你再登录一个shell试试?



使用bash命令即可再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shellmyname变量还在那要想设置的变量一直生效怎么办?有两种情况:
1
要想系统内所有用户登录后都能使用该变量

需要在/etc/profile文件最末行加入 “export myname=Aming” 然后运行”source /etc/profile”就可以生效了此时你再运行bash命令或者直接su - test账户看看



2)只想让当前用户使用该变量

需要在用户主目录下的.bashrc文件最后一行加入“export myname=Aming” 然后运行”source .bashrc”就可以生效了这时候再登录test账户,myname变量则不会生效了上面用的source命令的作用是,讲目前设定的配置刷新,即不用注销再登录也能生效

笔者在上例中使用”myname=Aming”来设置变量myname,那么在linux下设置自定义变量有哪些规则呢?
a. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;
b. 变量名只能由英数字以及下划线组成,而且不能以数字开头;
c. 当变量内容带有特殊字符(如空格)时,需要加上单引号;



有一种情况,需要你注意,就是变量内容中本身带有单引号,这就需要用到双引号了



d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号;



e. 变量内容可以累加其他变量的内容,需要加双引号;



在这里如果你不小心把双引号加错为单引号,将得不到你想要的结果


通过上面几个例子也许你能看得出,单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用

在前面的例子中笔者多次使用了bash命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下


pstree
这个指令会把linux系统中所有进程通过树形结构打印出来限于篇幅笔者没有全部列出,你可以直接输入pstree查看即可在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令,笔者曾经在前面用过


export
其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量


在最后面连同我们自定义的变量都被声明了
前面光讲如何设置变量,如果想取消某个变量怎么办?只要输入”unset 变量名即可



unset abc后,再echo $abc则不再输出任何内容

查看磁盘或者目录的容量 df 和 du

df
查看已挂载磁盘的总容量使用容量剩余容量等,可以不加任何参数,默认是按k为单位显示的





df常用参数有 –i -h -k –m
-i 使用inodes 显示结果





-h 使用合适的单位显示,例如G





-k -m 分别为使用KM为单位显示






简单介绍一下,你看到的相关数据。Filesystem 表示扇区,也就是你划分磁盘时所分的区;1K-blocks/1M-blocks表示以1K/1M为单位;Used Available 分别是已使用和剩余;Use% 就是已经使用的百分比,如果这个值大于90% 那么你就应该注意了,磁盘很有可能马上就会变满的;Mounted on 则表示该分区(扇区)所挂载的地方

du 用来查看某个目录所占空间大小

语法:du [-abckmsh] [文件或者目录名] 常用的参数有:
-a:全部文件与目录大小都列出来如果不加任何选项和参数只列出目录(包含子目录)大小





-b:列出的值以bytes为单位输出,默认是以Kbytes





-c:最后加总





-k:以KB为单位输出
-m:以MB为单位输出
-s:只列出总和
-h:系统自动调节单位,例如文件太小可能就几K,那么就以K为单位显示,如果大到几G,则就以G为单位显示笔者习惯用 du –sh filename 这样的形式




linux文件类型

在前面的内容中简单介绍了普通文件(-),目录(d)等,在linux文件系统中,主要有以下几种类型的文件。

1)正规文件(regular file):就是一般类型的文件,当用ls –l 查看某个目录时,第一个属性为”-“的文件就是正规文件,或者叫普通文件。正规文件又可分成纯文字文件(ascii)和二进制文件(binary)。纯文本文件是可以通过cat, more, less等工具直接查看内容的,而二进制文件并不能。例如我们用的命令/bin/ls 这就是一个二进制文件。

2)目录(directory):这个很容易理解,就是目录,跟windows下的文件夹一个意思,只不过在linux中我们不叫文件夹,而是叫做目录。ls –l 查看第一个属性为”d”。

3)连接档(link):ls –l 查看第一个属性为 “l”,类似windows下的快捷方式。这种文件在linux中很常见,而且笔者在日常的系统运维工作中用的很多,所以你要特意留意一下这种类型的文件。在后续章节笔者会介绍。

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

* linux 文件后缀名

对于后缀名这个概念,相信你不陌生吧。在linux系统中,文件的后缀名并没有具体意义,也就是说,你加或者不加,都无所谓。但是为了容易区分,linux爱好者们都习惯给文件加一个后缀名,这样当用户看到这个文件名时就会很快想到它到底是一个什么文件。例如1.sh, 2.tar.gz, my.cnf, test.zip等等,如果你首次接触这些文件,你也许会感到很晕,没有关系,随着学习的深入,你就会逐渐的了解这些文件了。笔者所列举的几个文件名中1.sh代表它是一个shell script ,2.tar.gz 代表它是一个压缩包,my.cnf 代表它是一个配置文件,test.zip 代表它是一个压缩文件。

另外需要你知道的是,早期Unix系统文件名最多允许14个字符,而新的Unix或者linux系统中,文件名最长可以到达 256 个字符!

磁盘的分区和格式化

笔者经常做的事情就是拿一个全新的磁盘来分区并格式化这也说明了作为一个linux系统管理员,对于磁盘的操作必须要熟练所以请你认真学习该部分内容
fdisk linux下的硬盘分区工具

语法: fdisk [-l ] [设备名称]
-l :后边不跟设备名会直接列出系统中所有的磁盘设备以及分区表,加上设备名会列出该设备的分区表









如果不加-l 则进入另一个模式,在该模式下,可以对磁盘进行分区操作





刚进入该模式下,会有一个提示Command (m for help): 此时按m则会打印出帮助列表,如果你英文好,我想你不难理解这些字母的功能笔者常用的有p, n,d, w, q.
P:打印当前磁盘的分区情况





n:重新建立一个新的分区
w:保存操作
q:退出
d:删除一个分区
因为笔者的linux系统是安装在虚拟机上的,所以我可以增加一块新的磁盘然后笔者会把新的磁盘分成多个分区





当再次fdisk -l 查看时发现多了一个/dev/hdb 设备,并提示该设备没有可用的分区表那么下面就来分一下这个/dev/hdb.





首先用p查看一下,并没有任何分区信息





n创建一个新的分区,会提示要建立e extended 扩展分区)或者p primary partition主分区),这里笔者选择主分区,所以按了p回车后,又让输入First cylinder 你或者直接回车或者输入一个数字,因为这块磁盘是新的并没有任何分区,所以直接回车其实就是从1开始了你也可以自定义输入,但不要超过2080,笔者这里输入1回车此时会提示要分多大,可以写一个数值(2-2080),也可以输入+sizeK或者+sizeM,后者比较直观容易理解,所以笔者在这里输入+100M,即我分了一个100M的主分区再用p查看时,果真多出来一个分区然后笔者继续重复前面的操作,建立了4个主分区当笔者再次输入n创建分区时,结果提示错了





由此你会发现,在linux中最多只能创建4个主分区,那如果你想多创建几个分区如何做?很容易,在创建完第三个分区后,创建第四个分区时选择扩展分区






先删除第四个主分区,然后建立一个扩展分区





在建立扩展分区时,会问你要分多少给这个扩展分区,笔者直接回车,即把所有空间都分给了这个扩展分区这个扩展分区/dev/hdb4并不能往里写数据,它只是一个空壳子,需要我们继续在这个空壳中继续创建分区





当建立完扩展分区,然后按n创建新分区时你会发现不再提示是要建立p还是e了,因为我们已经不能再创建p在这里需要你明白的是,hdb5 其实只是 hdb4 中的一个子分区,到目前为止可用的分区也才4个,那笔者就再创建第5个分区出来





然后按w保存,该模式自动退出,如果你不想保存分区信息直接按q即可退出





下面我们把刚分好的分区删除,重新建立分区如何删除你还记得吧,对了就是直接按d然后选择合适的数字删除完所有分区后,这块磁盘就恢复如初了








第一个分区,我们就建立成扩展分区并且分给它200M。





当再次新建分区时,发生了变化,不再是p或者e了,而是p或者l(逻辑分区),这是为什么呢?在上面也提到了,一个扩展分区只是一个空壳,在扩展分区下才可以继续划分小的分区,这个小的分区其实就是逻辑分区了





而且这个逻辑分区默认都是从字数5开始的,因为前面的数字要么给主分区留着,要么给扩展分区留着由此我们也可以得到,在linux中最多可以创建4个主分区,一旦创建4个主分区后就不能增加任何分区了另外最多也只能创建一个扩展分区扩展分区下的逻辑分区最多可以创建多少呢?IDE的硬盘(类似于hda, hdb, hdc 等)最多可以创建10个(hdb5-hdb15),这是笔者试验出来的结果有的资料说linux下的逻辑分区是没有限制的,也有的说最大可以到64,至于对不对,需要你去近一步考察了,我们没有必要多么深入的研究这个问题,也没有什么意义
通过以上操作,相信你也学会了用fdisk 来分区了吧值得提出的是,不要闲着没事分区玩儿,这操作的危险性是很高的,一不留神就把你服务器上的数据全部给分没有了如果有分区的操作,那么请保持百分之二百的细心,切记切记!

mkfs.ext2 / mkfs.ext3 /mke2fs 格式化linux硬盘分区

当用man查询这三个命令的帮助文档时,你会发现我们看到了同一个帮助文档,这说明三个命令是一样的常用的选项有:
-b:分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块
-i:设定inode大小
-N:设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。
-c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢
-L:预设该分区的标签label
-j:建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了





不加任何选项,直接格式化/dev/hdb1





上例中更改了block size4096 默认是1024,而inode大小设定为4096。
下面的例子分区时自定义分区的label(标签)名





e2label 用来查看或者修改分区的标签(label
这个命令很简单,后边直接跟分区编号,即可查看该分区的label,当想要修改标签名时,分区编号后边跟想要的标签名即可






fsck 检查硬盘有没有坏道

语法: fsck [-Aar] [分区]
-A :加该参数时,后不需要跟分区名作为参数它会自动检查/etc/fstab 文件下的所有分区(开机过程中就会执行一次该操作);
-a :自动修复检查到有问题的分区;
-r :当检查到有坏道的分区时会让用户决定是否修复





当你使用fsck检查磁盘有无坏道时,会提示用户跑这个任务可能会导致某些挂载的文件系统损坏,所以这个命令不要轻易运行否则真的遇到问题,系统甚至都不能启动了




系统环境变量与个人环境变量的配置文件

上面讲了很多系统的变量,那么在linux系统中,这些变量被存到了哪里呢,为什么用户一登陆shell就自动有了这些变量呢?
/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等
/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值




\u就是用户,\h 主机名, \W 则是当前目录,\$就是那个’#’了,如果是普通用户则显示为’$’

除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:
.bash_profile :定义了用户的个人化路径与环境变量的文件名称每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次
.bashrc :该文件包含专用于你的shellbash信息,当登录时以及每次打开新的shell,该该文件被读取例如你可以将用户自定义的alias或者自定义变量写到这个文件中
.bash_history :记录命令历史用的
.bash_logout :当退出shell时,会执行该文件可以把一些清理的工作放到这个文件中

linux shell中的特殊符号

你在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字下面笔者就说一说常用到的特殊字符
1. *
:代表零个或多个字符或数字



test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来
2. ?
:只代表一个任意的字符



不管是数字还是字母,只要是一个都能匹配出来
3. #
:这个符号在linux中表示注释说明的意思,即”#”后面的内容linux忽略掉



在命令的开头或者中间插入”#” linux都会忽略掉的这个符号在shell脚本中用的很多
4. \
:脱意字符,将后面的特殊符号(例如”*” )还原为普通字符



5. |
:管道符,前面多次说过,它的作用在于将符号前面命令的结果丢给符号后面的命令这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍
6. $ :除了用于变量前面的标识符外,还有一个妙用,就是和’!’结合起来使用



‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上条命令中最后出现的那个东西)例如上边命令最后是test.txt那么在当前命令下输入!$则代表test.txt。
1grep
:过滤一个或多个字符,将会在后续内容中详细介绍其用法





2) cut
:截取某一个字段
语法:cut -d “分隔字符” [-cf] n 这里的n是数字
-d :后面跟分隔字符,分隔字符要用双引号括起来
-c :后面接的是第几个字符
-f :后面接的是第几个区块



-d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f1之间的空格可有可无



-c 后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3



3) sort
:用做排序
语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2
-t 分隔符
:作用跟cut-d一个意思
-n :使用纯数字排序
-r :反向排序
-u :去重复
-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序





4) wc
:统计文档的行数字符数词数,常用的选项为:
-l :统计行数
-m :统计字符数
-w :统计词数



5 uniq
:去重复的行,笔者常用的选项只有一个:
-c :统计重复的行数,并把行数写在前面



有一点需要注意,在进行uniq之前,需要先用sort排序然后才能uniq,否则你将得不到你想要的,笔者上面的试验当中已经是排序过所以省略掉那步了
6tee :后跟文件名,类似与重定向”>”,但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上



7tr :替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号常用的选项有两个:
-d :删除某个字符,-d 后面跟要删除的字符
-s :把重复的字符去掉
最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’



当然替换一个字符也是完全可以的



不过替换删除以及去重复都是针对一个字符来讲的,有一定局限性如果是针对一个字符串就不再管用了,所以笔者建议只是简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具



8split :切割文档,常用选项:
-b :依据大小来分割文档,单位为byte



格式如上例,后面的passwd为分割后文件名的前缀,分割后的文件名为passwdaa, passwdab, passwdac …
-l :依据行数来分割文档



6.
:分号平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”



7. ~
:用户的家目录,如果是root则是 /root ,普通用户则是 /home/username



8. & :如果想把一条命令放到后台执行的话,则需要加上这个符号通常用于命令运行时间非常长的情况



使用jobs可以查看当前shell中后台执行的任务fg可以调到前台执行这里的sleep命令就是休眠的意思,后面跟数字,单位为秒,常用语循环的shell脚本中



此时你按一下CTRL +z 使之暂停,然后再输入bg可以再次进入后台执行



如果是多任务情况下,想要把任务调到前台执行的话,fg后面跟任务号,任务号可以使用jobs命令得到



9. >, >>, 2>, 2>>
:前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2> 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>。



10. [ ]
:中括号,中间为字符组合,代表中间字符中的任意一个



11. && ||
在上面刚刚提到了分号,用于多条命令间的分隔符另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&””||”。下面笔者把这几种情况全列出:
1) command1 ; command2
2) command1 && command2
3) command1 || command2
使用”;”时,不管command1是否执行成功都会执行command2
使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1command2总有一条命令会执行