安装源码包

其实,在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总有一条命令会执行



挂载/卸载磁盘

在上面的内容中讲到了磁盘的分区和格式化,那么格式化完了后,如何去用它呢?这就涉及到了挂载这块磁盘格式化后的磁盘其实是一个块设备文件,类型为b,也许你会想,既然这个块文件就是那个分区,那么直接在那个文件中写数据不就写到了那个分区中么?当然不行

在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的一旦把某一个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据使,则都会写到该分区中这就需要你注意一下,在挂载该分区前,挂载点(目录)下必须是个空目录其实目录不为空并不影响所挂载分区的使用,但是一旦挂载上了,那么该目录下以前的东西就不能看到了只有卸载掉该分区后才能看到
mount 挂载设备





先建立/test1 /test2 目录,然后在/test1目录下建立一个1.txt文件





/dev/hdb1分区挂载到/test1目录,然后再查看/test1目录发下,1.txt不存在了此时往/test1目录下写数据,则会写到/dev/hdb1分区中在讲mount-a选项时,我们有必要先了解一下这个文件 /etc/fstab





这个文件是系统启动时,需要挂载的各个分区第一列就是分区的label;第二列是挂载点;第三列是分区的格式;第四列则是mount的一些挂载参数,等下会详细介绍一下有哪些参数,一般情况下,直接写defaults即可;第五列的数字表示是否被dump备份,是的话这里就是1,否则就是0;第六列是开机时是否自检磁盘,就是刚才讲过的那个fsck检测。12都表示检测,0表示不检测,在Redhat中,这个12还有个说法,/ 分区必须设为1,而且整个fstab中只允许出现一个1,这里有一个优先级的说法。12优先级高,所以先检测1,然后再检测2,如果有多个分区需要开机检测那么都设置成2吧,1检测完了后会同时去检测2。下面该说说第四列中常用到的参数了
async/sync async表示和磁盘和内存不同步,系统每隔一段时间把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中数据;
auto/noauto :开机自动挂载/不自动挂载;
default:按照大多数永久文件系统的缺省值设置挂载定义,它包含了rw, suid, dev, exec, auto, nouser,async
ro:按只读权限挂载

rw:按可读可写权限挂载

exec/noexec :允许/不允许可执行文件执行,但千万不要把根分区挂载为noexec,那就无法使用系统了,连mount命令都无法使用了,这时只有重新做系统了;
user/nouser :允许/不允许root外的其他用户挂载分区,为了安全考虑,请用nouser
suid/nosuid :允许/不允许分区有suid属性,一般设置nosuid
usrquota :启动使用者磁盘配额模式,磁盘配额相关内容在后续章节会做介绍;
grquota :启动群组磁盘配额模式;

学完这个/etc/fstab后,我们就可以自己修改这个文件,增加一行来挂载新增分区例如,笔者增加了这样一行
/dev/hdb1 /test1 ext3 defaults 0 0
那么系统再重启时就会挂载这个分区了

讲完了/etc/fstab 我们继续回来讲这个mountmout -a 如果运行了这个命令,则会把/etc/fstab中出现的所有磁盘分区挂载上所以当你在/etc/fstab文件中增加一行后,你完全可以直接运行mount -a 来挂载你增加的那行,这样就不用重启啦
你可以使用mount -o 选项来重新挂载一个分区,并同时指定你想要的选项(即上边介绍fstab第六列中那些)





看到了吧,使用了ro选项,则不能新建文件了





再重新挂载一次就恢复正常了,如果不加任何其他选项,则就是defaults。
笔者在日常的运维工作中遇到过这样的情况,一台服务器上新装了亮块磁盘,磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd),有一次把这两块磁盘都拔掉了,然后再重新插上,重启机器,结果磁盘编号调换了,a变成了sddb变成了sdc(这是因为把磁盘插错了插槽),问题来了通过上边的学习,你挂载磁盘是通过/dev/hdb1 这样的分区名字来挂载的,如果先前加入到了/etc/fstab 中,结果系统启动后则会挂载错分区那么怎么样避免这样的情况发生?
blkid
这个命令是用来显示磁盘分区uuid的,uuid其实就是一大串字符,在linux系统中每一个分区都会有唯一的一个uuid。说到这,聪明的你想到了吧,没有错,我们就用这唯一的uuid来挂载磁盘分区





这个命令笔者只是用来显示uuid,没有其他用途所以不做详细介绍,当然你也可以在命令后边跟某一个分区,只显示该分区的uuid。





看到了吧,其实是很好用的那么怎么让它也开机启动?很简单,把刚才敲的mount 磁盘的命令直接写到 /etc/rc.d/rc.local 文件即可对了,笔者到现在还没有给你讲过这个rc.local文件的作用简单点说,系统启动完后会执行这个文件中的命令所以只要你想开机后运行什么命令统统写入到这个文件下面吧





其实这个文件就是一个shell 脚本,以后笔者会单独用一章来介绍它行开头的”#”是注释的意思,代表这行在这个脚本中不生效你想让系统开机后运行什么命令,就把什么命令写到这里面来就比如刚才笔者挂载的那条命令你可以这样实现:





mount 还有一个比较常用的选项就是-t ,后边指定文件系统的类型,比如挂载软盘时就需要指定 vfat,而挂载光盘时就需要指定iso9660,但在笔者多年来的经验,目前的系统都是智能识别所要挂载分区的系统格式类别的也就是说,用不着你去指定,它会自动判断的






umount 卸载设备

现在你学会了如何挂载一个设备,那么如何去卸载一个设备呢,这就要用到umount了,这个命令也简单的很,后边可以跟挂载点,也可以跟分区名(/dev/hdb1)



有时也许你会遇到比较难卸载的设备,就像在windows下无法删除U盘一样,教你一个特管用的方法就是 umount -l /dev/hdb1 ,这个-l选项有强制卸载的意思,你一定要记住哦,非常有用的

linux中的连接档

在讲连接档之前,需要你先理解inode的概念什么是inode呢?这就需要你知道磁盘的整体构造磁盘是有多个盘片(类似与光盘)重叠在一起构成的,而每个盘片上会有一个可以移动的磁头,这个磁头的作用就是用来读写数据的磁头并不是一直在动,当磁头固定时,盘片转一圈,这一圈就是一个磁道了很多个盘片同半径的那一圈的磁道总和称为磁柱而由圆心向外画出直线,可以得到一个个扇区,如图二所示,一个扇区的物理量大约是 512 bytes ( 0.5K )。




图一

图二






知道了大体的硬盘构造之后,再来谈一谈怎么硬盘分割( partition )呢?我们在进行硬盘分割的时候,最小都是以磁柱为单位进行分割的,那么分割完成之后自然就是格式化( format )啰,在 Linux 里面我们在进行格式化的时候必须要考虑到 Block inode 的信息,这个 block 还好理解,他是我们磁盘可以记录的最小单位,是由数个 sector 所组成的,所以他的大小通常为 n*512 bytes ,例如 4K 。那么 inode 是什么? Block 是记录档案内容数据的地区,而 inode 则是记录该档案的属性及该档案放置在哪一个 Block 之内的信息!所以,每个档案都会占用到至少一个 inode 。而当我们 Linux 系统要找到这个档案时,他会先去搜寻 inode table 找到这个档案的属性及数据放置的地区,然后再到数据去找到数据存放的 Block 进而将数据取出利用这个 inode 数目在一开始就会被设定好,他的设定方式通常是利用 ( 硬盘大小 / 一个容量 ),这个容量至少应该比 Block 要大一些较佳,例如刚刚的 Block 订为 4K ,那么 inode 可以订为 8K 左右所以,一颗 1GB 的硬盘,如果以 8K 来规划他的 inode 数时,他的 inode 就会有 131072 inode 啦!而一个 inode 的大小为 128 bytes 这么大!这么一来的话,我们就可以清楚的知道了,那就是一个 partition 格式化为一个 filesystem 之后,基本上,他一定会有 inode table data area 两个区块,一个用来记录档案的信息与该档案放置的 block 区块,一个用来记录档案的内容!
由于我们 Linux 在读取数据的时候,是先查询 inode table 以得到数据是放在那个 Block 里面,然后再去该 Block 里面读取真正的数据内容!然后,那个 block 是我们在格式化硬盘的时候规定出来的一个值,这个 block 是由 2 n 次方个sector 所集结而成的!所以,他是 0.5K 的倍数!假设我们 block 规划为 4KBytes 好了,那么由于一个 inode 与一个block 最多均只纪录一个档案,所以,如果你的一个档案有 0.1 K bytes 这么大时,你要晓得的是,由于你的 block 4K bytes ,因此,你就会有 3.9 Kbytes 的空间浪费掉!所以,当你在格式化硬盘的时候,请千万注意到你的系统未来的使用方向

建立一个swap文件

从装系统时就接触过这个swap了,前面也说过它类似与windows的虚拟内存,分区的时候一般大小为内存的2倍,如果你的内存超过4G,那么你分8G似乎是没有必要了4G足够日常交换了然而,还会有虚拟内存不够用的情况发生如果真遇到了,莫非还要重新分一下磁盘?当然不能!那我们就增加一个虚拟的磁盘出来

基本的思路就是:1 建立swapfile;  2 格式化为swap格式; 3 启用该虚拟磁盘。




利用dd 来创建一个419M的文件/tmp/newdisk出来,其中if代表从哪个文件读,/dev/zerolinux下特有的一个0生成器,of表示输出到哪个文件,bs即块大小,count则定义有多少个块



mkswap 这个命令是专门格式化swap格式的分区的,这个命令用的时候一定要看清楚了,否则把其他分区给格式化错了就只有哭了



free 是用来查看系统内存以及虚拟内存使用情况的,-m选项是以M的形式查看可以看到当前系统的swapon 是启用我们新建的swap文件,启用后再用free查看发现多了400M。



我们还可以用swapoff 关闭启用的swap文件