跟我学linux-入门级教程


前言 在很久前就想自己写一本书,来帮助众多的 linux 爱好者。我发现任何一个新东西对于 一个刚刚接触的人来说最重要的就是入门,一旦入门了那么你就会飞跃。如果你看到了这个 教程,就说明你对 linux 是感兴趣的,所以恭喜你,也正是因为你的兴趣才会成就你的 linux 梦。 我并不敢保证你读了这个教程就一定会变成 linux 高手,毕竟我接触 linux 的时间也仅仅 才几年,我的经验相对于 linux 界的大牛来讲简直是小巫见大巫。不过请你放心,我会用心 去教给你比较常用的以及实用的东西,这些东西足可以让你成为一名合格的 linxu 系统管理 员。我的意思,你明白了吗,我只是带你进入 linux 的世界,让你轻松入门,而你以后的 linux 路是完全靠你个人摸索的。 我写这个教程其实有一个很重要的原因,就是写给我第一个学生,我想好好培养这个学 生,甚至让其超越我。我这个学生跟你们一样只是刚刚接触 linux 并且还没有正式入门,但 是其对 linux 的浓厚兴趣打动了我,让我有了写这个简易教程的念头。相信你不会让我失望 的! 另外要提一下,该教程大部分内容都是参考《鸟哥的 linux 私房菜》,因为在当年我就是 看这本书入门的,所以非常感谢鸟哥这位 linux 前辈的付出。废话不多说了,接下来我就带 你进入 linux 的世界,让你轻松入门! 阿铭 http://mylinux.5d6d.com 第一章 关于 linux linux linux linux 的历史 很多关于 linux 的书籍在前面章节中写了一大堆东西来介绍 linux,可惜读者看了好久也 没有正式开始进入 linux 的世界,这样反而导致了他们对 linux 失去了一些兴趣,而把厚厚的 一本书丢掉。 Linux 的历史确实有必要让读者了解的,但是不了解也并不会影响你将来的 linux 技术水 平。哈哈,本人其实就不怎么了解 linux 的历史,所以对于 linux 的历史在本教程中不会涉及 到。如果你感兴趣的话,那你去网上搜一下吧,一大堆呢足够让你看一天的。虽然我不太想 啰嗦太多,但是关于 linux 最基本的认识,我还是想简单介绍一下的。也算是我对 linux 的创 始人Linus Torvalds 先生的尊重。 在介绍 linux 的历史前,我想先针对大家如何对 linux 的发音说一下。我发现我身边的朋 友对linux 的发音大致有这么几种: “里那克斯”与“里你克斯”“里扭克斯”等。其实官 方的标准发音为 ['li:nэks],因为这个发音是创始人 Linus 的发音。如果你不认识这个音标, 那么就读成“里那克斯”。而笔者习惯发音成“里你克斯”,当然你发音成什么,并没有人会 说你,完全是一个人的习惯而已。 也许有的读者已经了解到,linux 和unix 是非常像的。没错,linux 就是根据 unix 演变过 来的。当年linus 就是因为接触到了 unix 而后才自己想开发一个简易的系统内核的,他开发 的简易系统内核其实就是 linux。当时 linus 把开发的这个系统内核丢到网上提供大家下载, 由于它的精致小巧,越来越多的爱好者去研究它。人们对这个内核添枝加叶,而后成为了一 个系统。也许你听说过吧,linux 是免费的。其实这里的免费只是说 linux 的内核免费。在linux 内核的基础上而产生了众多 linux 的版本。 Linux 的发行版说简单点就是将Linux 内核与应用软件做一个打包。较知名的发行版有: Ubuntu、RedHat、CentOS、Debain、Fedora、SuSE、OpenSUSE、TurboLinux、BluePoint、RedFlag、 Xterm、SlackWare 等 而笔者常用的就是 Redhat 和 CentOS,这里有必要说一下,其实CentOS 是基于 Redhat 的,网上有人说,Centos 是Redhat 企业版的克隆。笔者所在公司的服务器全部都是安装 CentOS 系统,并且相当稳定。CentOS 较之于 Redhat 可以免费使用 yum 下载安装所需要的 软件包,这个是相当方便的。而 Redhat 要想使用 yum 必须要购买服务了。 笔者只是简单的介绍了一下 linux,如果你想详细了解 linux 的历史,那么请自己去查询 一下相关的资料吧。 第二章 图形界面还是命令窗口 对于linux 的应用,我想大多数都是用在服务器领域,对于服务器来讲真的没有必要 跑一个图形界面。所以我们平时安装 linux 操作系统时往往是不安装图形界面的。说到 这里也许你会有疑问,图形界面还能选择装或者不装? 是的,虽然linux 和微软的 windows 一样同位操作系统,但是它们有一个很大的区别 就是windows 操作系统的图形界面是和内核一体的,俗称微内核,而linux 操作系统图 形界面就像一个软件一样,和内核并不是一体的。所以 linux 你可以选择不安装图形界 面,这样不仅不影响服务器的正常使用还可以节省系统资源的开销,何乐而不为呢? 如果你对 linux 超级感兴趣,想使用 linux 就像使用 windows 一样,那你可以安装图 形界面,可以像 windows 一样来体验 linux 也是蛮不错的。但是如果你想成为一个专业 的linux 系统工程师,那我建议你从第一天开始就不要去安装图形界面,从命令窗口开 始熟悉它。 另外一点值得说的是,日常应用中,我们都是远程管理服务器的,不可能开着图形 界面来让你去操作,虽然目前也有相应的工具支持远程图形连接服务器,可是那样太消 耗网络带宽资源,所以从这方面来考虑还是建议你不要使用图形界面。 第三章 LLLLinux inux inux inux 操作系统的安装 因为笔者一直都是使用 CentOS,所以这次安装系统也是基于 CentOS 的安装。把光盘插 入光驱,设置 bios 光驱启动。进入光盘的欢迎界面。 其中有两个选项,可以直接按回车,也可以在当前界面下输入 linux text 按回车。前者 是图形下安装,可以动鼠标的,后者是纯文字形式的。建议初学者用前者安装。直接回车后, 出现一下界面: 这一步是要提示你是否要校验光盘,目的是看看光盘中的安装包是否完整或者是否被人 改动过,一般情况下,如果是正规的光盘不需要做这一步操作,因为太费时间。接下来是: 这一步没有什么可说明的,直接点“Next” 这里是选择安装系统时所用语言,笔者习惯用 English,当然你也可以选择 Chinese(Simplified) (简体中文),选择好后点“Next” 这里是选择合适的键盘,我们平时使用的都是英文键盘,所以这里不用动,默认即可,直接 “Next” 到这里就会提示你,下面会分区,会初始化磁盘,磁盘上的数据会丢失,问你是否要初始化 设备并清除磁盘上的数据。因为是空盘,所以选择“Yes” 到这一步,就该分区了。其中一共有四种方式可以供你选择 第一种,在所选磁盘上把所有分区移除,然后按照默认的方式分区; 第二种,在所选磁盘上把所有 linux 分区移除(如果磁盘上有 windows 格式的分区,并不会 移除),然后按照默认方式分区; 第三种,在所选磁盘上只使用空闲部分,并且按照默认方式分区; 第四种,用户自定义。 这里我们选第四种。然后“Next” 接下来该分区了,分区的很灵活,但大体上按照这个规则来(这是服务器上这样分,如果你 是虚拟机,请看后边部分): 1 /boot 分区 100M 2 Swap 分区 内存的 2倍,如果大于等于 4G,则只需给 4G 即可 3 / 分区给 20G 4 剩余空间给/data 说明:/boot 分区是系统启动所需要的文件,就跟windows 的C盘中的 windows 目录类似, 这个分区中的文件并不大,只需要 100M 足够。Swap 分区是交换分区,当内存不够时,系 统会把这部分空间当内存使用。/ 分区,其实就是一个根目录,在以后的章节中会介绍到。 现在不懂并没有关系,只要知道有这么一个东西即可。/data 这个分区是我们自定义的,就 如果你安装的是虚拟机,并且你只有 8G 的磁盘空间,那么我建议你这样分区: 1 /boot 100M 2 swap 内存的 2倍 3 / 全部剩余空间 分区完后,点“Next” 可以在 Use a boot loader password 前面打勾,这个选项的作用是,给boot loader 加一个密 码,为了防止有人通过光盘进入单用户模式修改 root 密码。 下面的选项同样可以打勾,笔者从来没有用过该功能,如果你有兴趣,可以研究一下。然后 下一步 这一步是配置网卡信息,可以现在自定义网卡的 IP,和配置主机名,默认是通过 DHCP 获得, 你也可以点 manually 自定义一个主机名,如 mail.example.com 。如果这两种方式都没有配 置,那么 linux 会给你配置一个万能的主机名,即 localhost.localdomain 剩下的几个就不用 配置了,默认留空。 接着下一步,选择时区,在这里当然要选择我们所处的时区 Asia/Chongqing 如果没有 Chongqing 那就选择 Asia/Shanghai。 继续下一步 在这里自己定义一个 root 的密码,继续下一步 这里要我们选择要安装的包,笔者习惯自定义安装,需要点下面的“customize now”然后 下一步 “Desktop Environments” 看右侧,把GNOME 前面的勾去掉,这个其实就是图形界面的安 装包,如果不去掉这个勾,就会安装图形界面。 “Applications” 除了Editors 前面的勾去掉外,其他均不要 “Development”全部都要勾上 “Servers”以及以下所有项都不要勾任何,然后下一步 点Next 后,系统就开始安装了。 等过会后,会出现 至此,linux 系统已经安装完成了。接下来点“Reboot”重启一下,进入 linux 系统看看吧。 第四章 初步进入 linux linux linux linux 世界 【LinuxLinuxLinuxLinux 系统启动过程】 Linux 的启动其实和 windows 的启动过程很类似,不过 windows 我们是无法看到启动信 息的,而 linux 启动时我们会看到许多启动信息,例如某个服务是否启动。 Linux 系统的启动过程大体上可分为五部分:内核的引导;运行init;系统初始化;建立 终端 ;用户登录系统。 AAAA 内核引导 当计算机打开电源后,首先是 BIOS 开机自检,按照BIOS 中设置的启动设备(通常是硬 盘)来启动。紧接着由启动设备上的 grub 程序开始引导 linux,当引导程序成功完成引导任务 后,Linux 从它们手中接管了 CPU 的控制权,然后 CPU 就开始执行 Linux 的核心映象代码,开始了 Linux 启动过程。也就是所谓的内核引导开始了,在内核引导过程中其实是很复杂的,我们就当它是 一个黑匣子,反正是 linux 内核做了一些列工作,最后内核调用加载了 init 程序,至此内核引导的工 作就完成了。交给了下一个主角 init。 BBBB 运行 initinitinitinit init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程, 系统中任何进程都不会启动。init 程序首先是需要读取配置文件 /etc/inittab。inittab 是一个不可 执行的文本文件,它有若干行指令所组成。具体内容如下:(你可以在你的 linux 上执行命令 cat /etc/inittab 这样获得) # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS(The same as 3, if you do not havenetworking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # ###表示当前缺省运行级别为 5(initdefault); id:5:initdefault: ###启动时自动执行/etc/rc.d/rc.sysinit 脚本(sysinit) # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 ###当运行级别为 5时,以 5为参数运行/etc/rc.d/rc 脚本,init 将等待其返回(wait) l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ###在启动过程中允许按 CTRL-ALT-DELETE 重启系统 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your #UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" ###在2、3、4、5级别上以 ttyX 为参数执行/sbin/mingetty 程序,打开 ttyX 终端用于用 户登录, ###如果进程退出则再次运行 mingetty 程序(respawn) # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 ###在 5 级别上运行 xdm 程序,提供 xdm 图形方式登录界面,并在退出时重新执行(respawn) # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon 以上面的 inittab 文件为例,来说明一下 inittab 的格式。其中以#开始的行是注释行,除了注释行之 外,每一行都有以下格式: id:runlevel:action:process 对上面各项的详细解释如下: 1.1.1.1. iiiidddd id 是指入口标识符,它是一个字符串,对于 getty 或mingetty 等其他 login 程序项,要求 id 与tty 的编号相同,否则 getty 程序将不能正常工作。 2.2.2.2. RunlevelRunlevelRunlevelRunlevel runlevel 是init 所处于的运行级别的标识,一般使用 0-6以及S或s。0、1、6运行级别被 系统保留:其中 0作为shutdown 动作,1作为重启至单用户模式,6为重启;S和s意义相同, 表示单用户模式,且无需 inittab 文件,因此也不在 inittab 中出现,实际上,进入单用户模式时,init 直接在控制台(/dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了 2、3、4、 5几个级别,在 CentOS 系统中,2表示无 NFS 支持的多用户模式,3表示完全多用户模式(也是 最常用的级别),4保留给用户自定义,5表示 XDM 图形登录方式。7-9级别也是可以使用的,传 统的 Unix 系统没有定义这几个级别。runlevel 可以是并列的多个值,以匹配多个运行级别,对大多 数action 来说,仅当 runlevel 与当前运行级别匹配成功才会执行。 3.3.3.3. actionactionactionaction action 是描述其后的 process 的运行方式的。action 可取的值包括:initdefault、sysinit、 boot、bootwait 等: initdefault 是一个特殊的 action 值,用于标识缺省的启动级别;当 init 由 核心激活以后,它将读取 inittab 中的initdefault 项,取得其中的 runlevel,并作为当前的运行级 别。如果没有 inittab 文件,或者其中没有 initdefault 项,init 将在控制台上请求输入 runlevel。 sysinit、boot、bootwait 等action 将在系统启动时无条件运行,而忽略其中的 runlevel。其余的 action(不含initdefault)都与某个 runlevel 相关。各个action 的定义在 inittab 的man 手册中 有详细的描述。 4.4.4.4. processprocessprocessprocess process 为具体的执行程序。程序后面可以带参数。 Tips: 如果你看不懂这个文件,没有关系,随着你对 linux 的深入了解,你再回过头看这个文 件你就会豁然开朗的。但是你现在必须要明白 runlevel 的各个级别的含义。 CCCC 系统初始化 在init 的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了 /etc/rc.d/rc.sysinit,而rc.sysinit 是一个 bash shell 的脚本,它主要是完成一些系统初始化的工 作,rc.sysinit 是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区, 检查磁盘,加载硬件模块以及其它一些需要优先执行任务。 rc.sysinit 约有850 多行,但是每个单一的功能还是比较简单,而且带有注释,建议有兴趣的 用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在 本文中列出来,也不做具体的介绍。当rc.sysinit 程序执行完毕后,将返回 init 继续下一步。通常接 下来会执行到/etc/rc.d/rc 程序。以运行级别 3为例,init 将执行配置文件 inittab 中的以下这行: l5:5:wait:/etc/rc.d/rc 5 这一行表示以 5为参数运行/etc/rc.d/rc,/etc/rc.d/rc 是一个 Shell 脚本,它接受 5作为参数, 去执行/etc/rc.d/rc5.d/目录下的所有的 rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际 上都是一些连接文件,而不是真正的 rc 启动脚本,真正的 rc 启动脚本实际上都是放在 /etc/rc.d/init.d/目录下。而这些 rc 启动脚本有着类似的用法,它们一般能接受 start、stop、restart、 status 等参数。 /etc/rc.d/rc5.d/中的 rc 启动脚本通常是 K 或 S 开头的连接文件,对于以以 S 开头的启动脚本, 将以 start 参数来运行。而如果发现存在相应的脚本也存在 K打头的连接,而且已经处于运行态了(以 /var/lock/subsys/下的文件作为标志),则将首先以 stop 为参数停止这些已经启动了的守护进程, 然后再重新运行。这样做是为了保证是当 init 改变运行级别时,所有相关的守护进程都将重启。 至于在每个运行级中将运行哪些守护进程,用户可以通过 chkconfig 或setup 中的"System Services"来自行设定。 DDDD 建立终端 rc执行完毕后,返回 init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init 接下来会打开 6个终端,以便用户登录系统。在 inittab 中的以下 6行就是定义了 6个终端: 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 从上面可以看出在 2、3、4、5的运行级别中都将以 respawn 方式运行 mingetty 程序,mingetty 程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界 面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给 login 程序来验 证用户的身份。 EEEE 用户登录系统 对于运行级别为 5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功 后可以直接进入 KDE、Gnome 等窗口管理器。而本文主要讲的还是文本方式登录的情况:当我们看 到mingetty 的登录界面时,我们就可以输入用户名和密码来登录系统了。 Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。然后 login 会对用户名进行分析:如果用户名不是 root,且存在/etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出。这通常用来系统维护时防止非 root 用户登录。只有/etc/securetty 中登记 了的终端才允许 root 用户登录,如果不存在这个文件,则root 可以在任何终端上登录。/etc/usertty 文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。 在分析完用户名后,login 将搜索/etc/passwd 以及/etc/shadow 来验证密码以及设置账户的 其它信息,比如:主目录是什么、使用何种 shell。如果没有指定主目录,将默认为根目录;如果没 有指定 shell,将默认为/bin/bash。 login 程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog 中有记录), 并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量: 对于bash 来说,系统首先寻找/etc/profile 脚本文件,并执行它;然后如果用户的主目录中存 在.bash_profile 文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行 后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。 【图形模式与文字模式的切换方式】 Linux 预设提供了六个命令窗口终端机让我们来登录。默认我们登录的就是第一个窗口, 也就是 tty1,这个六个窗口分别为 tty1,tty2 … tty6,你可以按下 Ctrl + Alt + F1 ~ F6 来切换它 们。如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按 Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。当你进入命令窗口界面后再返回图形界面只要按下 Ctrl + Alt + F7 就回来了。如果你用的 vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按 Alt + Shift + Ctrl + F1~F6 切换至命令窗口。 【学会使用快捷键】 Ctrl + C:这个是用来终止当前命令的快捷键,当然你也可以输入一大串字符,不想让 它运行直接 Ctrl + C,光标就会跳入下一行。 Tab: 这个键是最有用的键了,也是笔者敲击概率最高的一个键。因为当你打一个命令 打一半时,它会帮你补全的。不光是命令,当你打一个目录时,同样可以补全,不信你试试。 Ctrl + D: 退出当前终端,同样你也可以输入 exit。 Ctrl + Z: 暂停当前进程,比如你正运行一个命令,突然觉得有点问题想暂停一下,就 可以使用这个快捷键。暂停后,可以使用 fg 恢复它。 Ctrl + L: 清屏,使光标移动到第一行。 【学会查询帮助文档 — manmanmanman】 这个man 通常是用来看一个命令的帮助文档的。例如: 输入 man ls 其实格式为 man + 命令 你就会看到相关的帮助文档了。从命令的介绍到命令的参数以及用法介绍的都非常详细的。 不错吧。 【LLLLinux inux inux inux 系统目录结构】 登录系统后,在当前命令窗口下输入 ls / 你会看到 以下是对这些目录的解释: /bin bin 是Binary 的缩写。这个目录存放着最经常使用的命令。 /boot 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev dev 是Device(设备)的缩写。该目录下存放的是 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 的预设放置也是在这里。 【如何正确关机】 其实,在 linux 领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个 服务是永无止境的,除非特殊情况下,不得已才会关机。 linux 和windows 不同,在 Linux 底下,由于每个程序(或者说是服务)都是在在背景 下执行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,例 如浏览网页啦、传送信件啦以 FTP 传送档案啦等等的,如果你直接按下电源开关来关机时, 则其它人的数据可能就此中断!那可就伤脑筋了!此外,最大的问题是,若不正常关机,则 可能造成文件系统的毁损(因为来不及将数据回写到档案中,所以有些服务的档案会有问 题!)。 如果你要关机,必须要保证当前系统中没有其他用户在线。可以下达 who 这个指令, 而如果要看网络的联机状态,可以下达 netstat -a 这个指令,而要看背景执行的程序可以执 行 ps -aux 这个指令。使用这些指令可以让你稍微了解主机目前的使用状态!(这些命令在 以后的章节中会提及,现在只要了解即可!) 正确的关机流程为:sysnc � shutdown � reboot � halt sync 将数据由内存同步到硬盘中。 shutdown 关机指令,你可以 man shutdown 来看一下帮助文档。例如你可以运行如下 命令关机: shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将 在10 分钟后关机,并且会显示在登陆用户的当前屏幕中。 Shutdown –h now 立马关机 Shutdown –h 20:25 系统会在今天 20:25 关机 Shutdown –h +10 十分钟后关机 Shutdown –r now 系统立马重启 Shutdown –r +10 系统十分钟后重启 reboot 就是重启,等同于 shutdown –r now halt 关闭系统,等同于 shutdown –h now 和 poweroff 最后总结一下,不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据 写到磁盘中。关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令 有 shutdown –r now reboot init 6. 【忘记root root root root 密码如何做】 我记得以前我忘记 windows 的管理员密码,又由于不会用光盘清除密码最后只能重新安 装系统。现在想想那是多么愚笨的一件事情。同样linux 系统你也会遇到忘记 root 密码的情 况,如果遇到这样的情况怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下 root 密码即可。如何进入呢。 1 重启linux 系统 3 秒之内要按一下回车,出现如下界面 然后输入 e 在 第二行最后边输入 single,有一个空格。具体方法为按向下尖头移动到第二行,按“e” 进入编辑模式 在后边加上 single 回车 最后按“b”启动,启动后就进入了单用户模式了 此时已经进入到单用户模式了,你可以更改 root 密码了。更密码的命令为 passwd 【使用系统安装光盘的救援模式】 救援模式即 rescue ,这个模式主要是应用于,系统无法进入的情况。如,grub 损坏或 者某一个配置文件修改出错。如何使用 rescue 模式呢? 光盘启动,按 F5 进入rescue 模式 输入linux rescue 回车 选择语言,笔者建议你选择英语 选择us 键盘 这里问你是否启动网络,有时候可能会联网调试。我们选 no 这里告诉我们,接下来会把系统挂载在/mnt/sysimage 中。其中有三个选项,Continue 就是 挂载后继续下一步; Read-Only 挂载成只读,这样更安全,有时文件系统损坏时,只读模 式会防止文件系统近一步损坏;Skip 就是不挂载,进入一个命令窗口模式。这里我们选择 Continue。 至此,系统已经挂载到了/mnt/sysimage 中。接下来回车,输入chroot /mnt/sysimage 进入 管理员环境。 Tips: 其实也可以到 rescue 模式下更改 root 的密码的。这个rescue 模式和 windows PE系统 很相近。当运行了 chroot /mnt/sysimage/ 后,再 ls 看到目录结构和原来系统中的目录结 构是一样的。没错!现在的环境和原来系统的环境是一模一样的。你可以输入 exit 或者按 Ctrl + D退出这个环境。然后你再 ls 看一下 这个目录其实就是 rescue 模式下的目录结构,而我们的系统文件全部在 /mnt/sysimage 目录 下。 第五章 LLLLinux inux inux inux 系统的远程登录 首先要说一下,该部分内容对于 linux 初学者来讲并不是特别重要的,可以先跳过该章 节,先学下一章,等学完后再回来看这一章。 Linux 大多应用于服务器,而服务器不可能像 PC一样放在办公室,它们是放在 IDC 机房 的,所以我平时登录 linux 系统都是通过远程登录的。Linux 系统中是通过 ssh 服务实现的远 程登录功能。默认ssh 服务开启了 22 端口,而且当我们安装完系统时,这个服务已经安装, 并且是开机启动的。所以不需要我们额外配置什么就能直接远程登录 linux 系统。ssh 服务的 配置文件为 /etc/ssh/sshd_config,你可以修改这个配置文件来实现你想要的 ssh 服务。比如 你可以更改启动端口为 36000. 如果你是 windows 的操作系统,则Linux 远程登录需要在我们的机器上额外安装一个终 端软件。目前比较常见的终端登录软件有 SecureCRT, Putty, SSH Secure Shell 等,很多朋友喜 欢用SecureCRT 因为它的功能是很强大的,而笔者喜欢用 Putty,只是因为它的小巧以及非 常漂亮的颜色显示。不管你使用哪一个客户端软件,最终的目的只有一个,就是远程登录到 linux 服务器上。这些软件网上有很多免费版的,你可以下载一个试着玩玩。下面笔者介绍 如何使用 Putty 登录远程 linux 服务器。 如果你下载了 putty,请双击 putty.exe 然后弹出如下的窗口。笔者所用 putty 为英文版 的,如果你觉得英文的用着别扭,可以下载一个中文版的。 因为是远程登录,所以你要登录的服务器一定会有一个 IP或者主机名。请在 Host Name( or IP address) 下面的框中输入你要登录的远程服务器 IP(如果你的 linux 还没有 IP,那 么请自行设置一个 IP,如何设置请到后续章节查找),然后回车。 此时,提示我们输入要登录的用户名。 输入root 然后回车,再输入密码,就能登录到远程的 linux 系统了。 【使用密钥认证机制远程登录 linux】 SSH 服务支持一种安全认证机制,即密钥认证。所谓的密钥认证,实际上是使用一对加 密字符串,一个称为公钥(public key), 任何人都可以看到其内容,用于加密;另一个称为 密钥(private key),只有拥有者才能看到,用于解密。 通过公钥加密过的密文使用密钥可以 轻松解密,但根据公钥来猜测密钥却十分困难。 ssh 的密钥认证就是使用了这一特性。服 务器和客户端都各自拥有自己的公钥和密钥。 如何使用密钥认证登录 linux 服务器呢? 首先使用工具 PUTTYGEN.EXE 生成密钥对。打开工具 PUTTYGEN.EXE后如下图所示: 该工具可以生成三种格式的 key :SSH-1(RSA) SSH-2(RSA) SSH-2(DSA) ,我们采用默认的格式 即SSH-2(RSA)。Number of bits in a generated key 这个是指生成的 key 的大小,这个数值越大, 生成的 key 就越复杂,安全性就越高。这里我们写 2048. 然后单击 Generate 开始生成密钥对: 注意的是,在这个过程中鼠标要来回的动,否则这个进度条是不会动的。 到这里,密钥对已经生成了。你可以给你的密钥输入一个密码 ,(在Key Passphrase 那 里)也可以留空。然后点 Save public key 保存公钥,点 Save private Key 保存私钥。笔 者建议你放到一个比较安全的地方,一来防止别人偷窥,二来防止误删除。接下来就该 到远程 linux 主机上设置了。 1)创建目录 /root/.ssh 并设置权限 [root@localhost ~]# mkdir /root/.ssh mkdir 命令用来创建目录,以后会详细介绍,暂 时只了解即可。 [root@localhost ~]# chmod 700 /root/.ssh chmod 命令是用来修改文件属性权限的,以 后会详细介绍。 2)创建文件 / root/.ssh/authorized_keys [root@localhost ~]# vim /root/.ssh/authorized_keys vim 命令是编辑一个文本文件的命 令,同样在后续章节详细介绍。 3)打开刚才生成的 public key 文件,建议使用写字板打开,这样看着舒服一些,复制 从AAAA 开头至 “----END SSH2 PUBLICKEY----“ 该行上的所有内容,粘贴到 /root/.ssh/authorized_keys 文件中,要保证所有字符在一行。(可以先把复制的内容拷贝 至记事本,然后编辑成一行载粘贴到该文件中)。在这里要简单介绍一下,如何粘贴, 用vim 打开那个文件后,该文件不存在,所以vim 会自动创建。按一下字母”i”然后同时 按shift + Insert 进行粘贴(或者单击鼠标邮件即可),前提是已经复制到剪切板中了。 粘贴好后,然后把光标移动到该行最前面输入 ssh-ras ,然后按空格。再按 ESC,然后 输入冒号 wq 即 :wq 就保存了。格式如下图: 4)再设置 putty 选项,点窗口左侧的 SSh –> Auth ,单击窗口右侧的 Browse… 选择刚 刚生成的私钥, 再点Open ,此时输入 root,就不用输入密码就能登录了。 如果在前面你设置了 Key Passphrase ,那么此时就会提示你输入密码的。为了更加安全 建议大家要设置一个 Key Passphrase。 第六章 Linux Linux Linux Linux 文件与目录管理 在linux 中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章 提到的/root/.ssh/authorized_keys 这就是一个文件的路径。如果你告诉系统这个文件的路径, 那么系统就可以找到这个文件。在 linux 的世界中,存在着绝对路径和相对路径。 绝对路径:路径的写法一定由根目录”/”写起,例如/usr/local/mysql 这就是绝对路径。 相对路径:路径的写法不是由根目录”/”写起,例如,首先用户进入到/ 然后再进入到 home , 命令为 cd /home 然后 cd test 此时用户所在的路径为 /home/test 。第一个 cd命令后跟 /home 第二个 cd命令后跟 test ,并没有斜杠,这个 test 是相对于/home 目录来讲的,所 以叫做相对路径。 pwdpwdpwdpwd 这个命令打印出当前所在目录 cdcdcdcd 进入到某一个目录 ./ 指的是当前目录 ../ 指的是当前目录的上一级目录。 上图中,首先进入到/usr/local/lib/ 目录下,然后再进入 ./ 其实还是进入到当前目录下, 用pwd 查看当前目录,并没有发生变化,然后再进入../ 则是进入到了/usr/local/目录下, 即/usr/local/lib 目录的上一级目录。你看明白了吗? mkdirmkdirmkdirmkdir 创建一个目录,这个命令在上一章节中提及过。mkdir 其实就是 make directory 的缩写。其语法为 mkdir [-mp] [目录名称],其中-m ,–p 为其选项,-m:这个参数用 来指定要创建目录的权限,该参数不常用,所以笔者不做重点解释。-p:这个参数很管 用的,先来做个试验,你会一目了然的。 当我们想创建 /tmp/test/123 目录,可是提示不能创建,原因是/tmp/test 目录不存在, 你会说,这个 linux 怎么这样傻,/tmp/test 目录不存在就自动创建不就 OK了嘛,的确 linux 确实很傻,如果它发现要创建的目录的上一级目录不存在就会报错。然后linux 也 为我们想好了解决办法,即-p参数。 你看到这里,是不是明白-p参数的作用了?没错,它的作用就是递归创建目录,即使 上级目录不存在。还有一种情况就是如果你想要创建的目录存在的话,会提示报错,然 后你加上-p参数后,就不会报错了。 rmdirrmdirrmdirrmdir 删除一个目录。 rmdir 其实是 rmove directory 缩写,其只有一个选项-p 类似与 mkdir 命令,这个参数 的作用是将上级目录一起删除。举个例子吧,新建目录 mkdir -p d1/d2/d3 ,rmdir -p d1/d2/d3 相当于是删除了 d1,d1/d2, d1/d2/d3。如果一个目录中还有目录,那么当你直 接rmdir 该目录时,会提示该目录不为空,不能删除。如果你非要删除不为空的目录, 那你用 rm 指令吧。 rmrmrmrm 删除目录或者文件 rmdir 只能删除目录但不能删除文件,要想删除一个文件,则要用 rm 命令了。rm 同样也有很多选项。你可以通过 man rm 来获得详细帮助信息。在这里笔者只列举较 常用的几个选项。 -f 强制的意思,如果不加这个选项,当删除一个不存在的文件时会报错。 -i 这个选项的作用是,当用户删除一个文件时会提示用户是否真的删除。 如果删除,输入 y 否则输入 n -r 当删除目录时,加该选项,如果不加这个选项会报错。rm 是可以删除不为空的目录 的。 你会发现,笔者在列举的 rm 例子中使用的是绝对路径,而ls 则使用的相对路径。这是 为什么呢? whichwhichwhichwhich 用来查找一个命令的绝对路径,这个命令笔者不详细介绍,因为平时笔者只用 来查找一个命令的绝对路径。 aliasaliasaliasalias 用来设置指令的别名。语法:alias[别名]=[指令名称],例如 alias rm='rm -i' , 即当我们使用 rm命令时,实际上是使用的是 rm –i ,而用绝对路径的/bin/rm 则不会 被alias,该命令在以后章节中会详细介绍。 【环境变量 PATHPATHPATHPATH】 上边提到了 alias,也提到了绝对路径的/bin/rm ,然后你意识到没有,为什么我们 输入很多命令时是直接打出了命令,而没有去使用这些命令的绝对路径?这是因为环境 变量PATH 在起作用了。请输入 echo $PATH,这里的 echo 其实就是打印的意思,而PATH 前面的$表示后面接的是变量。 因为/bin 在PATH 的设定中,所以自然就可以找到 ls了。如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你? 怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自 然系统就找不到可执行文件了,因此就会告诉你, command not found !那么该怎么 克服这种问题呢? 有两个方法,一种方法是直接将 /root 的路径加入 PATH 当中!如何增加?可以 使用: PATH=”$PATH”:/root 另一种方式则是使用完整档名,亦即直接使用相对或绝对路径来执行,例如: /root/ls ./ls 关于rm,笔者使用最多便是-rf 两个选项合用了。不管删除文件还是目录都可以。 但是方便的同时也要多注意,万一你的手太快后边跟了/那样就会把你的系统文件全部 删除的,切记切记。 lslslsls 在前面的命令中多次用到它。现在你已经明白它的含义了吧。没有错,就是查看某 个目录或者某个文件,是list 的简写。ls 后可以跟一个目录,也可以跟一个文件。以下 是ls的选项,在这里笔者并没有完全列出,只是列出了平时使用最多的选项。其他选 项,你可以自行通过 man ls 查询。 -a 全部的档案都列出,包括隐藏的。linux 文件系统中同样也有隐藏文件。这些隐藏文 件的文件名是以.开头的。例如.test, /root/.123, /root/.ssh 等等,隐藏文件可以是目录也 可以是普通文件。 -l 详细列出文件的属性信息,包括大小、创建日期、所属主所属组等等。ll 这个命令 等同于 ls –l 。 --color=never/always/auto never 即不要显示颜色,always 即总显示颜色,auto 是由系 统自行判断。在 Redhat/CentOS 系统中,默认是带颜色的,因为我们平时用的 ls已经 alias 成了ls –color=tty 所以目录的颜色是蓝色的,而可执行文件的颜色是绿色。这样有 助于帮我们区分文件的格式。 -d 后边跟目录,如果不加这个选项则列出目录下的文件,加上后只列车目录本身。 cpcpcpcp copy 的简写,即拷贝。格式为 cp [选项][ 来源文件 ][目的文件],例如我想 把test1 拷贝成 test2 ,这样即可 cp test1 test2,以下介绍几个常用的选项 -d 这里涉及到一个“连接”的概念。连接分为软连接和硬连接。在以后的章节中会详 细解释,现在你只要明白这里的软连接跟 windows 中的快捷方式类似即可。如果不加 这个-d 则拷贝软连接时会把软连接的目标文件拷贝过去,而加上后,其实只是拷贝了 一个连接文件(即快捷方式)。 上例中的 ln 命令即为建立连接的,以后再做详细解释。 -r 如果你要拷贝一个目录,必须要加-r选项,否则你是拷贝不了目录的。 -i 如果遇到一个存在的文件,会问是否覆盖。在Redhat/CentOS 系统中,我们使用的 cp 其实是 cp –i 下面简单做一个小试验,很快你就会明白-i 选项的作用了。 上例中,touch 命令,看字面意思就是摸一下,没错,如果有这个文件,则会改变 文件的访问时间,如果没有这个文件就会创建这个文件。前面说过 echo,其实就是打 印,在这里所 echo 的内容”abc” 和 “def”并没有显示在屏幕上,而是分别写进了文件 111 和222, 其写入作用的就是这个大于号”>” 在linux 中这叫做重定向,即把前面产生 的输出写入到后面的文件中。在以后的章节中会做详细介绍,这里你要明白它的含义即 可。而cat 命令则是读一个文件,并把读出的内容打印到当前屏幕上。该命令也会在后 续章节中详细介绍。 -u 该选项仅当目标文件存在时才会生效,如果源文件比目标文件新才会拷贝,否则不 做任何动作。 mvmvmvmv 移动的意思,是 move 的简写。格式为 mv [ 选项 ][源文件][目标文件],下面 介绍几个常用的选项。 -i 和cp的-i 一样,当目标文件存在时会问用户是否要覆盖。在Redhat/CentOS 系统中, 我们使用的 mv 其实是 mv –i -u 和上边 cp 命令的-u选项一个作用,当目标文件存在时才会生效,如果源文件比目 标文件新才会移动,否则不做任何动作。 该命令有集中情况,你注意到了吗? 1) 目标文件是目录,而且目标文件不存在; 2) 目标文件是目录,而且目标文件存在; 3) 目标文件不是目录不存在; 4) 目标文件不是目录存在; 目标文件是目录,存在和不存在,移动的结果是不一样的,如果存在,则会把源文 件移动到目标文件目录中。不存在的话移动完后,目标文件是一个文件。这样说也许你 会觉得有点不好理解,看例子吧。 windows 下的重命名,在 linux 下用mv 就可以搞定。 catcatcatcat 比较常用的一个命令,即查看一个文件的内容并显示在屏幕上。 -n 查看文件时,把行号也显示到屏幕上。 上例中出现了一个”>>”,这个符号跟前面介绍的”>”的作用都是重定向,即把前面输出 的东西输入到后边的文件中,只是”>>”是追加的意思,而用”>”,如果文件中有内容则会删 除文件中内容,而”>>”则不会。 -A 显示所有东西出来,包括特殊字符 tactactactac 其实是 cat 的反写,同样的功能也是反向打印文件的内容到屏幕上。 moremoremoremore 也是用来查看一个文件的内容。当文件内容太多,一屏幕不能占下,而你用 cat 肯定 是看不前面的内容的,那么使用 more 就可以解决这个问题了。当看完一屏后按空格键继续 看下一屏。但看完所有内容后就会退出。如果你想提前退出,只需按 q键即可。 lesslesslessless 作用跟 more 一样,但比 more 好在可以上翻,下翻。空格键同样可以翻页,而按”j”键 可以向下移动(按一下就向下移动一行),按”k”键向上移动。在使用 more 和less 查看某个 文件时,你可以按一下”/” 键,然后输入一个 word 回车,这样就可以查找这个 word 了。如 果是多个该 word 可以按”n”键显示下一个。另外你也可以不按”/”而是按”?”后边同样跟 word 来搜索这个 word,唯一不同的是,”/”是在当前行向下搜索,而”?”是在当前行向上搜索。 headheadheadhead head 后直接跟文件名,则显示文件的前十行。如果加 –n 选项则显示文件前 n行。 tailtailtailtail 和head 一样,后面直接跟文件名,则显示文件最后十行。如果加-n 选项则显示文件 最后n行。 -f 动态显示文件的最后十行,如果文件是不断增加的,则用-f 选项。如:tail -f /var/log/messages 【文件的所属主以及所属组】 一个linux 目录或者文件,都会有一个所属主和所属组。所属主,即文件的拥有者,而 所属组,即该文件所属主所在的一个组。Linux 这样设置文件属性的目的是为了文件的安全。 例如,test 文件的所属主是 user0 而test1 文件的所属主是 user1,那么user1 是不能查看 test 文件的,相应的 user0 也不能查看 test1 文件。然后有这样一个应用,我想创建一个文件同 时让user0 和user1 来查看怎么办呢? 这时“所属组”就派上用场了。即,创建一个群组 users,让user0 和user1 同属于 users 组,然后建立一个文件 test2,且其所属组为 users,那么user0 和user1 都可以访问 test2 文 件。 Linux 文件属性不仅规定了所属主和所属组,还规定了所属主(user)、所属组(group)以 及其他用户(others)对该文件的权限。你可以通过 ls -l 来查看这些属性。 【linux linux linux linux 文件属性】 上例中,用ls –l 查看当前目录下的文件时,共显示了 9列内容(用空格划分列),都代 表了什么含义呢? 第1列,包含的东西有该文件类型和所属主、所属组以及其他用户对该文件的权限。第 一列共 10 位。其中第一位用来描述该文件的类型。上例中,我们看到的类型有”d”,“-“,其 实除了这两种外还有”l”,“b”,“c”,”s”等。 d 表示该文件为目录; - 表示该文件为普通文件; l 表示该文件为连接文件(linux file),上边提到的软连接即为该类型; b 表示该文件为块设备文件,比如磁盘分区 c 表示该文件为串行端口设备,例如键盘、鼠标。 s 表示该文件为套接字文件(socket),用于进程间通信。 后边的 9位,每三个为一组。均为 rwx 三个参数的组合。其中 r 代表可读,w代表可 写,x代表可执行。前三位为所属主(user)的权限,中间三位为所属组(group)的权限, 最后三位为其他非本群组(others)的权限。下面拿一个具体的例子来述说一下。 一个文件的属性为-rwxr-xr-- ,它代表的意思是,该文件为普通文件,文件拥有者可读 可写可执行,文件所属组对其可读不可写可执行,其他用户对其只可读。 对于一个目录来讲,打开这个目录即为执行这个目录,所以任何一个目录必须要有 x 权限才能打开并查看该目录。例如一个目录的属性为 drwxr--r-- 其所属主为 root,那么除了 root 外的其他用户是不能打开这个目录的。 第2列,表示为连接占用的节点(inode),若为目录时,通常与该目录地下还有多少目 录有关系,关于连接(link)在以后章节详细介绍。 第3列,表示该文件的所属主。 第4列,表示该文件的所属组。 第5列,表示该文件的大小。 第6列、第7列和第 8列为该文件的创建日期或者最近的修改日期,分别为月份日期以 及时间。 第9列,文件名。如果前面有一个. 则表示该文件为隐藏文件。 【更改文件的权限】 更改文件的权限,也就是更改所属主、所属组以及他们对应的读写执行权限。 1)更改所属组 chgrpchgrpchgrpchgrp 语法:chgrp [组名][文件名] 这里用到了 groupadd 命令,其含义即增加一个用户组。该命令在以后章节中做详细介绍, 你只要知道它是用来增加用户组的即可。 2)更改文件的所属主 chownchownchownchown 语法: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)改变用户对文件的读写执行权限 chmodchmodchmodchmod 在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增加或者减少某个权限(读,写,执行),例如 umaskumaskumaskumask 上边也提到了默认情况下,目录权限值为 766,普通文件权限值为 644。那么这个值是 由谁规定呢?追究其原因就涉及到了 umask。 umask 语法: umask xxx (这里的 xxx 代表三个数字) 查看umask 值只要输入 umask 然后回车。 umask 预设是 0022,其代表什么含义?先看 一下下面的规则: 1)若用户建立为普通文件,则预设“没有可执行权限”,只有 rw 两个权限。最大为 666 (-rw-rw-rw-) 2)若用户建立为目录,则预设所有权限均开放,即 777(drwxrwxrwx) umask 数值代表的含义为,上边两条规则中的默认值(文件为 666,目录为 777)需要 减掉的权限。所以目录的权限为(rwxrwxrwx) –(----w--w-) = (rwxr-xr-x),普通文件的权限为 (rw-rw-rw-) –(----w--w-) = (rw-r--r--)。umask 的值是可以自定义的,比如设定 umask 为 002, 你再创建目录或者文件时,默认权限分别为(rwxrwxrwx) –(-------w-) = (rwxrwxr-x)和(rw-rw-rw-) –(-------w-) = (rw-rw-r--)。 umask 可以在/etc/bashrc 里面更改,预设情况下,root 的umask 为022,而一般使用者 则为002,因为可写的权限非常重要,因此预设会去掉写权限。 chattrchattrchattrchattr 修改文件的特殊属性 语法: chattr [+-=][ASaci [文件或者目录名] +-= :分别为增加、减少、设定 A:增加该属性后,文件或目录的 atime 将不可被修改; S:增加该属性后,会将数据同步写入磁盘中; a:增加该属性后,只能追加不能删除,非 root 用户不能设定该属性; c:自动压缩该文件,读取时会自动解压; i:增加后,使文件不能被删除、重命名、设定连接、写入、新增数据; 增加i属性后不能在该目录中建立文件。 增加a属性后,只能追加不能删除。 lsattrlsattrlsattrlsattr 列出文件////目录的特殊属性 语法: lsattr [-aR] [文件/目录名] -a:类似与 ls 的-a 选项,即连同隐藏文件一同列出; -R:连同子目录的数据一同列出 在上例中,test4 是在test3 目录增加 a属性后建立的,所以 test4 也有a属性,通过这个例 子可以看出,chattr 的属性是级联生效的,不仅对当前目录生效而且会对目录下的文件同样 生效。 【在linux linux linux linux 下搜索一个文件】 在windows 下有一个搜索工具,可以让我们很快的找到一个文件,这是很有用的。然 而在linux 下搜索功能更加强大。 whichwhichwhichwhich 用来查找可执行文件的绝对路径。 在前面章节中已经多次用到该命令,需要注意的一点是,which 只能用来查找 PATH 环 境变量中出现的路径下的可执行文件。这个命令用的也是蛮多的,有时候我们不知道某个命 令的绝对路径,which 一下很容易就知道了。 当查找的文件在 PATH 变量中并没有时,就会报错。 whereiswhereiswhereiswhereis 通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。 语法: whereis [-bmsu] [文件名称] -b:只找 binary 文件 -m:只找在说明文件 manual 路径下的文件 -s:只找 source 来源文件 -u:没有说明档的文件 说明:whereis 笔者几乎很少用到,如果你感兴趣请深入研究。 locatelocatelocatelocate 类似于 whereis,也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪 里。后边直接跟文件名。如果你的 linux 没有这个命令,请安装软件包 mlocate ,这个软件 包在你的系统安装盘里,后缀名是 RPM,随后介绍的 find 命令会告诉你如何查找这个包。 如果你装的 CentOS 你可以使用这个命令来安装 yum install –y mlocate 。 前提是你的 CentOS 能连互联网。至于 yum 这个命令如何使用,到后续章节你自然会明白。如果你刚装 上这个命令,初次使用会报错。 这是因为系统还没有生成那个文件列表库。你可以使用 updatedb 命令立即生成(更新) 这个库。如果你的服务器上正跑着重要的业务,那么你最好不要去运行这个命令,因为一旦 运行,服务器的压力会变大。这个数据库默认情况下每周更新一次。所以你用 locate 命令去 搜索一个文件,正好是在两次更新时间段内,那你肯定是得不到结果的。你可以到 /etc/updated.conf 去配置这个数据库生成(更新)的规则。locate 命令笔者用的也并不多, 所以你只要明白有这么一个东西即可。你用到时再去深究其用法吧。 findfindfindfind 这个搜索工具是笔者用的最多的一个,所以请你务必要熟悉它。 语法: find [路径][参数] 下面介绍几个笔者经常用的参数 -atime +n :访问或执行时间大于 n天的文件 -ctime +n :写入、更改 inode 属性(例如更改所有者、权限或者连接)时间大于 n 天的文件 -mtime +n :写入时间大于 n天的文件 看到这里,你对这三个 time 是不是有些晕了,那笔者就先给你介绍一下这三个 time 属 性。 文件的 Access time,atime 是在读取文件或者执行文件时更改的。文件的 Modified time,mtime 是在写入文件时随文件内容的更改而更改的。文件的 Create time,ctime 是在 写入文件、更改所有者、权限或链接设置时随 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 等等。后续的内容还会介绍文件类型的。 【linux linux linux 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,那么你不要妄图挂载 NFS 格式的文件到 linux 下,因为它不支持 NFS。虽然有些 版本的 linux 支持NFS,但不建议使用,因为目前的技术还不成熟。 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 也有缺点,就是每升级一个版本,都要将磁盘重新格式化一次。 【linux linux linux 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 linux linux 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 的空间浪费掉!所 以,当你在格式化硬盘的时候,请千万注意到你的系统未来的使用方向。 【lnlnlnln 建立连接档】 前面提到过两次连接档的概念,现在终于该好好介绍下这部分内容了。连接档分为两种, 硬连接(hard link)和软连接(symbolic link)。 HardHardHardHard LinksLinksLinksLinks: 上面内容中说过,当系统要读取一个文件时,就会先去读 inode table,然后 再去根据 inode 中的信息到块区域去将数据取出来。而hard link 是直接再建立一个 inode 连 接到文件放置的块区域。也就是说,进行 hard link 的时候实际上该文件内容没有任何变化, 只是增加了一个指到这个文件的 inode,不过这样一来就会有个问题,因为增加的 inode 会 连接到块区域,而目录本身仅仅消耗 inode 而已,那么hard link 就不能连接目录了。请你记 住,hard link 有两个限制:1 不能跨文件系统,因为不通的文件系统有不同的 inode table; 2 不能连接目录。 SymbolicSymbolicSymbolicSymbolic LinksLinksLinksLinks:跟hard link 不同,这个是建立一个独立的文件,而这个文件的作用是当读 取这个连接文件时,它会把读取的行为转发到该文件所 link 的文件上。这样讲,也许比较绕 口,那么就来举一个例子。现在有文件 a,我们做了一个软连接文件 b(只是一个连接文件, 非常小),b指向了文件 a。当读取 b时,那么b就会把读取的动作转发到 a上,这样就读取 到了文件 a。所以,当你删除文件 a时,文件b并不会被删除,但是再读取 b时,会提示无 法打开文件。而,当你删除 b时,a是不会有任何影响的。 看样子,似乎 hard link 比较安全,因为即使某一个 inode 被杀掉了,只要有任何一个 inode 存在,那么该文件就不会不见!不过,不幸的是,由于 Hard Link 的限制太多了,包 括无法做目录的 link ,所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方向较 广!那么如何建立软连接和硬连接呢?这就用到了 ln 命令。 ln 语法: ln [-s] [来源文件][目的文件] ln 常用的选项就一个-s ,如果不加就是建立硬连接,加上就建立软连接。 在建立硬连接前后,123 目录所占空间大小并没有改变。 当把源文件删除后,空间仍旧没有变化。说明了删除一个文件其实只是删除了 inode 信息。 不能创建目录的硬连接。 建立软连接后,456 目录增加了 4k 删除源文件后会提示“没有这个文件”的错误。 目录是可以软连接的。 删除软连接对源文件没有任何影响。 第七章 linux linux linux linux 系统用户以及用户组管理 关于这部分内容,笔者在日常的 linux 系统管理工作中用到的并不多,但这并不代表该 内容不重要。毕竟linux 系统是一个多用户的系统,每个账号都干什么用,你必须了如指掌。 因为这涉及到一个安全的问题。 【认识/etc/passwd /etc/passwd /etc/passwd /etc/passwd 和/etc/shadow/etc/shadow/etc/shadow/etc/shadow】 这两个文件可以说是 linux 系统中最重要的文件之一。如果没有这两个文件或者这两个 文件出问题,则你是无法正常登录 linux 系统的。 /etc/passwd 由’:’分割成 7个字段,每个字段的具体含义是: 1)用户名(如第一行中的 root 就是用户名),代表用户账号的字符串。用户名字符可以是 大小写字母、数字、减号(不能出现在首位)、点以及下划线,其他字符不合法。虽然用户 名中可以出现点,但不建议使用,尤其是首位为点时,另外减号也不建议使用,因为容易造 成混淆。 2)存放的就是该账号的口令,为什么是’x’呢?早期的 unix 系统口令确实是存放在这里,但 基于安全因素,后来就将其存放到/etc/shadow 中了,在这里只用一个’x’代替。 3)这个数字代表用户标识号,也叫做 uid。系统识别用户身份就是通过这个数字来的,0就 是root,也就是说你可以修改 test 用户的 uid 为0,那么系统会认为 root 和test 为同一个账 户。通常 uid 的取值范围是 0~65535,0是超级用户(root)的标识号,1~499 由系统保留, 作为管理账号,普通用户的标识号从 500 开始,如果我们自定义建立一个普通用户,你会看 到该账户的标识号是大于或等于 500 的。 4)表示组标识号,也叫做 gid。这个字段对应着/etc/group 中的一条记录,其实/etc/group 和/etc/passwd 基本上类似。 5)注释说明,该字段没有实际意义,通常记录该用户的一些属性,例如姓名、电话、地址 等等。不过,当你使用 finger 的功能时就会显示这些信息的(稍后做介绍)。 6)用户的家目录,当用户登录时就处在这个目录下。root 的家目录是/root,普通用户的家 目录则为/home/username,这个字段是可以自定义的,比如你建立一个普通用户 test1,要 想让test1 的家目录在/data 目录下,只要修改/etc/passwd 文件中 test1 那行中的该字段为 /data 即可。 7)shell,用户登录后要启动一个进程,用来将用户下达的指令传给内核,这就是 shell。Linux 的shell 有很多种 sh, csh, ksh, tcsh, bash 等,而 Redhat/CentOS 的shell 就是bash。查看 /etc/passwd 文件,该字段中除了/bin/bash 外还有/sbin/nologin 比较多,它表示不允许该账 号登录。如果你想建立一个账号不让他登录,那么就可以把该字段改成/sbin/nologin,默认 是/bin/bash。 再来看看/etc/shadow 这个文件,和/etc/passwd 类似,用”:”分割成 9个字段。 1)用户名,跟/etc/passwd 对应。 2)用户密码,这个才是该账号的真正的密码,不过这个密码已经加密过了,但是有些黑客 还是能够解密的。所以为了安全,该文件属性设置为 600,只允许 root 读写。 3)上次更改密码的日期,这个数字是这样计算得来的,距离1970 年1月1日到上次更改密 码的日期,例如上次更改密码的日期为 2012 年1月1日,则这个值就是 365*(2012-1970) +1=15331。 4)要过多少天才可以更改密码,默认是 0,即不限制。 5)密码多少天后到期。即在多少天内必须更改密码,例如这里设置成 30,则30 天内必须 更改一次密码,否则将不能登录系统,默认是 99999,可以理解为永远不需要改。 6)密码到期前的警告期限,若这个值设置成 7,则表示当 7天后密码过期时,系统就发出 警告告诉用户,提醒用户他的密码将在 7天后到期。 7)账号失效期限。你可以这样理解,如果设置这个值为 3,则表示:密码已经到期,然而 用户并没有在到期前修改密码,那么再过 3天,则这个账号就失效了,即锁定了。 8)账号的生命周期,跟第三段一样,是按距离 1970 年1月1日多少天算的。它表示的含义 是,账号在这个日期前可以使用,到期后账号作废。 9)作为保留用的,没有什么意义。 【新增////删除用户和用户组】 a. 新增一个组 groupadd [-g GID] groupname 不加-g 则按照系统默认的 gid 创建组,跟用户一样,gid 也是从 500 开始的 -g选项可以自定义 gid b. 删除组 gropudel groupname 没有特殊选项。 c. 增加用户 useradd [-u UID][-g GID][-d HOME][-M][-s] -u 自定义 UID -g 使其属于已经存在的某个 GID -d 自定义用户的家目录 -M 不建立家目录 -s 自定义 shell 你会发现,创建test11 时,加上了-M选项后,在/etc/passwd 文件中 test11 那行的第六字段 依然有/home/test11,可是 ls查看该目录时,会提示该目录不存在。 -M选项的作用就是不创建用户的家目录。 -d. 删除用户 userdel [-r] username -r 选项的作用是删除用户时,连同用户的家目录一起删除。 【chfnchfnchfnchfn 更改用户的 fingerfingerfingerfinger (不常用)】 前面内容中提到了 findger,即在/etc/passwd 文件中的第 5个字段中所显示的信息,那 么如何去设定这个信息呢? 就是chfn 这个命令了。修改完后,就会在/etc/passwd 文件中的 test 的那一行第五个字段中 看到相关信息了,默认是空的。 【创建////修改一个用户的密码 ““““passwdpasswdpasswdpasswd [username][username][username][username]””””】 等创建完账户后,默认是没有设置密码的,虽然没有密码,但该账户同样登录不了系统。 只有设置好密码后方可登录系统。 为用户创建密码时,为了安全起见,请尽量设置复杂一些。你可以按照这样的规则来设 置密码:a. 长度大于 10 个字符;b. 密码中包含大小写字母数字以及特殊字符(*&等);c. 不 规则性(不要出现 root, happy, love, linux, 123456, 111111 等等单词或者数字);d. 不要带有 自己名字、公司名字、自己电话、自己生日等。 passwd 后面不跟用户名则是更改当前用户的密码,当前用户为 root,所以此时修改的是 root 的密码,后面跟 test 则修改的是 test 的密码。 【用户身份切换】 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 Linux Linux Linux 磁盘管理 【查看磁盘或者目录的容量 dfdfdfdf 和 dudududu】 dfdfdfdf 查看已挂载磁盘的总容量、使用容量、剩余容量等,可以不加任何参数,默认是按 k为单位显示的 df常用参数有 –i -h -k –m等 -i 使用inodes 显示结果 -h 使用合适的单位显示,例如 G -k -m 分别为使用 K,M为单位显示 简单介绍一下,你看到的相关数据。Filesystem 表示扇区,也就是你划分磁盘时所分的 区;1K-blocks/1M-blocks 表示以 1K/1M 为单位;Used 和 Available 分别是已使用和剩余; Use% 就是已经使用的百分比,如果这个值大于 90% 那么你就应该注意了,磁盘很有可能 马上就会变满的;Mounted on 则表示该分区(扇区)所挂载的地方。 dudududu 用来查看某个目录所占空间大小 语法:du [-abckmsh] [文件或者目录名] 常用的参数有: -a:全部文件与目录大小都列出来。如果不加任何选项和参数只列出目录(包含子目录) 大小。 -b:列出的值以 bytes 为单位输出,默认是以 Kbytes -c:最后加总 -k:以KB 为单位输出 -m:以MB 为单位输出 -s:只列出总和 -h:系统自动调节单位,例如文件太小可能就几 K,那么就以 K为单位显示,如果大到 几G,则就以 G为单位显示。笔者习惯用 du –sh filename 这样的形式。 【磁盘的分区和格式化】 笔者经常做的事情就是拿一个全新的磁盘来分区并格式化。这也说明了作为一个 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.ext2mkfs.ext2mkfs.ext2mkfs.ext2 //// mkfs.ext3mkfs.ext3mkfs.ext3mkfs.ext3 /mke2fs/mke2fs/mke2fs/mke2fs 格式化 linux linux linux linux 硬盘分区 当用man 查询这三个命令的帮助文档时,你会发现我们看到了同一个帮助文档,这说 明三个命令是一样的。常用的选项有: -b:分区时设定每个数据区块占用空间大小,目前支持 1024, 2048 以及4096 bytes 每 个块。 -i:设定 inode 值 -c:在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢 -L:预设该分区的标签 label -j:建立 ext3 格式的分区,如果使用 mkfs.ext3 就不用加这个选项了 不加任何选项,直接格式化/dev/hdb1 上例中更改了 block size 为4096 默认是 1024,而inode 设定为 4096。 下面的例子分区时自定义分区的 label(标签)名。 e2labele2labele2labele2label 用来查看或者修改分区的标签(labellabellabellabel) 这个命令很简单,后边直接跟分区编号,即可查看该分区的 label,当想要修改标签名 时,分区编号后边跟想要的标签名即可。 fsckfsckfsckfsck 检查硬盘有没有坏道 语法: fsck [-Aar] [分区] -A:加该参数时,后不需要跟分区名作为参数。它会自动检查/etc/fstab 文件下的所有 分区(开机过程中就会执行一次该操作); -a :自动修复检查到有问题的分区; -r :当检查到有坏道的分区时会让用户决定是否修复。 当你使用 fsck 检查磁盘有无坏道时,会提示用户“跑这个任务可能会导致某些挂载的文件 系统损坏”,所以这个命令不要轻易运行。否则真的遇到问题,系统甚至都不能启动了。 【挂载////卸载磁盘】 在上面的内容中讲到了磁盘的分区和格式化,那么格式化完了后,如何去用它呢?这就 涉及到了挂载这块磁盘。格式化后的磁盘其实是一个块设备文件,类型为 b,也许你会想, 既然这个块文件就是那个分区,那么直接在那个文件中写数据不就写到了那个分区中么?当 然不行。 在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把 某一个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据使,则都会写到该分 区中。这就需要你注意一下,在挂载该分区前,挂载点(目录)下必须是个空目录。其实目 录不为空并不影响所挂载分区的使用,但是一旦挂载上了,那么该目录下以前的东西就不能 看到了。只有卸载掉该分区后才能看到。 mountmountmountmount 挂载设备 先建立/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 检测。1,2 都表示检测,0表示不检测,在 Redhat 中,这个 1,2还有个说法,/ 分区必须设为 1,而 且整个 fstab 中只允许出现一个 1,这里有一个优先级的说法。1比2优先级高,所以先检测 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 我们继续回来讲这个 mount,mout -a 如果运行了这个命令,则会把 /etc/fstab 中出现的所有磁盘分区挂载上。所以当你在/etc/fstab 文件中增加一行后,你完全 可以直接运行 mount -a 来挂载你增加的那行,这样就不用重启啦。 你可以使用 mount -o 选项来重新挂载一个分区,并同时指定你想要的选项(即上边介 绍fstab 第六列中那些) 看到了吧,使用了 ro 选项,则不能新建文件了。 再重新挂载一次就恢复正常了,如果不加任何其他选项,则就是 defaults。 笔者在日常的运维工作中遇到过这样的情况,一台服务器上新装了亮块磁盘,磁盘a(在 服务器上显示为 sdc)和磁盘 b(在服务器上显示为 sdd),有一次把这两块磁盘都拔掉了, 然后再重新插上,重启机器,结果磁盘编号调换了,a变成了 sdd,b变成了 sdc(这是因为 把磁盘插错了插槽),问题来了。通过上边的学习,你挂载磁盘是通过/dev/hdb1 这样的分 区名字来挂载的,如果先前加入到了/etc/fstab 中,结果系统启动后则会挂载错分区。那么 怎么样避免这样的情况发生? blkidblkidblkidblkid 这个命令是用来显示磁盘分区 uuid 的,uuid 其实就是一大串字符,在linux 系统 中每一个分区都会有唯一的一个 uuid。说到这,聪明的你想到了吧,没有错,我们就用这 唯一的 uuid 来挂载磁盘分区。 这个命令笔者只是用来显示 uuid,没有其他用途所以不做详细介绍,当然你也可以在命令 后边跟某一个分区,只显示该分区的 uuid。 看到了吧,其实是很好用的。那么怎么让它也开机启动?很简单,把刚才敲的 mount 磁盘 的命令直接写到 /etc/rc.d/rc.local 文件即可。对了,笔者到现在还没有给你讲过这个 rc.local 文件的作用。简单点说,系统启动完后会执行这个文件中的命令。所以只要你想开机后运行 什么命令统统写入到这个文件下面吧。 其实这个文件就是一个 shell 脚本,以后笔者会单独用一章来介绍它。行开头的”#”是注释的 意思,代表这行在这个脚本中不生效。你想让系统开机后运行什么命令,就把什么命令写到 这里面来。就比如刚才笔者挂载的那条命令。你可以这样实现: mount 还有一个比较常用的选项就是-t ,后边指定文件系统的类型,比如挂载软盘时 就需要指定 vfat,而挂载光盘时就需要指定 iso9660,但在笔者多年来的经验,目前的系统 都是智能识别所要挂载分区的系统格式类别的。也就是说,用不着你去指定,它会自动判断 的。 umountumountumountumount 卸载设备 现在你学会了如何挂载一个设备,那么如何去卸载一个设备呢,这就要用到 umount 了, 这个命令也简单的很,后边可以跟挂载点,也可以跟分区名 (/dev/hdb1) 有时也许你会遇到比较难卸载的设备,就像在 windows 下无法删除 U盘一样,教你一个特 管用的方法就是 umount -l /dev/hdb1 ,这个-l选项有强制卸载的意思,你一定要记住哦, 非常有用的。 【建立一个 swap swap swap swap 文件】 从装系统时就接触过这个 swap 了,前面也说过它类似与 windows 的虚拟内存,分区的 时候一般大小为内存的 2倍,如果你的内存超过 4G,那么你分 8G 似乎是没有必要了。分 4G 足够日常交换了。然而,还会有虚拟内存不够用的情况发生。如果真遇到了,莫非还要 重新分一下磁盘?当然不能!那我们就增加一个虚拟的磁盘出来。 基本的思路就是:建立 swapfile � 格式化为 swap 格式 � 启用该虚拟磁盘 利用dd 来创建一个 419M 的文件/tmp/newdisk 出来,其中if代表从哪个文件读,/dev/zero 是linux 下特有的一个 0生成器,of表示输出到哪个文件,bs即块大小,count 则定义有多 少个块。 mkswap 这个命令是专门格式化 swap 格式的分区的,这个命令用的时候一定要看清楚了, 否则把其他分区给格式化错了就只有哭了。 free 是用来查看系统内存以及虚拟内存使用情况的,-m选项是以 M的形式查看。可以看到 当前系统的。而 swapon 是启用我们新建的 swap 文件,启用后再用 free 查看发现多了 400M。 我们还可以用 swapoff 关闭启用的 swap 文件。 【磁盘配额】 磁盘配合其实就是给每个用户分配一定的磁盘额度,只允许他使用这个额度范围内的磁 盘空间。在 linux 系统中,是多用户多任务的环境,所以会有很多人共用一个磁盘的情况。 针对每个用户去限定一定量的磁盘空间是有必要的,这样才显得公平。 在linux 中,用来管理磁盘配额的东西就是 quota 了。如果你的 linux 上没有 quota,则 需要你安装这个软件包 quota-3.13-5.el5.RPM (其实版本是多少无所谓了,关键是这个软件 包)。quota 在实际应用中是针对整个分区进行限制的。如果你的/dev/hda3 是挂载在/home 目录下的,那么/home 所有目录都会受到限制。 quota 这个模块主要分为 quota quotacheck quotaoff quotaon quotastats edquota setquota warnquota repquota 这几个命令,下面就分别介绍这些命令。 quota 用来显示某个组或者某个使用者的限额。 语法:quota [-guvs] [user,group] -g :显示某个组的限额 -u :显示某个用户的限额 -v :显示的意思 -s :选择 inod 或硬盘空间来显示 quotacheck 用来扫描某一个磁盘的 quota 空间。 语法:quotacheck [-auvg] /path -a :扫描所有已经 mount 的具有 quota 支持的磁盘 -u :扫描某个使用者的文件以及目录 -g :扫描某个组的文件以及目录 -v :显示扫描过程 -m :强制进行扫描 edquota 用来编辑某个用户或者组的 quota 值。 语法:edquota [-u user] [-g group] [-t] edquota -p user -u user -u :编辑某个用户的 quota -g :编辑某个组的 quota -t :编辑宽限时间 -p :拷贝某个用户或组的 quta 到另一个用户或组 当运行 edquota -u user 时,系统会打开一个文件,你会看到这个文件中有 7列,它们 分别代表的含义是: Filesystem :磁盘分区,如/dev/hda3 blocks :当前用户在当前的 Filesystem 中所占用的磁盘容量,单位是 Kb。该值请不要 修改。 soft/hard :当前用户在该 Filesystem 内的quota 值,soft 指的是最低限额,可以超过这 个值,但必须要在宽限时间内将磁盘容量降低到这个值以下。 hard 指的是最高限额,即不 能超过这个值。当用户的磁盘使用量高于 soft 值时,系统会警告用户,提示其要在宽限时 间内把使用空间降低到 soft 值之下。 inodes :目前使用掉的 inode 的状态,不用修改。 quotaon 启动quta,在编辑好 quota 后,需要启动才能是 quta 生效 语法:quotaon [-a] [-uvg directory] -a :全部设定的 quota 启动 -u :启动某个用户的 quota -g :启动某个组的 quota -s :显示相关信息 quotaoff 关闭quota 该命令常用只有一种情况 quotaoff -a 关闭全部的 quota 以上讲了很多 quota 的相关命令,那么接下来笔者教你如何在实践应用中去做这个磁盘 配额。整个执行过程如下: 首先先确认一下,你的/home 目录是不是单独的挂载在一个分区下,用 df 查看即可。 如果不是则需要你跟我一起做。否则这一步即可省略。 笔者的 linux 系统中,/home 并没有单独占用一个分区。所以需要把/home 目录挂载在一个 单独的分区下,因为 quota 是针对分区来限额的。 笔者用 fdisk -l 查看目前/dev/hdb 磁盘有 5个可用分区,所以笔者打算把/dev/hdb1 挂载在 /home 目录下 看到了吧,目前笔者的/home 目录已经是一个单独的分区了。 1)建立测试用户 首先建立一个 test 用户,则同时建立了一个 test 组。可以在/etc/passwd 中有以 test 为开头 的行,其中 uid 和 gid 都为 500 ,然后又建立一个 test1 账号,使其加入 test 组,查看/etc/passwd 文件发现 test 和test1 用户的 gid 都为500。(也许你对/etc/passwd 文件、增加一个用户以及 uid 和gid 等概念不熟悉,没有关系,在以后的章节中会做介绍,在这里只需要你明白即可) 2)打开磁盘的 quota 功能 默认linux 并没有对任何分区做 quota 的支持,所以需要我们手动打开磁盘的 quota 功 能,你是否记得,在前面内容中分析/etc/fstab 文件的第四列时讲过这个 quota 选项(usrquota, grpquota)。没错,要想打开这个磁盘的 quota 支持就是需要修改这个第四列的。用 vim 编 辑/etc/fstab 加入一行,如下图: vim 命令将会在后续章节详细介绍,前面介绍过如何进入编辑模式以及如何保存文件。如果 你的linux 系统已经有/home 这一行,那么直接修改第四列,加上 usrquota,grpguota(中间 没有空格)。接下来需要重新挂载/home。 另外你也可以这样实现重新挂载/home 如何查看是否启用了 quota 呢? 只要查看/etc/mtab 文件中/home 所在那行是否有 usrguota,grpquota 即可。笔者的/dev/hdb1 现在已经支持了 quota 3)扫描磁盘的使用者使用状况,并产生重要的 aquota.group 与aquota.user 这一步就需要用到 quotacheck 了,aquota.group 与aqouta.user 分别是组以及用户磁盘 配额需要的配置文件。如果没有这两个文件,则磁盘配额是不会生效的。 当首次使用 quotacheck 命令时,会提示“cannot stat old user quota file ……”其实这是在提示 你在/home 目录下没有 aquota.user 以及aquota.group 两个文件。没有关系,因为以前并没 有配置过磁盘配额,当然没有这两个文件了。当执行完 quotacheck 命令后,会在/home 目 录下生成这两个文件的。 4)启动 quota 配额 5)编辑用户磁盘配额 先来设定 test 账户的配额,然后直接把 test 的配额拷贝给 test1 即可。这里就需要用到 edquota 了。 讲上面内容修改为 其中单位是 Kb,所以soft 值大约为 20Mb,hard 值为30Mb,保存这个文件,保存的方式跟 vim 一个文件的方式一样的。 将test 的配额复制给 test1。下面继续设定宽限时间。 默认是 7days 在这里我们改为 1days。下面查看一下 test 以及test1 用户的配额吧。 6)编辑组磁盘配额 设定组 test 的soft 配额值为 40M,hard 值为50M。下面查看组 test 的配额。 7)设定开机启动 前面已经讲到启动磁盘配额的命令是 quotaon -aug ,所以要想开机启动,只需将这条 命令加入到 /etc/rc.d/rc.local 文件即可。 第九章 文本编辑工具 vimvimvimvim 前面多次提到过 vim 这个东西,它是 linux 中必不可少的一个工具。没有它很多工作都 无法完成。早期的 Unix 都是使用的 vi 作为系统默认的编辑器的。你也许会有疑问,vi 与vim 有什么区别?可以这样简单理解,vim 是vi 的升级版。很多 linux 系统管理员都习惯用 vi, 那是因为他们接触 linux 的时候用的就是 vi,vim 后来才比较流行。所以,无所谓用 vi 和vim, 只要你能达到你想要的目的即可。 在笔者看来 vi 和vim 最大的区别就是编辑一个文本时,vi 不会显示颜色,而 vim 会显 示颜色。显示颜色更易于用户进行编辑。其他功能没有什么区别。所以在 linux 系统下,使 用vi 还是vim 完全取决你的个人爱好而已。笔者从一开始学 linux 就一直使用 vim,所以也 会一直以 vim 的角色来教授给你。 vim 的三种模式:一般模式、编辑模式、命令模式。这需要你牢记的,因为以前笔者刚 刚从事 linux 工作的时候去面试,很多单位的笔试题就有这个知识点。 * 一般模式: 当你vim filename 编辑一个文件时,一进入该文件就是一般模式了。 在这个模式下,你可以做的操作有,上下移动光标;删除某个字符;删除某行;复制、粘贴 一行或者多行。 * 编辑模式:一般模式下,是不可以修改某一个字符的,只能到编辑模式了。从一般模 式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R)。当进入编辑模式时,会在屏幕的最 下一行出现“INSERT 或REPLACE”的字样。从编辑模式回到一般模式只需要按一下键盘左上 方的ESC 键即可。 * 命令模式:在一般模式下,输入”:”或者”/”即可进入命令模式。在该模式下,你可以 搜索某个字符或者字符串,也可以保存、替换、退出、显示行号等等。 下面笔者教你如何在一个空白文档中写入一段文字,然后保存。 输入vim test.txt 直接回车进入一般模式。然后按”i" 字母进入编辑模式 会看到窗口的左下方出现”INSERT”字样,说明已经进入了编辑模式,此时就可以写入内容了。 等编辑完内容后,按ESC 退出编辑模式,进入一般模式。此时在左下方的”INSERT”字样消失, 然后按”:”进入命令模式,最后输入 wq 保存并退出 vim。 这时,看一下 test.txt 文档的内容吧。 其实vim 为全键盘操作的编辑器,所以在各个模式下都有很多功能键盘的。下面笔者列举一 下,其中笔者认为常用的会用红色标出,需要你多加练习,另外不常用的你也要知道的。 一般模式下移动光标 h或向左方向键 光标向左移动一个字符 j或者向下方向键 光标向下移动一个字符 K或者向上方向键 光标向上移动一个字符 l或者向右方向键 光标向右移动一个字符 Ctrl + f 或者pageUP 键 屏幕向前移动一页 Ctrl + b 或者 pageDOWN 键 屏幕向后移动一页 Ctrl + d 屏幕向前移动半页 Ctrl + u 屏幕向后移动半页 + 光标移动到非空格符的下一列 - 光标移动到非空格符的上一列 n空格(n是数字) 按下数字 n然后按空格,则光标向右移动 n个字符,如果该行 字符数小于 n,则光标继续从下行开始向右移动,一直到 n 0(数字 0)或者 Shift+6 移动到本行行首 Shift+4 即’$’移动到本行行尾 H 光标移动到当前屏幕的最顶行 M 光标移动到当前屏幕的中央那一行 L 光标移动到当前屏幕的最底行 G 光标移动到文本的最末行 nG(n是数字) 移动到该文本的第 n行 gg 移动带该文本的首行 n回车(n是数字) 光标向下移动 n行 一般模式下查找与替换 /word 向光标之后寻找一个字符串名为 word 的字符串,当找到第一 个word 后,按”n”继续搜后一个 ?word 想光标之前寻找一个字符串名为 word 的字符串,当找到第一 个word 后,按”n”继续搜前一个 :n1,n2s/word1/word2/g 在n1和n2行间查找 word1 这个字符串并替换为 word2,你也 可以把”/”换成”#” :1,$s/word1/word2/g 从第一行到最末行,查找 word1 并替换成 word2 :1,$s/word1/word2/gc 加上c的作用是,在替换前需要用户确认 一般模式下删除、复制粘贴 x,X x为向后删除一个字符,X为向前删除一个字符 nx(n为数字) 向后删除 n个字符 dd 删除光标所在的那一行 ndd(n为数字) 删除光标所在的向下 n行 d1G 删除光标所在行到第一行的所有数据 dG 删除光标所在行到末行的所有数据 yy 复制光标所在的那行 nyy 复制从光标所在行起向下 n行 p,P p复制的数据从光标下一行粘贴,P则从光标上一行粘贴 y1G 复制光标所在行到第一行的所有数据 yG 复制光标所在行到末行的所有数据 J 讲光标所在行与下一行的数据结合成同一行 u 还原过去的操作 进入编辑模式 i 在当前字符前插入字符 I 在当前行行首插入字符 a 在当前字符后插入字符 A 在当前行行末插入字符 o 在当前行下插入新的一行 O 在当前行上插入新的一行 r 替换光标所在的字符,只替换一次 R 一直替换光标所在的字符,一直到按下 ESC 命令模式 :w 将编辑过的文本保存 :w! 若文本属性为只读时,强制保存 :q 退出vim :q! 不管编辑或未编辑都不保存退出 :wq 保存,退出 :e! 将文档还原成最原始状态 ZZ 若文档没有改动,则不储存离开,若文档改动过,则储存后离 开,等同于:wq :w [filename] 编辑后的文档另存为 filename :r [filename] 在当前光标所在行的下面读入 filename 文档的内容 :set nu 在每行的行首显示行号 :set nonu 取消行号 n1,n2 w [filename] 将n1到n2的内容另存为 filename 这个文档 :! command 暂时离开 vim 运行某个 linux 命令,例如 :! ls /home 暂时列 出/home 目录下的文件,然后会提示按回车回到 vim 暂时就讲这么多了。如果你全部掌握,你就是 vim 高手啦。如果你觉得太多,只要记住笔者 标红部分即可,其他的用时再过来查就 ok啦。下面笔者给你留一个小作业,希望你要认真 完成! 1. 请把/etc/init.d/iptables 复制到/root/目录下,并重命名为 test.txt 2. 用vim 打开test.txt 并设置行号 3. 分别向下、向右、向左、向右移动 5个字符 4. 分别向下、向上翻两页 5. 把光标移动到第 49 行 6. 让光标移动到行末,再移动到行首 7. 移动到 test.txt 文件的最后一行 8. 移动到文件的首行 9. 搜索文件中出现的 iptables 并数一下一共出现多少个 10. 把从第一行到第三行出现的 iptables 替换成 iptable 11. 还原上一步操作 12. 把整个文件中所有的 iptables 替换成 iptable 13. 把光标移动到 50 行,删除字符”$” 14. 还原上一步操作 15. 删除第 50 行 16. 还原上一步操作 17. 删除从 37 行到42 行的所有内容 18. 还原上一步操作 19. 复制48 行并粘贴到 52 行下面 20. 还原上一步操作(按两次 u) 21. 复制从 37 行到42 行的内容并粘贴到 44 行上面 23. 还原上一步操作(按两次 u) 24. 把37 行到42 行的内容移动到 19 行下面 25. 还原上一步操作(按两次 u) 26. 光标移动到首行,把/bin/sh 改成 /bin/bash 27. 在第一行下面插入新的一行,并输入”# Hello!” 28. 保存文档并退出 第十章 文档的压缩与打包 在windows 下我们接触最多的压缩文件就是.rar 格式的了。但在 linux 下这样的格式是 不能识别的,它有自己所特有的压缩工具。但有一种文件在 windows 和linux 下都能使用那 就是.zip 格式的文件了。压缩的好处不用笔者介绍相信你也晓得吧,它不仅能节省磁盘空间 而且在传输的时候还能节省网络带宽呢。 在linux下最常见的压缩文件通常都是以.tar.gz 为结尾的,除此之外还有.tar, .gz, .bz2, .zip 等等。以前也介绍过 linux 系统中的后缀名其实要不要无所谓,但是对于压缩文件来讲必须 要带上。这是为了判断压缩文件是由哪种压缩工具所压缩,而后才能去正确的解压缩这个文 件。以下介绍常见的后缀名所对应的压缩工具。 .gz gzip 压缩工具压缩的文件 .bz2 bzip2 压缩工具压缩的文件 .tar tar 打包程序打包的文件(tar 并没有压缩功能,只是把一个目录合并成一个文件) .tar.gz 可以理解为先用 tar 打包,然后再 gzip 压缩 .tar.bz2 同上,先用 tar 打包,然后再 bzip2 压缩 【gzipgzipgzipgzip】 语法: gzip [-d#] filename 其中#为1-9 的数字 -d :解压缩时使用 -#:压缩等级,1压缩最差,9压缩最好,6为默认 压缩test.txt 后,则变成了 test.txt.gz 用-d解压缩 要注意的是,gzip 不可以压缩目录 【bzip2bzip2bzip2bzip2】 语法:bzip2 [-dz] filename -d :解压缩 -z :压缩 其实-z参数是可以省略掉的,你不妨试试 跟gzip 的解压类似,也是用-d解压。 【tartartartar】 语法:tar [-zjxcvfpP] filename -z :是否同时用 gzip 压缩 -j :是否同时用 bzip2 压缩 -x :解包或者解压缩 -t :查看 tar 包里面的文件 -c :建立一个 tar 包或者压缩文件包 -v :可视化 -f :后面跟文件名,压缩时跟-f文件名,意思是压缩后的文件名为 filename,解压时跟-f文 件名,意思是解压 filename。请注意,如果是多个参数组合的情况下带有-f,请把 f写到最 后面。 -p :使用原文件的属性,压缩前什么属性压缩后还什么属性。(不常用) -P:可以使用绝对路径。(不常用) --exclude filename :在打包或者压缩时,不要将 filename 文件包括在内。(不常用) 首先在 test 目录下建立 test111 目录,然后在 test111 目录下建立 test2.txt,并写入”nihao” 到test2.txt 中,接着是用 tar 把test111 打包成 test111.tar。请记住-f参数后跟的是打包后的 文件名。 删除原来的 test111 目录,然后解包 test111.tar,不管是打包还是解包,原来的文件是不会 删除的。 打包的同时使用 gzip 压缩 用-tf 跟包名来查看包或者压缩包内的文件都有哪些 先删除 test111,然后用 tar -zxvf 来解压.tar.gz 的压缩包。 -jcvf 打包的同时用 bzip2 压缩,-tf 同样可以查看.tar.bz2 的压缩包 -jxvf 解压缩.tar.bz2 的压缩包 --exclude 参数的作用就是打包的时候过滤掉某些文件,如果想过滤多个文件怎么办 只能是继续跟 --exclude filename 了。 第十一章 安装 RPM RPM RPM RPM 包或者安装源码包 在windows 下安装一个软件很轻松,只要双击.exe 的文件,安装提示连续“下一步”即 可,然而 linux 系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下。所 以你要学会如何在 linux 下安装一个软件。 在前面的内容中多次提到的 yum,这个 yum 是Redhat 所特有的安装 RPM 程序包的工 具,使用起来相当方便。因为使用 RPM 安装某一个程序包有可能会因为该程序包依赖另一 个程序包而无法安装。而使用 yum 工具就可以连同依赖的程序包一起安装。当然CentOS 同 样可以使用 yum 工具,而且在 CentOS 中你可以免费使用 yum,但Redhat 中只有当你付费 后才能使用 yum,默认是无法使用 yum 的。在介绍 yum 之前先说一说 RPM 相关的东西。 【RPM RPM RPM RPM 工具】 RPM 是”Redhat Package Manager”的缩写,根据名字也能猜到这是 Redhat 公司开发 出来的。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一 套管理程序。也就是说,你的linux 系统中存在着一个关于 RPM 的数据库,它记录了安装的 包以及包与包之间依赖相关性。RPM 包是预先在 linux 机器上编译好并打包好的文件,安装 起来非常快捷。但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当;包 与包之间存在着相互依赖的情况;卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统 所必须的,那就不能卸载这个包,否则会造成系统崩溃。 如果你的光驱中还有系统安装盘的话,你可以通过”mount /dev/cdrom /mnt”命令把光驱 挂载到/mnt 目录下,那么你会在/mnt/CentOS 目录下看到很多.rpm 的文件,这就是 RPM 包 了。 每一个 rpm 包的名称都由”-“和”.”分成了若干部分。就拿 a2ps-4.13b-57.2.el5.i386.rpm 这个 包来解释一下,a2ps 为包名;4.13b 则为版本信息;57.2.el5 为发布版本号;i386 为运行平 台。其中运行平台常见的有 i386, i586, i686, x86_64 ,需要你注意的是 cpu 目前是分 32 位和 64 位的,i386,i586 和i686 都为32 位平台,x86_64 则代表为 64 位的平台。另外有些 rpm 包 并没有写具体的平台而是 noarch,这代表这个 rpm 包没有硬件平台限制。例如 alacarte-0.10.0-1.fc6.noarch.rpm 。下面介绍一下 rpm 常用的命令。 1)安装一个 rpm 包 -i :安装的意思 -v :可视化 -h :显示安装进度 另外在安装一个 rpm 包时常用的附带参数有: --force 强制安装,即使覆盖属于其他包的文件也要安装 --nodeps 当要安装的 rpm 包依赖其他包时,即使其他包没有安装,也要安装这个包 2)升级一个 rpm 包 rpm -Uvh filename -U:即升级的意思 3)卸载一个 rpm 包 rpm -e filename 这里的 filename 是通过 rpm 的查询功能所查询到的,稍后会作介绍。 卸载时后边跟的 filename 和安装时的是有区别的。上面命令提到的 “|”在linux 系统中用的 非常多也非常有用,它是一个管道符,用来把前面运行的结果传递给后面的命令。以后会做 详细介绍,而后出现的 grep 命令则是用来过滤某个关键词的工具,在后续章节中会做详细 介绍。 4)查询一个包是否安装 rpm -q rpm 包名(这里的包名,是不带有平台信息以及后缀名的) 如果加上了平台信息以及后缀名反而不能查出来。你还可以查询当前系统中所安装的所有 rpm 包。 因为太多,所以笔者列出前十个。 5)得到一个 rpm 包的相关信息 rpm -qi 包名 (同样不需要加平台信息与后缀名) 6)列出一个 rpm 包安装的文件 rpm -ql 包名 通过上面的命令可以看出 vim 是通过安装 vim-enhanced-7.0.109-6.el5 这个rpm 包得来的。 那么反过来如何通过一个文件去查找是由安装哪个 rpm 包得来的? 7)列出某一个文件属于哪个 rpm 包 rpm -qf 文件的绝对路径 前面讲过如何查找一个文件(可执行命令)的绝对路径 所以你也可以把这两条命令连起来写 看到了吗,which vim 这条命令是由两个反引号引起来的,这代表引用反引号里面的命令所 产生的结果。关于 rpm 工具的使用还有很多内容,笔者就不一一列举了,只要你掌握上面 这些内容,完全够你平时工作用的了。 【yum yum yum yum 工具】 介绍完 rpm 工具后,还需要你掌握最常用的 yum 工具,这个工具比 rpm 工具好用多了, 当然前提是你使用的 linux 系统是支持 yum 的。yum 最大的优势在于可以联网去下载所需要 的rpm 包,然后自动安装,在这个工程中如果要安装的 rpm 包有依赖关系,yum 会帮你解 决掉这些依赖关系依次安装所有 rpm 包。下面笔者介绍常用的 yum 命令。 1) 列出所有可用的 rpm 包 “yum list “ 限于篇幅,笔者只列举出来前 7个包信息。从上例中可以看到有”mirrors.163.com”信息出现, 这是在告诉用户,它是从 mirrors.163.com 这里下载到的 rpm 包资源。如果你使用的是 CentOS 则你可以从/etc/yum.repos.d/CentOS-Base.repo 这个文件下看到相关的配置信息。从上面的 例子中你还可以看到最左侧是 rpm 包名字,中间是版本信息,最右侧是安装信息,如果安 装了就显示 installed,未安装则显示 base 或者extras,如果是该 rpm 包已安装但需要升级则 显示updates。 2)搜索一个 rpm 包 “yum search [相关关键词]” 除了这样搜索外,笔者常用的是利用 grep 来过滤 相信你也会喜欢用后者吧,这样看起来简明的多。 3)安装一个 rpm 包 “yum install [-y] [rpm 包名]” 如果不加-y选项,则会以与用户交互的方式安装,首先是列出需要安装的 rpm 包信息,然 后会问用户是否需要安装,输入y则安装,输入n则不安装。而笔者嫌这样太麻烦,所以直 接加上-y选项,这样就省略掉了问用户是否安装的那一步。 4)卸载一个 rpm 包 “yum remove [-y] [rpm 包名]” 卸载和安装一样,你也可以直接加上-y选项来省略掉和用户交互的步骤。在这里笔者要提醒 你一下,卸载某个 rpm 包一定要看清楚了,不要连其他重要的 rpm 包一起卸载了,以免影 响正常的业务。 4)升级一个 rpm 包 “yum update [-y] [rpm 包]” 以上介绍了如何使用 yum 搜索、安装、卸载以及升级一个 rpm 包,如果你掌握了这些那么 你就已经可以解决日常工作中遇到的与 rpm 包相关问题了。当然 yum 工具还有好多其他好 用的命令,笔者不在列举出来,如果你感兴趣就去 man 一下吧。除此之外,笔者还会教你 一些关于 yum 的小应用。 1111 使用本地的光盘来制作一个 yum yum yum yum 源 有时候你的 linux 系统不能联网,当然就不能很便捷的使用联网的 yum 源了,这时候就需要 你自己会利用 linux 系统光盘制作一个 yum 源。具体步骤如下: a.挂载光盘 [root@fortest Server]# mount -t iso9660 -o loop /dev/cdrom /mnt b.删除/etc/yum.repos.d 目录所有的 repo 文件 [root@fortest Server]# rm -rf /etc/yum.repos.d/* c.创建新文件 dvd.repo [root@fortest Server]# vim /etc/yum.repos.d/dvd.repo 加入以下内容: [dvd] name=install dvd baseurl=file:///mnt enabled=1 gpgcheck=0 d.刷新repos,生成缓存 [root@fortest Server]#yum makecache 然后就可以使用 yum 命令安装你所需要的软件包了 2222 利用yum yum yum yum 工具下载一个 rpm rpm rpm rpm 包 有时,我们需要下载一个 rpm 包,只是下载下来,拷贝给其他机器使用,前面也介绍过 yum 安装rpm 包的时候,首先得下载这个 rpm 包然后再去安装,所以使用 yum 完全可以做到只 下载而不安装。 a. 首选要安装 yum-downloadonly # yum install -y yum-downloadonly.noarch b. 下载一个 rpm 包而不安装 # yum install test.rpm -y --downloadonly //这样虽然下载了,但是并没有保存到我们想要的 目录下,那么如何指定目录呢? c. 下载到指定目录 # yum install test.rpm -y --downloadonly --downloaddir=/usr/local/src 【安装源码包】 其实,在 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 的包上一章讲过的。 3. 配置相关的选项,并生成 Makefile 使用./config --help 可以查看可用的选项。一般常用的有”--prefix=PREFIX “ 这个选项的意思 是定义软件包安装到哪里。到这里,笔者再提一个小小的约定,通常源码包都是安装在 /usr/local/目录下的。比如,我们把 apache 安装在/usr/local/apache2 下,那么这里就应该这 样写”--prefix=/usr/local/apache2”。其他还有好多选项,如果你有耐心你可以挨个去看一看 都有什么作用。 笔者在这里只定义了 apache 的安装目录,其他都是默认。回车后,开始执行 check 操作。 等check 结束后生成了 Makefile 文件 除了查看有没有生成 Makefile 文件来判定有没有完成./config 的操作外,还可以通过这个命 令”echo $?”来判定,如果是 0,则表示上一步操作成功完成,否则就是没有成功。 4. 进行编译 这一步操作,就是把源代码编译成二进制的可执行文件,这一步也是最漫长的一步,编译时 间的长短取决于源代码的多少和机器配置。 5. 安装 在安装前,先确认上一步操作是否成功完成。 make install 会创建相应的目录以及文件。当完成安装后,会在/usr/local 目录下多了一个 apache2 目录,这就是 apache 所安装的目录了。 其实在日常的源码安装工作中,并不是每个都像笔者这样顺利完成安装的,遇到错误不 能完成安装的情况是很多的。通常都是因为缺少某一个库文件导致的。这就需要你仔细琢磨 报错信息或者查看当前目录下的 config.log 去得到相关的信息。另外,如果自己不能解决那 就去网上 google 一下吧,通常你会得到你想要的答案。 第十二章 学习 shell shell shell shell 脚本之前的基础知识 日常的 linux 系统管理工作中必不可少的就是 shell 脚本,如果不会写 shell 脚本,那么 你就不算一个合格的管理员。目前很多单位在招聘 linux 系统管理员时,shell 脚本的编写是 必考的项目。有的单位甚至用 shell 脚本的编写能力来衡量这个 linux 系统管理员的经验是否 丰富。笔者讲这些的目的只有一个,那就是让你认真对待 shell 脚本,从一开始就要把基础 知识掌握牢固,然后要不断的练习,只要你 shell 脚本写的好,相信你的 linux 求职路就会轻 松的多。笔者在这一章中并不会多么详细的介绍 shell 脚本,而只是带你进入 shell 脚本的世 界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。 在学习 shell 脚本之前,需要你了解很多关于 shell 的知识,这些知识是编写 shell 脚本 的基础,所以希望你能够熟练的掌握。 【什么是 shellshellshellshell】 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。 实际上,在 shell 和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计 算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于 shell,把它比作人的五官似 乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是 shell,用户把指令 告诉shell,然后 shell 再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。 笔者接触的 linux 发布版本(Redhat/CentOS)系统默认安装的 shell 叫做bash,即Bourne Again Shell,它是 sh(Bourne 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)。 【变量】 前面章节中笔者曾经介绍过环境变量 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 回到原来的 shell,myname 变量还在。那要想设置的变量一直生效怎么办?有两种 情况: 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 则不再输出任何内容。 【系统环境变量与个人环境变量的配置文件】 上面讲了很多系统的变量,那么在 linux 系统中,这些变量被存到了哪里呢,为什么用 户一登陆 shell 就自动有了这些变量呢? /etc/profile/etc/profile/etc/profile/etc/profile :这个文件预设了几个重要的变量,例如 PATH,USER,LOGNAME,MAIL, INPUTRC,HOSTNAME,HISTSIZE, umas 等等。 /etc/bashrc/etc/bashrc/etc/bashrc/etc/bashrc :这个文件主要预设 umask 以及PS1。这个 PS1 就是我们在敲命令时,前 面那串字符了,例如笔者的 linux 系统PS1 就是 [root@localhost ~]# ,你不妨看一下 PS1 的值。 \u就是用户,\h 主机名,\W 则是当前目录,\$就是那个’#’了,如果是普通用户则显示为’$’ 除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件: .bash_profile.bash_profile.bash_profile.bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件 输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次。 .bashrc.bashrc.bashrc.bashrc :该文件包含专用于你的 shell 的bash 信息,当登录时以及每次打开新的 shell 时,该 该文件被读取。例如你可以将用户自定义的 alias 或者自定义变量写到这个文件中。 .bash_history.bash_history.bash_history.bash_history :记录命令历史用的。 .bash_logout.bash_logout.bash_logout.bash_logout :当退出 shell 时,会执行该文件。可以把一些清理的工作放到这个文件中。 【linuxlinuxlinuxlinux shell shell shell shell 中的特殊符号】 你在学习 linux 的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符 号,代表零个或多个字符或数字。下面笔者就说一说常用到的特殊字符。 1.1.1.1. ****:代表零个或多个字符或数字。 test 后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来。 2.2.2.2. ????:只代表一个任意的字符 不管是数字还是字母,只要是一个都能匹配出来。 3.3.3.3. ####:这个符号在 linux 中表示注释说明的意思,即”#”后面的内容 linux 忽略掉。 在命令的开头或者中间插入”#”,linux 都会忽略掉的。这个符号在 shell 脚本中用的很多。 4.4.4.4. \\\\:脱意字符,将后面的特殊符号(例如”*”)还原为普通字符。 5.5.5.5. |||| :管道符,前面多次说过,它的作用在于将符号前面命令的结果丢给符号后面的命 令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常 用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk 等等,其中grep, sed, awk 为正则表达式必须掌握的工具,在后续内容中详细介绍。 6. $ :除了用于变量前面的标识符外,还有一个妙用,就是和’!’结合起来使用。 ‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上条命令中最后出现的 那个东西)例如上边命令最后是 test.txt 那么在当前命令下输入!$则代表 test.txt。 1111)grepgrepgrepgrep :过滤一个或多个字符,将会在后续内容中详细介绍其用法。 2)2)2)2) cutcutcutcut :截取某一个字段 语法:cut -d “分隔字符”[-cf] n 这里的 n是数字 -d :后面跟分隔字符,分隔字符要用双引号括起来 -c :后面接的是第几个字符 -f :后面接的是第几个区块 -d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f和1之间的空格 可有可无。 -c 后面可以是 1个数字 n,也可以是一个区间 n1-n2,还可以是多个数字 n1,n2,n3 3)3)3)3) sortsortsortsort :用做排序 语法:sort [-t 分隔符][-kn1,n2] [-nru] 这里的 n1 < n2 -t 分隔符 :作用跟 cut 的-d一个意思 -n :使用纯数字排序 -r :反向排序 -u :去重复 -kn1,n2 :由n1区间排序到 n2区间,可以只写-kn1,即对 n1字段排序 4)4)4)4) wcwcwcwc :统计文档的行数、字符数、词数,常用的选项为: -l :统计行数 -m :统计字符数 -w :统计词数 5555) uniquniquniquniq :去重复的行,笔者常用的选项只有一个: -c :统计重复的行数,并把行数写在前面 有一点需要注意,在进行 uniq 之前,需要先用 sort 排序然后才能 uniq,否则你将得不到你 想要的,笔者上面的试验当中已经是排序过所以省略掉那步了。 6666)teeteeteetee :后跟文件名,类似与重定向”>”,但是比重定向多了一个功能,在把文件写入后面 所跟的文件中的同时,还显示在屏幕上。 7777)trtrtrtr :替换字符,常用来处理文档中出现的特殊符号,如 DOS文档中出现的^M 符号。常 用的选项有两个: -d :删除某个字符,-d 后面跟要删除的字符 -s :把重复的字符去掉 最常用的就是把小写变大写: tr ‘[a-z]’‘[A-Z]’ 当然替换一个字符也是完全可以的。 不过替换、删除以及去重复都是针对一个字符来讲的,有一定局限性。如果是针对一个字符 串就不再管用了,所以笔者建议只是简单了解这个 tr 即可,以后你还会学到更多可以实现 针对字符串操作的工具。 8888)splitsplitsplitsplit :切割文档,常用选项: -b :依据大小来分割文档,单位为 byte 格式如上例,后面的 passwd 为分割后文件名的前缀,分割后的文件名为 passwdaa, passwdab, passwdac … -l :依据行数来分割文档 6.6.6.6. ;:分号。平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中 运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”了。 7.7.7.7. ~~~~ :用户的家目录,如果是 root 则是 /root ,普通用户则是 /home/username 8.8.8.8. &&&&:如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时 间非常长的情况。 使用jobs 可以查看当前 shell 中后台执行的任务。用 fg 可以调到前台执行。这里的 sleep 命 令就是休眠的意思,后面跟数字,单位为秒,常用语循环的 shell 脚本中。 此时你按一下 CTRL +z 使之暂停,然后再输入 bg可以再次进入后台执行。 如果是多任务情况下,想要把任务调到前台执行的话,fg 后面跟任务号,任务号可以使用 jobs 命令得到。 9. >,>,>,>, >>,>>,>>,>>, 2>,2>,2>,2>, 2>>2>>2>>2>> :前面讲过重定向符号> 以及>> 分别表示取代和追加的意思,然后还有两 个符号就是这里的 2> 和 2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命 令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用 2>或者2>>。 10.10.10.10. [[[[]]]]:中括号,中间为字符组合,代表中间字符中的任意一个 11.11.11.11. &&&&&&&& 与 |||||||| 在上面刚刚提到了分号,用于多条命令间的分隔符。另外还有两个可以用于多条命令中间的 特殊符号,那就是 “&&”和”||”。下面笔者把这几种情况全列出: 1) command1 ; command2 2) command1 && command2 3) command1 || command2 使用”;”时,不管command1是否执行成功都会执行command2;使用”&&”时,只有command1 执行成功后,command2 才会执行,否则 command2 不执行;使用”||”时,command1 执行 成功后 command2 不执行,否则去执行 command2,总之 command1 和command2 总有一 条命令会执行。 第十三章 正则表达式 这部分内容可以说是学习 shell 脚本之前必学的内容。如果你这部分内容学的越好,那 么你的 shell 脚本编写能力就会越强。所以不要嫌这部分内容啰嗦,也不要怕麻烦,要用心 学习。一定要多加练习,练习多了就能熟练掌握了。 在计算机科学中,正则表达式是这样解释的:它是指一个用来描述或者匹配一系列符合 某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被 用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达 式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论 是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。 其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思 想那么这个工具就可以处理正则表达式的字符串。常用的工具有 grep, sed, awk 等,下面笔 者就介绍一下这三种工具的使用方法。 【grepgrepgrepgrep //// egrepegrepegrepegrep】 笔者在前面的内容中多次提到并用到 grep 命令,可见它的重要性。所以好好学习一下 这个重要的命令吧。你要知道的是 grep 连同下面讲的 sed, awk 都是针对文本的行才操作的。 语法: grep [-cinvABC] ‘word’ filename -c :打印符合要求的行数 -i :忽略大小写 -n :在输出符合要求的行的同时连同行号一起输出 -v :打印不符合要求的行 -A:后跟一个数字(有无空格都可以),例如 –A2 则表示打印符合要求的行以及下面两行 -B:后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行 -C:后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行 以下,笔者举几个小例子帮助你好好掌握这个 grep 工具的用法。 a.a.a.a. 过滤出带有某个关键词的行并输出行号 b.b.b.b. 过滤不带有某个关键词的行,并输出行号 c.c.c.c. 过滤出所有包含数字的行 在前面也提到过这个”[]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以 用这样的形式[15]即只含有 1或者5,注意,它不会认为是 15。如果要过滤出数字以及大小 写字母则要这样写[0-9a-zA-Z]。另外[]还有一种形式,就是[^字符] 表示除[]内的字符之外的 字符。 这就表示筛选包含 oo字符串,但是不包含 r字符。 d.d.d.d. 过滤出文档中以某个字符开头或者以某个字符结尾的行 在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛 选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果。现在想一下,如何 打印出不以英文字母开头的行呢? e.e.e.e. 过滤任意一个字符与重复字符 “.”表示任意一个字符,上例中,就是把符合 r与o之间有两个任意字符的行过滤出来。 “*”表示零个或多个前面的字符。 ‘ooo*’ 表示oo, ooo, oooo … 或者更多的’o’。现在你是否想到了’.*’ 这个组合表示什么意义? ‘.*’表示零个或多个任意字符,空行也包含在内。 f.f.f.f. 指定要过滤字符出现的次数 这里用到了{},其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个 o 即’oo’的行。注意,{}左右都需要加上脱意字符’\’。另外,使用{}我们还可以表示一个范围 的,具体格式是 ‘\{n1,n2\}’其中n1’, ‘>=’,‘<’,‘<=’,‘!=’ 等等,值得注意的是,即使$3 为数字,awk 也不会把它当数字看待,它会 认为是一个字符。所以不要妄图去拿$3 当数字去和数字做比较。 这样是得不到我们想要的效果的。这里只是字符与字符之间的比较,’6’是>’500’的。 上例中用的是’!=’ 即不匹配。 另外还可以使用”&&” 和 “||”表示“并且”和“或者”的意思。 也可以是或者的关系 d.d.d.d. awk awk awk awk 的内置变量 常用的变量有: NF:用分隔符分隔后一共有多少段; NR:行数 上例中,打印总共的段数以及最后一段的值。 可以使用 NR 作为条件,来打印出指定的行。 e.e.e.e. awk awk awk awk 中的数学运算 awk 比较强的地方,还在于能把某个段改成指定的字符串,下面还有更强的呢! 当然还可以计算某个段的总和。 这里的 END 要注意一下,表示所有的行都已经执行,这是 awk 特有的语法,其实 awk 连同 sed 都可以写成一个脚本文件,而且有他们特有的语法,在 awk 中使用 if判断、for 循环都 是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已。 注意这里’()’的使用。 基本上,正则表达的内容就这些了。但是笔者要提醒你一下,笔者介绍的这些仅仅是最 基本的东西,并没有提啊深入的去讲 sed 和awk,但是完全可以满足日常工作的需要,有时 候也许你会碰到比较复杂的需求,如果真遇到了就去请教一下 google 吧。下面出几道关于 awk 的练习题,希望你要认真完成。 1. 用awk 打印整个 test.txt (以下操作都是用 awk 工具实现,针对 test.txt); 2. 查找所有包含’bash’的行; 3. 用’:’作为分隔符,查找第三段等于 0的行; 4. 用’:’作为分隔符,查找第一段为’root’的行,并把该段的’root’换成’toor’(可以连同 sed 一起 使用); 5. 用’:’作为分隔符,打印最后一段; 6. 打印行数大于 20 的所有行; 7. 用’:’作为分隔符,打印所有第三段小于第四段的行; 8. 用’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接 (例如,第一行应该是 这样的形式 “root@/bin/bash”; 9. 用’:’作为分隔符,把整个文档的第四段相加,求和; 下面给出答案: 1. awk '{print $0}' test.txt 2. awk '/bash/' test.txt 3. awk -F':''$3=="0"' test.txt 4. awk -F':''$1=="root"' test.txt |sed 's/root/toor/' 5. awk -F':''{print $NF}' test.txt 6. awk -F':''NR>20' test.txt 7. awk -F':''$3<$4' test.txt 8. awk -F':''{print $1"@"$NF}' test.txt 9. awk -F':''{(sum+=$4)}; END{print sum}' test.txt 第十四章 SHELLSHELLSHELLSHELL 脚本 终于到 shell 脚本这章了,在以前笔者卖了好多关子说 shell 脚本怎么怎么重要,确实 shell 脚本在 linux 系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入 shell 脚本的世界吧。 到现在为止,你明白什么是 shell 脚本吗?如果明白最好了,不明白也没有关系,相信 随着学习的深入你就会越来越了解到底什么是 shell 脚本。首先它是一个脚本,并不能作为 正式的编程语言。因为是跑在 linux 的shell 中,所以叫 shell 脚本。说白了,shell 脚本就是 一些命令的集合。举个例子,我想实现这样的操作:1)进入到/tmp/目录;2)列出当前目 录中所有的文件名;3)把所有当前的文件拷贝到/root/目录下;4)删除当前目录下所有的 文件。简单的 4步在shell 窗口中需要你敲 4次命令,按 4次回车。这样是不是很麻烦?当 然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次 敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令, 这样一步操作就可以完成。其实这个文档呢就是 shell 脚本了,只是这个 shell 脚本有它特殊 的格式。 Shell 脚本能帮助我们很方便的去管理服务器,因为我们可以指定一个任务计划定时去 执行某一个 shell 脚本实现我们想要需求。这对于 linux 系统管理员来说是一件非常值得自豪 的事情。现在的 139 邮箱很好用,发邮件的同时还可以发一条邮件通知的短信给用户,利用 这点,我们就可以在我们的 linux 服务器上部署监控的 shell 脚本,比如网卡流量有异常了或 者服务器 web 服务器停止了就可以发一封邮件给管理员,同时发送给管理员一个报警短信 这样可以让我们及时的知道服务器出问题了。 有一个问题需要约定一下,凡是自定义的脚本建议放到/usr/local/sbin/目录下,这样做 的目的是,一来可以更好的管理文档;二来以后接管你的管理员都知道自定义脚本放在哪里, 方便维护。 【shell shell shell shell 脚本的基本结构以及如何执行】 Shell 脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh 这个脚本就不能执行,只是大 家的一个习惯而已。所以,以后你发现了.sh 为后缀的文件那么它一定会是一个 shell 脚本了。 test.sh 中第一行一定是 “#!/bin/bash” 它代表的意思是,该文件使用的是 bash 语法。如果 不设置该行,那么你的 shell 脚本就不能被执行。’#’表示注释,在前面讲过的。后面跟一些 该脚本的相关注释内容以及作者和创建日期或者版本等等。当然这些注释并非必须的,如果 你懒的很,可以省略掉,但是笔者不建议省略。因为随着你工作时间的增加,你写的 shell 脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本是用来 干什么的以及什么时候写的。所以写上注释是有必要的。另外系统管理员并非你一个,如果 是其他管理员查看你的脚本,他看不懂岂不是很郁闷。该脚本再往下面则为要运行的命令了。 Shell 脚本的执行很简单,直接”sh filename “ 即可,另外你还可以这样执行 默认我们用 vim 编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直 接使用’./filename’ 执行这个脚本了。另外使用 sh 命令去执行一个 shell 脚本的时候是可以加 -x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题。 该shell 脚本中用到了’date’这个命令,它的作用就是用来打印当前系统的时间。其实在 shell 脚本中 date 使用率非常高。有几个选项笔者常常在 shell 脚本中用到: %Y 表示年,%m 表示月,%d 表示日期,%H 表示小时,%M 表示分钟,%S 表示秒 注意%y 和%Y 的区别。 -d 选项也是经常要用到的,它可以打印 n天前或者 n天后的日期,当然也可以打印 n个月/ 年前或者后的日期。 另外星期几也是常用的 【shell shell shell shell 脚本中的变量】 在shell 脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的 作用当然不是为了专业。如果你写了一个长达 1000 行的shell 脚本,并且脚本中出现了某一 个命令或者路径几百次。突然你觉得路径不对想换一下,那岂不是要更改几百次?你固然可 以使用批量替换的命令,但是也是很麻烦,并且脚本显得臃肿了很多。变量的作用就是用来 解决这个问题的。 在test2.sh 中使用到了反引号,你是否还记得它的作用?’d’和’d1’在脚本中作为变量出现, 定义变量的格式为 “变量名=变量的值”。当在脚本中引用变量时需要加上’$’符号,这跟前面 讲的在 shell 中自定义变量是一致的。下面看看脚本执行结果吧。 下面我们用 shell 计算两个数的和。 数学计算要用’[]’括起来并且外头要带一个’$’。脚本结果为: Shell 脚本还可以和用户交互。 这就用到了 read 命令了,它可以从标准输入获得变量的值,后跟变量名。”read x”表示x 变量的值需要用户通过键盘输入得到。脚本执行过程如下: 我们不妨加上-x选项再来看看这个执行过程: 在test4.sh 中还有更加简洁的方式。 read -p 选项类似 echo 的作用。执行如下: 你有没有用过这样的命令”/etc/init.d/iptables restart “ 前面的/etc/init.d/iptables 文件其 实就是一个 shell 脚本,为什么后面可以跟一个”restart”? 这里就涉及到了 shell 脚本的预设 变量。实际上,shell 脚本在执行的时候后边是可以跟变量的,而且还可以跟多个。不妨笔 者写一个脚本,你就会明白了。 执行过程如下: 在脚本中,你会不会奇怪,哪里来的$1 和$2,这其实就是 shell 脚本的预设变量,其中$1 的 值就是在执行的时候输入的 1,而$2 的值就是执行的时候输入的$2,当然一个 shell 脚本的 预设变量是没有限制的,这回你明白了吧。另外还有一个$0,不过它代表的是脚本本身的名 字。不妨把脚本修改一下。 执行结果想必你也猜到了吧。 【shell shell shell shell 脚本中的逻辑判断】 如果你学过 C或者其他语言,相信你不会对 if 陌生,在shell 脚本中我们同样可以使用 if逻辑判断。在 shell 中if判断的基本语法为: 1111)不带 elseelseelseelse if 判断语句; then command fi 在if1.sh 中出现了 ((a<60))这样的形式,这是shell 脚本中特有的格式,用一个小括号或者不 用都会报错,请记住这个格式,即可。执行结果为: 2222)带有 elseelseelseelse if 判断语句 ; then command else command fi 执行结果为: 3333)带有 elifelifelifelif if 判断语句一 ; then command elif 判断语句二; then command else command fi 这里的 && 表示“并且”的意思,当然你也可以使用 || 表示“或者”,执行结果: 以上只是简单的介绍了 if语句的结构。在判断数值大小除了可以用”(())”的形式外,还可以 使用”[]”。但是就不能使用>, < , = 这样的符号了,要使用 -lt (小于),-gt (大于),-le (小 于等于),-ge (大于等于),-eq (等于),-ne (不等于)。 再看看 if中使用 && 和 ||的情况。 shell 脚本中 if还经常判断关于档案属性,比如判断是普通文件还是目录,判断文件是否有 读写执行权限等。常用的也就几个选项: -e :判断文件或目录是否存在 -d :判断是不是目录,并是否存在 -f :判断是否是普通文件,并存在 -r :判断文档是否有读权限 -w :判断是否有写权限 -x :判断是否可执行 使用if判断时,具体格式为: if [-e filename ]; then 在shell 脚本中,除了用 if来判断逻辑外,还有一种常用的方式,那就是 case 了。具体 格式为: case 变量 in value1) command ;; value2) command ;; value3) command ;; *) command ;; esac 上面的结构中,不限制 value 的个数,*则代表除了上面的 value 外的其他值。下面笔者写一 个判断输入数值是奇数或者偶数的脚本。 $a 的值或为 1或为0,执行结果为: 也可以看一下执行过程: case 脚本常用于编写系统服务的启动脚本,例如/etc/init.d/iptables 中就用到了,你不妨去查 看一下。 【shell shell shell shell 脚本中的循环】 Shell 脚本中也算是一门简易的编程语言了,当然循环是不能缺少的。常用到的循环有 for 循环和 while 循环。下面就分别介绍一下两种循环的结构。 脚本中的 seq 1 5 表示从 1到5的一个序列。你可以直接运行这个命令试下。脚本执行结果 为: 通过这个脚本就可以看到 for 循环的基本结构 : for 变量名 in 循环的条件; do command done 循环的条件那一部分也可以写成这样的形式,中间用空格隔开即可。你也可以试试,for i in `ls`; do echo $i; done 和 for i in `cat test.txt`; do echo $i; done 再来看看这个 while 循环,基本格式为: while 条件; do command done 脚本的执行结果为: 另外你可以把循环条件忽略掉,笔者常常这样写监控脚本。 while :; do command done 【shell shell shell shell 脚本中的函数】 如果你学过开发,肯定知道函数的作用。如果你是刚刚接触到这个概念的话,也没有关 系,其实很好理解的。函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个 名字,当用到这段代码时直接调用这个小单元的名字即可。有时候脚本中的某段代总是重复 使用,如果写成函数,每次用到时直接用函数名代替即可,这样就节省了时间还节省了空间。 fun.sh 中的sum() 为自定义的函数,在 shell 脚本中要用 function 函数名(){ command } 这样的格式去定义函数。 上个脚本执行过程如下: 有一点笔者要提醒你一下,在 shell 脚本中,函数一定要写在最前面,不能出现在中间或者 最后,因为函数是要被调用的,如果还没有出现就被调用,肯定是会出错的。 Shell 脚本大体上就介绍这么多了,笔者所举的例子都是最基础的,所以即使你把所有 例子完全掌握也不代表你的 shell 脚本编写能力有多么好。所以剩下的日子里你尽量要多练 习,多写脚本,你写的脚本越多,你的能力就越强。希望你能够找专门介绍 shell 脚本的书 籍深入的去研究一下它。随后笔者将给你留几个 shell 脚本的练习题,你最好不要偷懒。 1. 编写shell 脚本,计算 1-100 的和; 2. 编写shell 脚本,要求输入一个数字,然后计算出从 1到输入数字的和,要求,如果输入 的数字小于 1,则重新输入,直到输入正确的数字为止; 3. 编写shell 脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下; 4. 编写shell 脚本,批量建立用户 user_00, user_01, …,user_100 并且所有用户同属于 users 组; 5. 编写shell 脚本,截取文件 test.log 中包含关键词’abc’的行中的第一列(假设分隔符为”:”), 然后把截取的数字排序(假设第一列为数字),然后打印出重复次数超过 10 次的列; 6. 编写shell 脚本,判断输入的 IP是否正确(IP的规则是,n1.n2.n3.n4,其中 1/tmp/n.txt sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt awk '$1>10 {print $2}' /tmp/n2.txt 6. #!/bin/bash checkip() { if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then a=`echo $1 | awk -F.'{print $1}'` b=`echo $1 | awk -F.'{print $2}'` c=`echo $1 | awk -F.'{print $3}'` d=`echo $1 | awk -F.'{print $4}'` for n in $a $b $c $d; do if [ $n -ge 255 ] || [ $n -le 0 ]; then echo "the number of the IP should less than 255 and greate than 0" return 2 fi done else echo "The IP you input is something wrong, the format is like 192.168.100.1" return 1 fi } rs=1 while [ $rs -gt 0 ]; do read -p "Please input the ip:" ip checkip $ip rs=`echo $?` done echo "The IP is right!" 第十五章 linux linux linux linux 系统日常管理 笔者在前面介绍的内容都为 linux 系统基础类的,如果你现在把前面的内容全部很好的 掌握了,那最好了。不过笔者要说的是,即使你完全掌握了,你现在还是不能作为一名合格 的linux 系统管理员的,毕竟系统管理员要会做的事情太多了。本章以及后面章节笔者会陆 续教给你作为 linux 系统管理员所必备的知识。只要你熟练掌握那绝对可以胜任一个最初级 的管理员职位,不过只是初级的,因为你还需要在日常的管理工作中获得成长。 【监控系统的状态】 1.1.1.1. wwww 查看当前系统的负载 相信所有的 linux 管理员最常用的命令就是这个’w’ 了,该命令显示的信息还是蛮丰富的。 第一行从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载。第二 行开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪 里登录的等等。其实,在这些信息当中,笔者认为我们最应该关注的应该是第一行中的’load average:’后面的三个数值。 第一个数值表示 1分钟内系统的平均负载值;第二个数值表示 5分钟内系统的平均负载 值;第三个数值表示 15 分钟系统的平均负载值。这个值的意义是,单位时间段内CPU 活动 进程数。当然这个值越大就说明你的服务器压力越大。一般情况下这个值只要不超过你服务 器的cpu 数量就没有关系,如果你的服务器 cpu 数量为 8,那么这个值若小于 8,就说明你 的服务器没有压力,否则就要关注一下了。到这里你肯定会问,如何查看服务器有几个 cpu? 就是用这个命令了。’/proc/cpuinfo’这个文件记录了 cpu 的详细信息。目前市面上的服务器 通常都是 2颗4核cpu,在linux 看来,它就是 8个cpu。查看这个文件时则会显示 8段类似 的信息,而最后一段信息中 processor : 后面跟的是’7’。所以查看当前系统有几个 cpu,你 可以使用这个命令:’ grep -c 'processor' /proc/cpuinfo’。 2.2.2.2. vmstatvmstatvmstatvmstat 监控系统的状态 上面讲的 w查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力, 但是具体是哪里(CPU, 内存,磁盘等)有压力就无法判断了。通过vmstat 就可以知道具体 是哪里有压力。vmstat 命令打印的结果共分为 6部分:procs, memory, swap, io, system, cpu. 请重点关注一下红色标出的项。 1)procs 显示进程相关信息 r :表示运行和等待 cpu 时间片的进程数,如果长期大于服务器 cpu 的个数,则说明 cpu 不 够用了; b :表示等待资源的进程数,比如等待 I/O, 内存等,这列的值如果长时间大于 1,则需要 你关注一下了; 2)memory 内存相关信息 swpd :表示切换到交换分区中的内存数量 ; free :当前空闲的内存数量; buff :缓冲大小,(即将写入磁盘的); cache :缓存大小,(从磁盘中读取的); 3)swap 内存交换情况 si :由内存进入交换区的数量; so :由交换区进入内存的数量; 4)io 磁盘使用情况 bi :从块设备读取数据的量(读磁盘); bo: 从块设备写入数据的量(写磁盘); 5)system 显示采集间隔内发生的中断次数 in :表示在某一时间间隔中观测到的每秒设备中断数; cs :表示每秒产生的上下文切换次数; 6)CPU 显示cpu 的使用状态 us :显示了用户下所花费 cpu 时间的百分比; sy :显示系统花费 cpu 时间百分比; id :表示 cpu 处于空闲状态的时间百分比; wa :表示 I/O 等待所占用 cpu 时间百分比; st :表示被偷走的 cpu 所占百分比(一般都为 0,不用关注); 以上所介绍的各个参数中,笔者经常会关注 r列,b列,和 wa 列,三列代表的含义在 上边说得已经很清楚。IO部分的 bi以及bo也是我要经常参考的对象。如果磁盘 io压力很 大时,这两列的数值会比较高。另外当 si, so 两列的数值比较高,并且在不断变化时,说明 内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。 笔者用 vmstat 时,经常用这样的形式,’vmstat 1 5’ 表示每隔 1秒钟打印一次系统状态, 连续打印 5次。当然你也可以 ‘vmstat 1 ‘ 表示每隔 1秒钟打印一次系统状态,一直打印, 除非你按 ctrl + c强制结束。 3.3.3.3. toptoptoptop 显示进程所占系统资源 这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统 资源(CPU,内存,磁盘IO等)最高的进程放到最前面。top 命令打印出了很多信息,包括 系统负载(load average)、进程数(Tasks)、cpu 使用情况、内存使用情况以及交换分区使用 情况。其实上面这些内容可以通过其他命令来查看,所以用 top 重点查看的还是下面的进程 使用系统资源详细状况。这部分东西反映的东西还是比较多的,不过需要你关注的也就是几 项:%CPU,%MEM,COMMAND 这些项目所代表的意义,不用笔者介绍相信你也能看懂吧。 另外笔者使用 top 命令时还常常使用-bn1 这个组合选项,它表示非动态打印系统资源使用 情况,可以用在脚本中,你不妨记一下,以后也许你会用得到。 4.4.4.4. sarsarsarsar 监控系统状态 sar 命令很强大,它可以监控系统所有资源状态,比如平均负载、网卡流量、磁盘状态、内 存使用等等。它不同于其他系统状态监控工具的地方在于,它可以打印历史信息,可以显示 当天从零点开始到当前时刻的系统状态信息。如果你系统没有安装这个命令,请使用”yum install -y sysstat”命令安装。初次使用 sar 命令会报错,那是因为 sar 工具还没有生成相应 的数据库文件(时时监控就不会了,因为不用去查询那个库文件)。它的数据库文件在” /var/log/sa/”目录下,默认保存 9天。因为这个命令太过复杂,所以笔者只介绍几个。 1111)查看网卡流量 ‘‘‘‘sarsarsarsar -n-n-n-n DEVDEVDEVDEV‘‘‘‘ IFACE 这列表示设备名称,rxpck/s 表示每秒进入收取的包的数量,txpck/s 表示每秒发送出 去的包的数量,rxbyt/s 表示每秒收取的数据量(单位Byte),txbyt/s 表示每秒发送的数据量。 后面几列不需要关注。如果有一天你所管理的服务器丢包非常严重,那么你就应该看一看这 个网卡流量是否异常了,如果 rxpck/s 那一列的数值大于 4000,或者 rxbyt/s 那列大于 5,000,000 则很有可能是被攻击了,正常的服务器网卡流量不会高于这么多,除非是你自己 在拷贝数据。上面的命令是查看网卡流量历史的,如何时时查看网卡流量呢? 另外也可以查看某一天的网卡流量历史,使用-f选项,后面跟文件名,如果你的系统格式 Redhat 或者CentOS 那么sar 的库文件一定是在/var/log/sa/目录下的。 2222)查看历史负载 ‘‘‘‘sarsarsarsar -q-q-q-q’’’’ 这个命令有助于我们查看服务器在过去的某个时间的负载状况。 关于sar 的介绍笔者不愿写太多,毕竟介绍太多会给你带来更多的压力,其实笔者介绍这个 命令的目的只是让你学会查看网卡流量(这是非常有用的)。如果你很感兴趣那就 man 一下 吧,它的用法太多了。 5.5.5.5. free free free free 查看内存使用状况 只要你敲一个 free 然后回车就可以当前系统的总内存大小以及使用内存的情况。从上图中 可看到当前系统内存总大小为 235128(单位是 k)已经使用 120368,剩余 94760。其实真 正剩余并不是这个 94760,而是第二行的 213388,真正使用的也是第二行的 21740。这是因 为系统初始化时,就已经分配出很大一部分内存给缓存,这部分缓存用来随时提供给程序使 用,如果程序不用,那这部分内存就空闲。所以,查看内存使用多少,剩余多少请看第二行 的数据。另外你还可以加-m 或者-g选项分别以 M或G为单位打印内存使用状况。 6.6.6.6. pspspsps 查看系统进程 作为系统管理员,一定要知道你所管理的系统都有那些进程在运行,在 windows 下只要打 开任务管理器即可查看。在linux 下呢?其实在上面介绍的 top 命令就可以,但是不够专业, 当然还有专门显示系统进程的命令。 对了,就是这个’ps aux’。笔者也经常看到有的人喜欢用’ps -elf’ 大同小异,显示的信息 基本上是一样的。 ps命令还有更多的用法,笔者不再做介绍,因为你只要会用这个命令就 足够了,请 man 一下。下面介绍上图上出现的几个参数的意义。 PIDPIDPIDPID:进程的 id,这个 id很有用,在 linux 中内核管理进程就得靠 pid 来识别和管理某一个 程,比如我想终止某一个进程,则用 ‘kill 进程的 pid’,有时并不能杀掉,则需要加一个-9 选项了’kill -9 进程pid’ STATSTATSTATSTAT:表示进程的状态,进程状态分为以下几种(不要求记住,但要了解) D 不能中断的进程(通常为 IO) R 正在运行中的进程 S 已经中断的进程,通常情况下,系统中大部分进程都是这个状态 T 已经停止或者暂停的进程,如果我们正在运行一个命令,比如说 sleep 10,如果我们按一 下ctrl -z 让他暂停,那么我们用ps查看就会显示 T这个状态 W 这个好像是说,从内核 2.6xx 以后,表示为没有足够的内存页分配 X 已经死掉的进程(这个好像从来不会出现) Z 僵尸进程,杀不掉,打不死的垃圾进程,占系统一小点资源,不过没有关系。如果太多, 就有问题了。一般不会出现。 < 高优先级进程 N 低优先级进程 L 在内存中被锁了内存分页 s 主进程 l 多线程进程 + 代表在前台运行的进程 这个ps命令是笔者在工作中用的非常多的命令之一,所以请记住它吧。关于ps命令的使用, 笔者经常会连同管道符一起使用,用来查看某个进程或者它的数量。 上面的 6不对,需要减掉 1,因为使用 grep 命令时,grep 命令本身也算作了一个。 7.7.7.7. netstatnetstatnetstatnetstat 查看网络状况 netstat 命令用来打印网络连接状况、系统所开放端口、路由表等信息。笔者最常用的关于 netstat 的命令就是这个 netstat -lnp (打印当前系统启动哪些端口)以及netstat -an (打 印网络连接状况)这两个命令非常有用,请一定要记住。 如果你所管理的服务器是一台提供 web 服务(80 端口)的服务器,那么你就可以使用 netstat -an |grep 80 开查看当前连接 web 服务的有哪些 IP了。 8.8.8.8. 抓包工具 tcpdumptcpdumptcpdumptcpdump 有时候,也许你会有这样的需求,想看一下某个网卡上都有哪些数据包,尤其是当你初步判 定你的服务器上有流量攻击。这时,使用抓包工具来抓一下数据包,就可以知道有哪些 IP 在攻击你了。 如果你没有 tcpdump 这个命令,需要用’yum install -y tcpdump ’命令去安装一下。上图中第 三列和第四列显示的信息为哪一个 IP+port 在连接哪一个 IP+port,后面的信息是该数据包的 相关信息,如果不懂也没有关系,毕竟你不是专门搞网络的,而这里需要你关注的只是第三 列以及第四列。-i 选项后面跟设备名称,如果你想抓 eth1 网卡的包,后面则要跟 eth1.至于 -nn 选项的作用是让第三列和第四列显示成 IP+端口号的形式,如果不加-nn 则显示的是主机 名+服务名称。 【linux linux linux linux 网络相关】 1.1.1.1. ifconfigifconfigifconfigifconfig 查看网卡 IPIPIPIP ifconfig 类似与 windows 的ipconfig,不加任何选项和参数只打印当前网卡的 IP相关信息(子 网掩码、网关等) 当然ifconfig 后面可以跟设备名,只打印指定设备的 IP信息。 在windows 下设置 IP非常简单,然而在命令窗口下如何设置?这就需要去修改配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 了,如果是 eth1 那么配置文件是 /etc/sysconfig/network-scripts/ifcfg-eth1. 如果想修改 IP的话,则只需要修改 IPADDR, NETMASK 以及GATEWAY 即可。如果你的 linux 是通过 dhcp 服务器自动获得的 IP,那么配置文件肯定和上图中的不一样,BOOTPROTO 那里 会是’dhcp’,如果你要配置成静态 IP的话,这里就需要写成’none’。关于如何设置 IP以及子 网掩码的这些知识属于网络相关的基础知识了,如果你对这方面比较陌生的话,建议你去看 看网络相关的资料。当修改完 IP后需要重启网络服务新 IP才能生效,重启命令为’ service network restart’ 另外如果你有多个网卡的情况时,只想重启某一个网卡的话,还可以使用这个命令。 ifdown 即停掉网卡,ifup 即启动网卡。有一点要提醒你的是,如果你远程登录你的服务器, 当你使用 ifdown eth0 这个命令的时候,很有可能后面的命令 ifup eth0 不会被运行,这样导 致你断网而无法连接服务器,所以请尽量使用 service network restart 这个命令来重启网 卡。 2.2.2.2. 给一个网卡设定多个 IPIPIPIP 在linux 系统中,网卡是可以设定多重 IP的,笔者曾经管理的一台服务器的 eth1 就设定了 5 个IP,实在是够变态的。 把 ifcfg-eth0 复制成 ifcfg-eth0:1 然后编辑 ifcfg-eth0:1 修改 DEVICE 以及 IPADDR 保存后重启网 卡。 再次查看 eth0 上就有两个 IP了。这里你要注意一下,文件名(ifcft-eth0:1)写成什么都无 所谓,但是文件内的 DEVICE=eth0:1 一定要按照这样的格式写,否则你启动不起来网卡。 3.3.3.3. 查看网卡连接状态 mii-tool 这个命令用来查看网卡是否连接,如图显示 link ok等字样说明连接正常,否则会显 示’no link’字样,下图是笔者所管理的一台服务器,eth1 网卡没有连接。 如果你的机器是虚拟机,那么你使用该命令时应该显示成如下: 这是因为使用的是虚拟网卡,不支持这个工具查看。不用多关注此,你记住这个 mii-tool 命 令即可,它可是会经常用到的。 4.4.4.4. 更改主机名 当装完系统后,默认主机名为 localhost,使用hostname 就可以知道你的 linux 的主机名是什 么。 同样使用 hostname 可以更改你的主机名。 下次登录时就会把命令提示符 中的’localhost’更改成’Aming’。不过这样 修改只是保存在内存中,下次重启还会变成未改之前的主机名,所以需要你还要去更改相关 的配置文件’/etc/sysconfig/network’。 把HOSTNAME=localhost.localdomain 修改成你想要的主机名,这样再重启就会读取这个配置 文件中的 HOSTNAME. 5.5.5.5. 设置DNSDNSDNSDNS DNS 是用来解析域名用的,平时我们访问网站都是直接输入一个网址,而dns 把这个网址解 析到一个 IP。关于 dns 的概念,如果你很陌生的话,那就去网上查一下吧。在 linux 下面设 置dns 非常简单,只要把 dns 地址写到一个配置文件中即可。这个配置文件就是 /etc/resolv.conf resolv.conf 有它固有的格式,一定要写成’nameserver IP’的格式,上面那行以’;’为开头的行 是一行注释,没有实际意义,建议写两个或多个 namserver ,默认会用第一个 namserver 去解析域名,当第一个解析不到时会使用第二个。在linux 下面有一个特殊的文件/etc/hosts 也能解析域名,不过是需要我们手动在里面添加 IP+域名这些内容,它的作用是临时解析某 个域名,非常有用。 它的格式如上图,每一行作为一条记录,分成两部分,第一部分是 IP,第二部分是域名。关 于hosts 文件,有几点需要你注意: 1)一个 IP后面可以跟多个域名,可以是几十个甚至上百个; 2)每行只能有一个 IP,也就是说一个域名不能对应多个 IP; 3)如果有多行中出现相同的域名(前面 IP不一样),会按最前面出现的记录来解析。 【linux linux linux linux 的防火墙】 1.1.1.1. selinuxselinuxselinuxselinux Selinux 是Redhat/CentOS 系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁 琐所以几乎没有人去真正应用它。所以装完系统,我们一般都要把 selinux 关闭,以免引起 不必要的麻烦。关闭 selinux 的方法为: 把’SELINUX=enforcing’改成’SELINUX=disabled’,然后重启机器。临时关闭 selinux 的命令为 getenforce 命令可以得到 selinux 的状态,其中有两种(Enforcing|Permissive),前者表示开放, 后者表示关闭,但是会发出警告。setenforce 用来设置 selinux 的状态,后面跟 0则设置成 Permissive 后面跟 1设置成 Enforcing。关闭 selinux 的命令为 setenforce 0,但是这只是临时 关闭,重启后恢复,想要永久生效,请更改配置文件/etc/selinux/config。 2.2.2.2. iptablesiptablesiptablesiptables Iptables 是linux 上特有的防火墙机制,其功能非常强大,然而笔者在日常的管理工作中仅仅 用到了一两个应用,这并不代表 iptables 不重要。作为一个网络管理员,iptables 是必要要 熟练掌握的。但是作为系统管理员,我们也应该会最基本的 iptables 操作,认识 iptables 的 基本规则。 1111)iptalbes iptalbes iptalbes iptalbes 的三个表 filter :这个表主要用于过滤包的,是系统预设的表,这个表也是笔者用的最多的。内建三 个链INPUT、OUTPUT 以及FORWARD。INPUT 作用于进入本机的包;OUTPUT 作用于本机送 出的包;FORWARD 作用于那些跟本机无关的包。 nat :主要用处是网络地址转换,也有三个链。PREROUTING 链的作用是在包刚刚到达防 火墙时改变它的目的地址,如果需要的话。OUTPUT 链改变本地产生的包的目的地址。 POSTROUTING 链在包就要离开防火墙之前改变其源地址。该表笔者用的不多,但有时候会 用到。 mangle :这个表主要是用于给数据包打标记,然后根据标记去操作哪些包。这个表几乎不 怎么用。除非你想成为一个高级网络工程师,否则你就没有必要花费很多心思在它上面。 2222)iptablesiptablesiptablesiptables 基本语法 AAAA.... 查看规则以及清除规则 如上图,-t 后面跟表名,-nvL 即查看该表的规则,其中-n表示不针对 IP反解析主机名;-L 表示列出的意思;而-v表示列出的信息更加详细。如果不加-t ,则打印 filter 表的相关信息。 这个和-t filter 打印的信息是一样的。 关于清除规则的命令中,笔者用的最多就是 不加-t默认是针对表 filter 来操作的,-F 表示把所有规则全部删除;-Z表示把包以及流量计 数器置零(这个笔者认为很有用)。 B.B.B.B. 增加////删除一条规则 这就是增加了一条规则,省略-t所以针对的是 filter 表。-A 表示增加一条规则,另外还有-I 表 示插入一条规则,-D删除一条规则;后面的 INPUT 即链名称,还可以是 OUTPUT 或者 FORWORD;-s 后跟源地址;-p 协议(tcp, udp, icmp);--sport/--dport 后跟源端口/目标端 口;-d 后跟目的 IP(主要针对内网或者外网);-j 后跟动作(DROP 即把包丢掉,REJECT 即 包拒绝;ACCEPT 即允许包)。这样讲可能很乱,那笔者多举几个例子来帮你理解: 上例表示:插入一条规则,把来自 10.0.2.36 的所有数据包丢掉。 删除刚刚插入的规则。注意要删除一条规则时,必须和插入的规则一致,也就是说,两条 iptables 命令,除了-I 和-D不一样外,其他地方都一样。 上例表示把来自 10.0.2.36 并且是 tcp 协议到本机的 80 端口的数据包丢掉。这里要说的是, --dport/--sport 必须要和-p选项一起使用,否则会出错。 把发送到 10.0.2.34 的22 端口的数据包丢掉。下面做一个小试验: 一开始用本机ping 10.0.2.34 是通的,然后使用iptables增加一条规则,使到10.0.2.34的icmp 包丢掉,再 ping 10.0.2.34 则不通了。此时用’iptables –nvL’查看iptalbes 规则。 会有一条这样的记录,看pkts 那列显示 4个数据包,因为我们 ping 的时候给 10.0.2.34 发送 了4个数据包,第二列表示这 4个数据包一共有多大(336bytes)。此时使用’iptables -Z' 清 零。 现在你明白’iptables -Z’的意义了吧。至于FORWORD 链的应用笔者几乎没有用到过,所以不 再举例。再总结一下各个选项的作用: -A/-D:增加删除一条规则; -I:插入一条规则,其实跟-A的效果一样; -p :指定协议,可以是 tcp,udp 或者icmp; --dport :跟-p一起使用,指定目标端口; --sport :跟-p一起使用,指定源端口; -s :指定源 IP(可以是一个 ip段); -d :指定目的 IP(可以是一个 ip段); -j :后跟动作,其中 ACCEPT 表示允许包,DROP 表示丢掉包,REJECT 表示拒绝包; -i :指定网卡(不常用,但有时候能用到); 上例中表示,把来自 10.0.2.0/24 这个网段的并且作用在 eth0 上的包放行。有时候你的服务 器上iptables 过多了,想删除某一条规则时,又不容易掌握当时创建时的规则。其实有一种 比较简单的方法: 查看结果如下: 删除某一个规则的方法是: -D 后跟链名,然后是规则 num,这个 num 就是查看 iptables 规则时第一列的值。 iptables 还有一个选项经常用到,-P(大写)选项,表示预设策略。用法如下: -P后面跟链名,策略内容或者为 DROP 或者为 ACCEPT,默认是 ACCEPT。注意:如果你在连 接远程服务器,千万不要随便敲这个命令,因为一旦你敲完回车你就会断掉。 看到上图中红框标出的部分了吧,现在所有进来的数据包全部 DROP 了。这个策略一旦设定 后,只能使用 iptables -P ACCEPT 才能恢复成原始状态,而不能使用-F参数。下面笔者针对 一个小需求讲述一下这个 iptables 规则如何设定。 需求:只针对 filter 表,预设策略 INPUT 链DROP,其他两个链 ACCEPT,然后针对 10.0.2.0/24 开通22 端口,对所有网段开放 80 端口,对所有网段开放 21 端口。 这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。 完成脚本的编写后,直接运行 ‘sh /usr/local/sbin/iptables.sh ’ 即可。如果想开机启动时初 始化防火墙规则,则需要在/etc/rc.d/rc.local 中添加一行 ‘sh /usr/local/sbin/iptables.sh’。 关于icmp 的包有一个比较常见的应用。 --icmp-type 这个选项是要跟-p icmp 一起使用的,后面指定类型编号。这个8指的是能在本 机ping 通其他机器,而其他机器不能 ping 通本机。这个有必要记一下。 C.C.C.C. nat nat nat nat 表的应用 其实,linux 的iptables 功能是十分强大的,笔者曾经的一个老师这样形容 linux 的网络 功能:只有想不到没有做不到!也就是说只要你能够想到的关于网络的应用,linux 都能帮 你实现。在日常生活中相信你接触过路由器吧,它的功能就是分享上网。本来一根网线过来 (其实只有一个公网 IP),通过路由器后,路由器分配了一个网段(私网IP),这样连接路由 器的多台 pc都能连接 intnet 而远端的设备认为你的 IP就是那个连接路由器的公网 IP。这个 路由器的功能其实就是由 linux 的iptables 实现的,而iptables 又是通过 nat 表作用而实现的 这个功能。 至于具体的原理以及过程,笔者不想阐述,请查看相关资料。笔者在这里只举一个例子 来说明 iptables 如何实现的这个功能。假设你的机器上有两块网卡 eth0 和eth1,其中 eth0 的IP为10.0.2.68 ,eth1 的IP为192.168.1.1 。eth0 连接了 intnet 但eth1 没有连接,现在 有另一台机器(192.168.1.2)和eth1 是互通的,那么如何设置也能够让连接 eth1 的这台机 器能够连接 intnet(即能和 10.0.2.68 互通)? 其实就是这样简单的两个命令就能实现上面的需求。第一个命令涉及到了内核参数相关的配 置文件,它的目的是为了打开路由转发功能,否则无法实现我们的应用。第二个命令则是 iptables 对nat 表做了一个 IP转发的操作,-o 选项后跟设备名,表示出口的网卡, MASQUERADE 表示伪装的意思。 关于nat 表,笔者不想讲太多内容,你只要学会这个路由转发即可。其他的东西交给网 络工程师去学习吧,毕竟你将来可是要做 linux 系统工程师的。 D.D.D.D. 保存以及备份 iptalbes iptalbes iptalbes iptalbes 规则 也许你不知道,咱们设定的防火墙规则只是保存在内存中,并没有保存到某一个文件中, 也就说当系统重启后以前设定的规则就没有了,所以设定好规则后要先保存一下。 它会提示你把规则保存在了/etc/sysconfig/iptables 文件内。其实,这个文件就是 iptables 的 配置文件了,你不妨查看一下它。 红线部分就是咱们刚才设定那条规则!有时可能因为我们设置防火墙规则有误导致服务器出 问题,这时候不妨先备份一下这个配置文件,然后停止防火墙服务。 这样防火墙就失效了,但是一旦你重新设定规则后(哪怕只有一条),防火墙又开始工作了。 我还可以使用 iptables-save >filename 这条命令来保存一个防火墙规则,这样就可以起到备 份的作用了。要想恢复这个规则使用下面这个命令即可。 【linux linux linux linux 系统的任务计划】 这部分内容太重要了,其实大部分系统管理工作都是通过定期自动执行某一个脚本来完 成的,那么如何定期执行某一个脚本呢?这就要借助 linux 的cron 功能了。 关于cron 任务计划功能的操作都是通过 crontab 这个命令来完成的。其中常用的选项有: -u :指定某个用户,不加-u选项则为当前用户; -e :制定计划任务; -l :列出计划任务; -r :删除计划任务。 使用crontab -e 来制定计划任务,上面的例子表示在 05 月26 日(这天必须是周四)的 10 点01 分执行’ echo "ok" >/root/cron.log’这样的任务。 Cron 的格式是这样的,每一行代表一个任务计划,总共分成两部分,前面部分为时间, 后面部分要执行的命令。后面的命令不用多讲,至于前面的时间是有讲究的,这个时间共分 为5段,用空格隔开(可以是多个空格),第一段表示分钟(0-59),第二段表示小时(0-23), 第三段表示日(1-31),第四段表示月(1-12),第五段表示周(0-7,0 或者7都可以表示为周日)。 从左至右依次是:分,时,日,月,周(一定要牢记)! crontab -e 实际上是打开了/var/spool/cron/username (如果是 root 则打开的是 /var/spool/cron/root)这个文件。使用的是 vim 编辑器,所以要保存的话则在命令模式下输 入:wq 即可。但是,你千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用 crontab -e来编辑。查看已经设定的任务计划使用 crontab -l 删除计划任务要用 crontab -r 下面笔者给你出一些练习题,帮助你熟悉这个 cron 的应用。 1. 每天凌晨 1点20 分清除/var/log/slow.log 这个文件; 2. 每周日 3点执行’/bin/sh /usr/local/sbin/backup.sh’; 3. 每月14 号4点10 分执行’/bin/sh /usr/local/sbin/backup_month.sh’; 4. 每隔8小时执行’ntpdate time.windows.com’; 5. 每天的 1点,12 点,18 点执行’/bin/sh /usr/local/sbin/test.sh’; 6. 每天的 9点到18 点执行’/bin/sh /usr/local/sbin/test2.sh’; 答案: 1. 20 1 *** echo “”>/var/log/slow.log 2. 0 30 ** 0 /bin/sh /usr/local/sbin/backup.sh 3. 10 04 14 **/bin/sh /usr/local/sbin/backup_month.sh 4. 0 */8 *** ntpdate time.windows.com 5. 0 1,12,18 **/bin/sh /usr/local/sbin/test.sh 6. 0 9-18 ***/bin/sh /usr/local/sbin/test2.sh Cron 的这部分内容并不难,你只要会了这 6道练习题,你就算掌握它了。这里要简单 说一下,每隔8小时,就是用全部小时(0-23)去除以 8,你仔细想一下结果,其实算出来 应该是 0,8,16 三个数。当遇到多个数(分钟、小时、月、周)例如第 5题,则需要用逗号隔 开。而时间段是可以用’-‘的方式表示的。等设置好了所有的计划任务后需要查看一下 crond 服务是否启动,如果没有启动,需要启动它。 如何启动稍后会做介绍。除了用户自定义的计划任务外,其实系统本身也有计划任务的。 系统会安装这个配置文件中的计划去执行内定的任务。 【linux linux linux linux 的系统服务管理】 如果你对 windows 非常熟悉的话,相信你肯定配置过开机启动的服务,有些服务我们 日常用不到则要把它停掉,一来可以节省资源,二来可以减少安全隐患。在 linux 上同样也 有相关的工具来管理系统的服务。 1.1.1.1. ntsysvntsysvntsysvntsysv 用来配置哪些服务开启或者关闭,有点想图形界面,不过是使用键盘来控制的。如果没有这 个命令请使用 yum install -y ntsysv 安装它。 敲完这个命令后则显示出如上图中的画面。在屏幕的最上面有’Red Hat’等字样,这是在告诉 我们这个工具是由 Red Hat 公司开发的。按键盘的上下方向键可以调节红色光标,按空格可 以选择开启或者不开启,如果前面的中括号内显示有’*’ 则表示开启否则不开启。通过这个 工具也可以看到目前系统中所有的服务。建议除’crond, iptables, network, sshd, syslog, irqbalance, sendmail, microcode_ctl’ 外其他服务全部停掉。选择好后,按’tab’键选择 ok然后 回车。需要重启机器才能生效。 2.2.2.2. chkconfigchkconfigchkconfigchkconfig Linux 系统所有的预设服务可以查看/etc/init.d/目录得到 其实这就是系统所有的预设服务了。为什么这样讲,因为系统预设服务都是可以通过这样的 命令实现 ‘service 服务名 start|stop|restart’,这里的服务名就是/etc/init.d/目录下的这 些文件了。除了可以使用’service crond start ‘启动 crond 外,还可以使用/etc/init.d/crond start 来启动。 如上图,这两个命令出来的结果是一样的。 再看看这个 chkconfig 命令,它不仅可以列出来所有的服务,还可以详细到每个级别。这里 的级别(0,1,2,3,4,5,6)就是 inittab 里面介绍的那几个启动级别了。 这样还可以查看某一个服务的启动情况。 用--level 指定级别,后面是服务名,然后是 off 或者on,--level 后还可以跟多个级别。 另外还可以省略级别,默认是针对 2,3,4,5 级别操作。 另外这个 chkconfig 还有一个功能就是可以把某个服务加入到系统服务,即可以使用 service 服务名 start 这样的形式,并且可以在 chkconfig --list 中查找到。当然也能删除掉。 这个功能常用在把自定义的启动脚本加入到系统服务当中。关于系统服务就讲这些内容,其 实还有很多内容笔者没有介绍,道理很简单,一来讲多了你不能消化二来讲多了你也用不上。 【linux linux linux linux 中的数据备份】 数据备份,不用说太多吧,毫无疑问很重要。笔者就曾经有过一次非常痛苦的经历,备 份策略没有做好,结果磁盘坏掉数据丢失,简直是撕心裂肺的痛呀。还好数据重要性不是特 别高,即使是不高也是丢失了数据,这是作为系统管理员最不应该出现的事故。所以,在你 以后的系统维护工作中,一定要把数据备份当回事,认真对待。在 linux 上作为数据备份的 工具很多,但笔者就只用一种那就是 rsync 从字面上的意思你可以理解为 remote sync (远 程同步)这样可以让你理解的更深刻一些。Rsync 不仅可以远程同步数据(类似于 scp),当 然还可以本地同步数据(类似于 cp),但不同于 cp或scp 的一点是,rsync 不像cp/scp 一样 会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同, 只有不同时才会把不同的部分覆盖掉。如果你的 linux 上下面看例子吧。(如果没有 rsync 命 令请使用 yum install -y rsync 安装) 上面例子表示把当前目录下的 123 同步到/tmp/目录下,并且同样也命名为 123。如果是远 程拷贝的话就是这样的形式了 IP:path (如:10.0.2.34:/root/) 当建立连接后,是需要输入密码的。如果手动去执行这些操作还好,但是如果是写在脚本中 怎么办?这就涉及到添加信任关系了,该部分内容稍后会详细介绍。 1.1.1.1. rsync rsync rsync rsync 的命令格式 rsync [OPTION]...SRCDEST rsync [OPTION]...SRC[USER@]HOST:DEST rsync [OPTION]...[USER@]HOST:SRCDEST rsync [OPTION]...[USER@]HOST::SRCDEST rsync [OPTION]...SRC[USER@]HOST::DEST 笔者在一开始举的两个例子,第一个例子即为第一种格式,第二个例子即为第二种格式,但 不同的是,笔者并没有加 user@host 如果不加默认指的是 root 。第三种格式是从远程目录 同步数据到本地。第四种以及第五种格式使用了两个冒号,这种方式和前面的方式的不同在 于验证方式不同,稍后详细介绍。 2.2.2.2. rsync rsync rsync rsync 常用选项 -a :归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD ,-a选项后 面可以跟一个 --no-OPTION 这个表示关闭-rlptgoD 中的某一个例如 -a --no-l 等同于 -rptgoD -r :对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r, 但是传输的是目录必须加-r选项 -v :打印一些信息出来,比如速率,文件数量等 -l :保留软链结 -L:向对待常规文件一样处理软链结,如果是 SRC 中有软连接文件,则加上该选项后将会 把软连接指向的目标文件拷贝到 DST -p :保持文件权限 -o :保持文件属主信息 -g :保持文件属组信息 -D:保持设备文件信息 -t :保持文件时间信息 --delete :删除那些 DST 中SRC 没有的文件 --exclude=PATTERN :指定排除不需要传输的文件,等号后面跟文件名,可以是万用字符模 式(如*.txt) -u :加上这个选项后将会把 DST 中比SRC 还新的文件排除掉,不会覆盖 下面笔者将会针对这些选项做一些列小实验: 1) 建立目录以及文件 笔者建立这些文件的目的就是为做试验做一些准备工作。 2)使用-a选项 这里有一个问题,就是本来想把 test1 目录直接拷贝成 test2 目录,可结果 rsync 却新建了 test2 目录然后把 test1 放到test2 当中。为了避免这样的情况发生,可以这样做: 加一个斜杠就好了,所以笔者建议你在使用 rsync 备份目录时要养成加斜杠的习惯。在上面 讲了-a选项等同于- rlptgoD,而且-a还可以和--no-OPTION 一并使用。 笔者加上-v选项来获得更多的信息,上例中因为没有使用-r选项导致只能拷贝目录但不能拷 贝目录下面的内容(英文翻译过来就是“忽略了目录 test1/.”,其中test1/.指的就是 test1 目 录内部的所有文件),所以虽然创建了 test2 目录,但是 test2 目录为空。下面再看看那个-l 选项的作用。 使用-v选项看来就是方便呀,上例告诉我们跳过了非普通文件 1.sh,其实 1.sh 是一个软连 接文件,如果不使用-l选项则不会理会软连接文件的。 果真test2 目录当中没有那个 1.sh 的影子。当然加上-l选项则会把软连接文件给拷贝过去, 但是软连接的目标文件却没有拷贝过去,有时候咱们指向拷贝软连接文件所指向的目标文 件,那这时候该怎么办呢? 3)使用-L选项 一个-L就可以把 SRC 中软连接的目标文件给拷贝到 DST 4) 使用-u选项 首先查看一下 test1/1 和 test2/1 的访问时间(肯定是一样的),然后使用 touch 修改一下 test2/1 的访问时间(此时test2/1 要比test1/1 的访问时间晚了一些),如果不加-u选项的话, 会把test2/1 的访问时间变成和 test1/1 的访问时间一样。这样讲也许你会迷糊,不妨看一看。 看到了吧,本来test2/1 的访问时间已经不同于 test1/1 的访问时间了,但是同步后访问时间 又一致了。 现在你明白-u选项的妙用了吧。 5)使用--delete 选项 如果不使用--delete 选项当 SRC 有文件删除时,DST 是不会删除的,只有加上--delete 选项后 才能删除掉。还有一种情况就是如果在 DST 增加文件了,而 SRC 当中没有这些文件,同步 时加上--delete 选项后同样会删除新增的文件。 6)使用--exclude 选项 另外还可以使用万用字符*匹配 最后简单总结一下,平时你使用 rsync 同步数据的时候,使用-a选项基本上就可以达到我们 想要的效果了,只是有时候会有个别的需求,会用到-a --no-OPTION, -u, -L,--delete, --exclude 这些选项,但是笔者要求你把上面这些全部掌握,毕竟这才几个而已,大部分选项笔者都没 有介绍。如果在以后的工作中遇到特殊需求了,就去查一下 rsync 的man 文档吧。 3.3.3.3. rsyncrsyncrsyncrsync 应用实例 1111)通过 ssh ssh ssh ssh 的方式 最上面介绍的 5种方式当中,第二、第三(1个冒号)就属于通过 ssh 的方式,这种方 式其实就是让用户去登录到远程机器,然后执行 rsync 的任务。 这种方式就是前面介绍的第二种方式了,是通过 ssh 拷贝的数据,是要输入 10.0.2.69 那台 机器root 的密码的。 这个则为第三种方式。这两种方式如果写到脚本里,备份起来就有麻烦了,因为要输入密码, 脚本本来就是自动的,不可能做到的。但是不代表没有解决办法。那就是通过密钥验证,密 钥不设立密码就 ok了。还记得在前面笔者曾经介绍过通过密钥登录远程主机吗,下面要讲 的内容就是那些东西了。 先提前说一下基本的主机信息:10.0.2.68(主机名Aming-1)和 10.0.2.69(主机名Aming) 需要从 Aming-1 上拷贝数据到 Aming 上。 A. 首先确认一下 Aming-1 上是否有这个文件 /root/.ssh/id_rsa.pub 如果没有安装以下的方法生成: 在这个过程中会有一些交互的过程,因为笔者的/root/.ssh/id_rsa 已经存在,所以会问是否 覆盖,笔者选择覆盖,然后会提示要输入这个密钥的密码,出于安全考虑应该定义个密码, 但是我们的目的就是为了自动化同步数据,所以这里不输入任何密码,直接按回车,即密码 为空。最后则生成了私钥(/root/.ssh/id_rsa)和公钥文件(/root/.ssh/id_rsa.pub) B. 把公钥文件的内容拷贝到目标机器上 复制主机 Aming-1 的/root/.ssh/id_rsa.pub 文件内容,并粘贴到主机 Aming 的 /root/.ssh/authorized_keys 中 在这一步也许你会遇到/root/.ssh 目录不存在的问题,可以手动创建,并修改目录权限为 700 也可以执行 ssh-keygen 命令生成这个目录。保存/root/.ssh/authorized_keys 文件后,再到主 机Aming-1 上执行 你会发现,现在不用输入密码也可以登录主机 Aming 了。下面再从主机 Aming-1 上执行一下 rsync 命令试试吧。 2222)通过后台服务的方式 这种方式可以理解成这样,在远程主机上建立一个 rsync 的服务器,在服务器上配置好 rsync 的各种应用,然后本机作为 rsync 的一个客户端去连接远程的 rsync 服务器。下面笔者 就介绍一下,如何去配置一台 rsync 服务器。 A. 建立并配置 rsync 的配置文件 /etc/rsyncd.conf 其中配置文件分为两部分全部配置部分和模块配置部分,全局部分就是几个参数而已,就像 笔者的 rsyncd.conf 中port, log file, pid file, address 这些都属于全局配置,而[test] 以下部分 就是模块配置部分了。一个配置文件中可以有多个模块,模块名自定义,格式就像笔者的 rsyncd.conf 中的这样。其实模块中的一些参数例如 use chroot, max connections, udi, gid, auth users, secrets file 以及hosts allow 都可以配置成全局的参数。当然笔者给出的参数并不是所 有的,你可以通过 man rsyncd.conf 获得更多信息。 下面就简单解释一下这些参数的意义: portportportport :指定在哪个端口启动 rsyncd 服务,默认是 873 loglogloglog filefilefilefile :指定日志文件 pidpidpidpid filefilefilefile :指定 pid 文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作 addressaddressaddressaddress :指定启动 rsyncd 服务的 IP,假如你的机器有多个 IP,就可以指定其中一个启动 rsyncd 服务,默认是在全部 IP上启动 [test][test][test][test] :指定模块名,自定义 pathpathpathpath :指定数据存放的路径 useuseuseuse chrootchrootchrootchroot :true|false 默认是 true,意思是在传输文件以前首先 chroot 到path 参数所指定 的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以 roots 权限,并且不能 备份指向外部的符号连接所指向的目录文件。默认情况下 chroot 值为true,如果你的数据 当中有软连接文件的话建议设置成 false。 maxmaxmaxmax connectionsconnectionsconnectionsconnections :指定最大的连接数,默认是 0即没有限制 readreadreadread onlyonlyonlyonly :ture|false 如果为 true 则不能上传到该模块指定的路径下 listlistlistlist :指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定为 true 则列出, false 则隐藏 uid/giduid/giduid/giduid/gid :指定传输文件时,以哪个用户/组的身份传输 authauthauthauth usersusersusersusers :指定传输时要使用的用户名 secretssecretssecretssecrets filefilefilefile :指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证 hostshostshostshosts allowallowallowallow :指定被允许连接该模块的主机,可以是 IP或者网段,如果是多个,之间用空 格隔开 B. 编辑secrets file,保存后要赋予 600 权限 C. 启动rsyncd 服务 启动后查看日志,看看是否有错误信息,然后再看下端口是否启动。 如果想开机启动,请把”rsync –daemon –confg=/etc/rsyncd.conf” 写入到/etc/rc.d/rc.local文件。 D. 到另一台机器上测试 记得那个 use chroot 参数吗,如果设置为 true,则/root/test4/1.sh 不会被拷贝过来。 修改rsyncd.conf 文件,把 use chroot 改成true,不用重启服务即可生效。 从上例中的详细信息中也可以看到,不能拷贝软连接的。所以请记住,如果涉及到软连接, 请设置 use chroot=false 。另外这种方式也是可以不用手动输入密码的,两种实现方式。 第一种:指定密码文件 先编辑一个密码文件,并修改 600 权限。 在同步时,指定密码文件即可(--password-file=/etc/rsyncd.passwd) 第二种:在 rsync 服务器端不指定用户 把相关的参数都用’#’注释掉。然后再到客户端上测试。 注意,这里不用再加 test@这个用户了,默认是以 root 的身份拷贝的,现在已经不需要输入 密码了。 【linux linux linux linux 系统日志】 日志重要吗?必须的,没有日志你怎么知道你的系统状况?没有日志你如何排查一个 trouble?日志记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原 因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的 监测系统状态,监测和追踪侵入者等等。 笔者常查看的日志文件为/var/log/message. 它是核心系统日志文件,包含了系统启动时 的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记 录到这个文件中。另外其他信息,比如某个人的身份切换为 root 以及用户自定义安装的软 件(apache)的日志也会在这里列出。通常,/var/log/messages 是在做故障诊断时首先要查 看的文件。那你肯定会说了,这么多日志都记录到这个文件中,那如果服务器上有很多服务 岂不是这个文件很快就会写的很大,没有错,但是系统有一个日志轮询的机制,每星期切换 一个日志,变成 message.1, message.2,…messages.4 连同message 一共有 5个这样的日志文 件。这是通过 logrotate 工具的控制来实现的,它的配置文件是/etc/logrotate.conf. 如果没有 特殊需求请不要修改这个配置文件。 /var/log/message 是由syslogd 这个守护进程产生的,如果停掉这个服务则系统不会产生 /var/log/message,所以这个服务不要停。Syslogd 服务的配置文件为/etc/syslog.conf 这个文 件定义了日志的级别,具体详细的东西笔者不再阐述,因为若没有特殊需求是不需要修改这 个配置文件的,请使用”man syslog.conf” 获得更多关于它的信息。 除了关注/var/log/message 外,你还应该多关注一下’dmesg’这个命令,它可以显示系统 的启动信息,如果你的某个硬件有问题(比如说网卡)用这个命令也是可以看到的。 这一小节就介绍这么多,在结束之前,笔者给你一个小小的建议。以后在你日常的管理 工总中要养成多看日志的习惯,尤其是一些应用软件的日志,比如 apache, mysql, php 等常 用的软件,看它们的日志(错误日志)可以帮助你排查问题以及监控它们的运行状况是否良 好。 【xargs xargs xargs xargs 与-exec-exec-exec-exec】 1.1.1.1. xargsxargsxargsxargs 在前面的例子中笔者曾经使用过这个命令,你是否有印象呢?现在就详细介绍一下它, 平时笔者使用 xargs 还是比较多的,很方便。 查看xargs 的man 文档,解释是这样的:build and execute command lines from standard input. 至于翻译成中文理解着有点困难。不妨笔者举个例子说明它的作用。 它的作用就是把管道符前面的输出作为 xargs 后面的命令的输入。它的好处在于可以把本来 两步或者多步才能完成的任务简单一步就能完成。xargs 常常和 find 命令一起使用,比如, 查找当前目录创建时间大于 10 天的文件,然后再删除。 这种应用是最为常见的,xargs 后面的 rm 也可以更选项,当是目录时,就需要-r选项了。 在笔者看来 xargs 的这个功能不叫什么,它的另一个功能才叫神奇。现在我有一个这样的需 求,查找当前目录下所有.txt 的文件,然后把这些.txt 的文件变成.txt_bak 。正常情况下,我 们不得不写脚本去实现,但是使用 xargs 就一步。 xargs -n1 –i{} 类似for 循环,-n1 意思是一个一个对象的去处理,-i{} 把前面的对象使用{}取 代,mv {}{}_bak 相当于 mv 1.txt 1.txt_bak。你刚开始接触这个命令时也许有点难以理解, 多练习一下你就会熟悉了,笔者建议你记住这个应用,很实用。 2.2.2.2. -exec-exec-exec-exec 使用find 命令时,经常使用一个选项就是这个-exec 了,可以达到和 xargs 同样的效果。 比如,查找当前目录创建时间大于 10 天的文件并删除。 这个命令中也是把{}作为前面 find 出来的文件的替代符,后面的”\”为”;”的脱意符,不然shell 会把分号作为该行命令的结尾。这个-exec 有时候也挺实用的。 用-exec 同样可以实现前面那个复杂的需求。 【screen screen screen screen 工具介绍】 有时候,也许你会有这样的需求,需要执行一个命令或者脚本,但是需要几个小时甚至 几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办? 你可以把命令或者脚本丢到后台运行,不过也不保险。笔者下面就介绍两种方法来避免这样 的问题发生。 1.1.1.1. 使用nohupnohupnohupnohup 直接加一个’&’虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在 前面加上’nohup’就没有问题了。nohup 的作用就是不挂断地运行命令。 2.2.2.2. screen screen screen screen 工具的使用 简单来说,screen 是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。 screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen 窗口中就像操作一个真实的 SSH 连接窗口那样。下面笔者介绍 screen 的一个简单应用。 1)打开一个会话,直接输入 screen 命令然后回车,进入screen 会话窗口。如果你没有 screen 命令,请用’yum install -y screen’安装。 2)screen -ls 查看已经打开的 screen 会话 3)Ctrl +a 再按d退出该 screen 会话,只是退出,并没有结束。结束的话输入 Ctrl +d 或者 输入exit 4)退出后还想再次登录某个 screen 会话,使用 screen -r [screen 编号],这个编号就是上图 中那个 2082. 当只有一个 screen 会话时,后面的编号是可以省略的。 当你有某个需要长时间运行的命令或者脚本时就打开一个 screen 会话,然后运行该任 务。按 ctrl +a 再按d退出会话,不影响终端窗口上的任何操作。 【linux 下同步时间服务器】 时间的准确性在服务器上非常重要,所以要与标准时间保持同步,毕竟服务器的时钟并不一 定精准,所以需要我们每隔一段时间去同步一下时间。笔者所管理的服务器每隔 6小时就会 同步一下时间。如何同步呢?这就要用到 ntpdate 这个指令。如果你的服务器上没有这个指 令,请使用'yum install -y ntpdate'安装,或者下载源码包安装。 同步时间的命令为:'ntpdate timeserver' 这里的 timeserver 为时间服务器的 IP或者 hostname,常用的 timeserver 有210.72.145.44, time.windows.com(windows 的时间服务器)。 如果你想每隔 6小时同步一次那么请指定一个计划任务。 00 */6 ***/usr/sbin/ntpdate 210.72.145.44 >/dev/null 之所以在后面加一个重定向,是因为这个同步的过程是有内容输出的,因为我们的计划任务 是在后台执行的,输出的内容会以邮件的形式发送给用户,所以为了避免邮件太多请输出到 /dev/null (在linux 下这个设备是虚拟的存在,你可以理解为空洞) 第十六章 LAMP LAMP LAMP LAMP 环境搭建 经过前部分章节的学习,你已经掌握了 linux 的基础知识了。但是想成为一名系统管理 员恐怕还有点难度,因为好多单位招聘这个职位的时候都要求有一定的工作经验。然而真正 的经验一天两天是学不来的,是靠长时间积累得来的。不过你也不要灰心,所谓的工作经验 无非也就是一些运行在 linux 系统上的软件的配置以及应用。就好像是装在 windows 上的 office 一样,大部分人都会装,但是十分会用的却不多。是因为 office 太难吗,当然不是, 只是因为只有一小部分人花费了很长很长的时间去使用和研究 office 而已。 LAMP 是Linux Apache MySQL PHP 的简写,其实就是把 Apache, MySQL 以及PHP 安装在 Linux 系统上,组成一个环境来运行 php 的脚本语言。至于什么是 php 脚本语言,笔者不再 介绍,请自己查资料吧。Apache 是最常用的 WEB 服务软件,而 MySQL 是比较小型的数据 库软件,这两个软件以及 PHP 都可以安装到 windows 的机器上。下面笔者就教你如何构建 这个LAMP 环境。 【安装MySQLMySQLMySQLMySQL】 一般我们平时安装 MySQL 都是源码包安装的,但是由于它的编译需要很长的时间,所 以,笔者建议你安装二进制免编译包。你可以到 MySQL 官方网站去下载,也可以到到这里 下载http://syslab.comsenz.com/downloads/linux/ 具体版本根据你的平台和需求而定,目前 比较常用的 mysql-5.0 和mysql-5.1。下面是安装步骤: 1. 下载mysql 到/usr/local/src/ cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/mysql-5.0.86-linux-i686-icc-glibc23.tar.gz 2. 解压 tar zxvf /usr/local/src/ mysql-5.0.86-linux-i686-icc-glibc23.tar.gz 3. 把解压完的数据移动到/usr/local/mysql mv mysql-5.0.86-linux-i686-ii-glibc23 /usr/local/mysql 4. 建立mysql 用户 useradd mysql 5. 初始化数据库 cd /usr/local/mysql mkdir /data/mysql ; chown -R mysql:mysql /data/mysql ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql --user 定义数据库的所属主,--datadir 定义数据库安装到哪里,建议放到大空间的分区上, 这个目录需要自行创建。 6. 拷贝配置文件 cp support-files/my-large.cnf /etc/my.cnf 7. 拷贝启动脚本文件并修改其属性 cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld 8. 修改启动脚本 vim /etc/init.d/mysqld 需要修改的地方有 datadir=/data/mysql(前面初始化数据库时定义的目录) 9. 把启动脚本加入系统服务项,并设定开机启动,启动 mysql chkconfig --add mysqld chkconfig mysqld on service mysqld start 如果启动不了,请到/data/mysql/ 下查看错误日志。关于mysql 的配置文件/etc/my.cnf 请参 考这篇文章 http://mylinux.5d6d.com/thread-87-1-1.html 【安装ApacheApacheApacheApache】 cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/httpd-2.2.11.tar.gz useradd www (增加 Apache 运行账户) tar zvxf httpd-2.2.11.tar.bz2 cd httpd-2.2.11 ./configure --prefix=/usr/local/apache2 \ --with-included-apr \ --enable-so \ --enable-deflate=shared \ --enable-expires=shared \ --enable-rewrite=shared \ --enable-static-support \ --disable-userdir make make install 【安装PHPPHPPHPPHP】 wget http://syslab.comsenz.com/downloads/linux/php-5.2.10.tar.gz tar zvxf php-5.2.10.tar.gz cd php-5.2.10 ./configure --prefix=/usr/local/php \ --with-apxs2=/usr/local/apache2/bin/apxs \ --with-config-file-path=/usr/local/php/etc \ --with-mysql=/usr/local/mysql \ --with-libxml-dir \ --with-gd \ --with-jpeg-dir \ --with-png-dir \ --with-freetype-dir \ --with-iconv-dir \ --with-zlib-dir \ --with-bz2 \ --with-openssl \ --with-mcrypt \ --enable-soap \ --enable-gd-native-ttf \ --enable-ftp \ --enable-mbstring \ --enable-sockets \ --enable-exif \ --disable-ipv6 make && make install mkdir /usr/local/php/etc cp php.ini-dist /usr/local/php/etc/php.ini 【apache apache apache apache 结合phpphpphpphp】 Apache 主配置文件为:/usr/local/apache2/conf/httpd.conf # vim /usr/local/apache2/conf/httpd.conf 找到: AddType application/x-gzip .gz .tgz 在该行下面添加 AddType application/x-httpd-php .php 找到: DirectoryIndex index.html 将该行改为 DirectoryIndex index.html index.htm index.php 找到: #Include conf/extra/httpd-mpm.conf #Include conf/extra/httpd-info.conf #Include conf/extra/httpd-vhosts.conf #Include conf/extra/httpd-default.conf 去掉前面的“#”号,取消注释。 【配置apache apache apache apache 的进程管理以及虚拟主机】 1.1.1.1. 配置Apache Apache Apache Apache 进程管理 配置文件为:/usr/local/apache2/conf/extra/httpd-mpm.conf 将配置文件中下面一段修改为如下: ServerLimit 2048 新添加 StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 1024 默认最大为 256,设置为超过 256 必须增加有 ServerLimit MaxRequestsPerChild 0 2.2.2.2. 配置Apache Apache Apache Apache 虚拟主机 配置文件为:/usr/local/apache2/conf/extra/httpd-vhosts.conf 将配置文件中下面一段修改为如下: # ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/data/www" ServerName www.example.com.cn ErrorLog " |/usr/local/apache/bin/rotatelogs -l /www/logs/error.log-%Y%m%d" CustomLog " |/usr/local/apache/bin/rotatelogs -l /www/logs/access.log-%Y%m%d" combined 说明: ServerAdmin 参数后为管理员 email DocumentRoot 指的是论坛文件存放的目录 ServerName 是论坛的域名 ErrorLog 是论坛错误日志 通过管道使用 apache 自带的 rotatelogs 工具将日志切割为每天一 个文件 CustomLog 是论坛访问日志,同样切割为每天一个文件 配置Apache 缺省httpd 设置 配置文件为:/usr/local/apache2/conf/extra/httpd-default.conf 将配置文件中下面一段: 将KeepAlive On 改为KeepAlive Off 配置Apache 的访问权限 找到 Options FollowSymlinks AllowOverride None Order deny,allow Deny form all 改成: Options FollowSymlinks AllowOverride None Order deny,allow Allow form all 配置完上述内容之后,启动 Apache: #/usr/local/apache2/bin/apachectl start 更多关于 apache 的配置请参考: apache 的域名重定向 如何设置 httpd-mpm.conf 的参数呢 apache nameserver 两个如何设置 apache 日志切割问题 使apache 的日志文件里不记录图片文件 apache 如何在虚拟主机中实现用户验证 Apache 防盗链设置 【测试LAMP LAMP LAMP LAMP 是否成功】 vim /data/www/1.php 写入: 保存后,然后在浏览器中输入 http://你配置的域名/1.php 看是否能看到 php 的相关配置信 息。 【Zend Zend Zend Zend 安装】 有时,需要在你的 LAMP 环境中配置 ZEND,因为有些 php 的应用程序比如 Discuz! 或者 phpwind 等是需要用 zend 来解密的,不装 zend 会显示乱码。安装步骤为: cd /usr/local/src wget http://syslab.comsenz.com/downloads/linux/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz tar zxvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz cd ZendOptimizer-3.3.3-linux-glibc23-i386 ./install.sh 根据提示安装。 如果是 3.3.9 版本请参考 Zend 3.3.9 的安装 第十七章 LNMP LNMP LNMP LNMP 环境搭建 和LAMP 不同的是 LNMP 中的N指的是是 Nginx(类似于 Apache 的一种 web 服务软件) 其他都一样。目前这种环境应用的也是非常之多。Nginx 设计的初衷是提供一种快速高效多 并发的 web 服务软件。在静态页面的处理上 Nginx 的确胜 Apache 一筹,然而在动态页面的 处理上 Nginx 并不比 Apache 有多少优势。但是,目前还是有很多爱好者对 Nginx 比较热衷, 随着Nginx 的技术逐渐成熟,它在 web 服务软件领域的地位越来越高。 【MySQL 安装】 1. 下载mysql 到/usr/local/src/ cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/mysql-5.0.86-linux-i686-icc-glibc23.tar.gz 2. 解压 tar zxvf /usr/local/src/ mysql-5.0.86-linux-i686-icc-glibc23.tar.gz 3. 把解压完的数据移动到/usr/local/mysql mv mysql-5.0.86-linux-i686-ii-glibc23 /usr/local/mysql 4. 建立mysql 用户 useradd mysql 5. 初始化数据库 cd /usr/local/mysql mkdir /data/mysql ; chown -R mysql:mysql /data/mysql ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql --user 定义数据库的所属主,--datadir 定义数据库安装到哪里,建议放到大空间的分区上, 这个目录需要自行创建。 6. 拷贝配置文件 cp support-files/my-large.cnf /etc/my.cnf 7. 拷贝启动脚本文件并修改其属性 cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld 8. 修改启动脚本 vim /etc/init.d/mysqld 需要修改的地方有 datadir=/data/mysql(前面初始化数据库时定义的目录) 9. 把启动脚本加入系统服务项,并设定开机启动,启动 mysql chkconfig --add mysqld chkconfig mysqld on service mysqld start 如果启动不了,请到/data/mysql/ 下查看错误日志,该日志格式为主机名.err。 【php php php php 的安装】 这里要先声明一下,针对 Nginx 的 php 安装和针对 apache 的 php 安装是有区别的,因为 Nginx 中的 php 是以 fastcgi 的方式结合 nginx 的,可以理解为 nginx 代理了 php 的 fastcgi,而 apache 是把php 作为自己的模块来调用的。 useradd www cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/php-5.2.10.tar.gz wget http://syslab.comsenz.com/downloads/linux/php-5.2.10-fpm-0.5.13.diff.gz 下载的第二个包 php-5.2.10-fpm-0.5.13.diff.gz 是用来给 php 打补丁的,默认情况下,php 是 无法编译出 fastcgi 的。 tar zxvf php-5.2.10.tar.gz gzip -cd php-5.2.10-fpm-0.5.13.diff.gz | patch -d php-5.2.10 -p1 cd php-5.2.10 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt=/usr/local/libmcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi --enable-fpm make && make install mkdir /usr/local/php/etc cp php.ini-dist /usr/local/php/etc/php.ini vim /usr/local/php/etc/php-fpm.conf /tmp/php-fcgi.sock 这一行要改成这样,这里这样修改 了以后,在配置 nginx 的时候就需要注意这个路径了。 修改用户和组的名称为”www” 去掉注释,改成这样: Unix user of processes www Unix group of processes www /usr/local/php/sbin/php-fpm start 其他关于 php 的扩展模块安装请参考: Eaccelerator 安装及配置 memcache 和memcached 在php 中的应用 php 中ming 的编译 关于php 的配置文件 php.ini 以及 php-frpm.conf 的相关资料: php.ini 中禁止一些函数,增加安全性 php-fpm.conf 参数说明 php-fpm.conf 两个至关重要的参数 另外如果你在编译 php 时出现了某些错误,请参考: 编译php 时可能出现的错误以及解决办法 【nginxnginxnginxnginx 安装以及配置】 1.1.1.1. nginx nginx nginx nginx 源码安装 cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/nginx-0.9.6.tar.gz tar zxvf nginx-0.9.6.tar.gz cd nginx-0.9.6 ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/var/nginx.pid --lock-path=/usr/local/nginx/var/nginx.lock --http-client-body-temp-path=/dev/shm/nginx_temp/client_body --http-proxy-temp-path=/dev/shm/nginx_temp/proxy --http-fastcgi-temp-path=/dev/shm/nginx_temp/fastcgi --user=www --group=www --with-cpu-opt=pentium4F --without-select_module --without-poll_module --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --without-http_ssi_module --without-http_userid_module --without-http_geo_module --without-http_memcached_module --without-http_map_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-pcre make && make install mkdir /dev/shm/nginx_temp 有的nginx 版本编译时会因为 pcre 编译不过去,需要修改一下 --with-pcre=/usr/local/src/pcre-7.8,前提是已经下载了pcre 源码包pcre-1.8.tar.gz,并解压到 /usr/local/src/pcre-7.8,不需要编译 pcre 2.2.2.2. 编写nginx nginx nginx nginx 的启动脚本,并加入系统服务 vi /etc/init.d/nginx 写入以下内容: #!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library ./etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/var/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload(){ echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart(){ stop start } configtest(){ $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL 保存后,更改/etc/init.d/nginx 的权限 chmod 755 /etc/init.d/nginx chkconfig --add nginx chkconfig nginx on 3.3.3.3. nginx nginx nginx nginx 的配置 vim /usr/local/nginx/conf/nginx.conf 把原来的文件清空,然后粘贴如下内容: user www www; worker_processes 2; error_log /home/logs/nginx_error.log crit; pid /usr/local/nginx/var/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 6000; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 2048; server_names_hash_max_size 4096; log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local] ' '$host "$request_uri" $status ' '"$http_referer" "$http_user_agent"'; sendfile on; tcp_nopush on; keepalive_timeout 30; client_header_timeout 3m; client_body_timeout 3m; send_timeout 3m; connection_pool_size 256; client_header_buffer_size 1k; large_client_header_buffers 8 4k; request_pool_size 4k; output_buffers 4 32k; postpone_output 1460; client_max_body_size 10m; client_body_buffer_size 256k; client_body_temp_path /usr/local/nginx/client_body_temp; proxy_temp_path /usr/local/nginx/proxy_temp; fastcgi_temp_path /usr/local/nginx/fastcgi_temp; fastcgi_intercept_errors on; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 8k; gzip_comp_level 5; gzip_http_version 1.1; gzip_types text/plain application/x-javascript text/css text/html application/xml; server { listen 80; server_name www.example.com; index index.html index.htm index.php; root /data/www; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/ php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME/data/www$fastcgi_script_name; } } 保存后就可以启动 nginx 了 service nginx start 如果启动不了,请到/usr/local/nginx/logs/目录下查看 error.log 这个日志文件。 关于nginx 配置文件的详细配置请参考以下帖子: Nginx 的主配置文件 Nginx 的虚拟主机配置文件 更多Nginx 的相关配置 【测试是否解析 php php php php 文件】 vim /data/www/1.php 写入如下内容: 然后设定 hosts 文件,访问 www.example.com/1.php 看是否能解析出这个页面。 第十八章 学会使用简单的 MySQL MySQL MySQL MySQL 操作 在前面两个章节中已经介绍过 MySQL 的安装了,但是光会安装还不够,还需要会一些 基本的相关操作。当然了,关于MySQL 的内容也是非常多的,只不过对于 linux 系统管理员 来讲,一些基本的操作已经可以应付日常的管理工作了,至于更高深的那是 DBA(专门管理 数据库的技术人员)的事情了。 【更改mysql mysql mysql mysql 数据库 root root root root 的密码】 首次进入数据库是不用密码的 /usr/local/mysql/bin//usr/local/mysql/bin//usr/local/mysql/bin//usr/local/mysql/bin/mysqlmysqlmysqlmysql ----uuuu rootrootrootroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.0.86 MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> 现在已经进入到了 mysql 的操作界面了。退出的话,直接输入 exit 即可。 mysql> exitexitexitexit Bye 先解释一下上面的命令的含义,-u 用来指定要登录的用户,root 用户是 mysql 自带的管理 员账户,默认没有密码的,那么如何给 root root root root 用户设定密码?按如下操作: /usr/local/mysql/bin/mysqladmin/usr/local/mysql/bin/mysqladmin/usr/local/mysql/bin/mysqladmin/usr/local/mysql/bin/mysqladmin -u-u-u-u rootrootrootroot passwordpasswordpasswordpassword ‘‘‘‘123456123456123456123456’’’’ 这样就可以设定 root 用户的密码了。其中mysqladmin 就是用来设置密码的工具,-u 指定用 户,passwod 后跟要定义的密码,密码需要用单引号或者双引号括起来。另外你也许发现了, 敲命令时总在前面加/usr/local/mysql/bin/ 这样很累。但是直接打 mysql 又不能用,这是因 为在系统变量$PATH 中没有/usr/local/mysql/bin/这个目录,所以需要这样操作(如果你的 linux 可以直接打出 mysql 这个命令,则不要做这个操作): vimvimvimvim /etc/profile/etc/profile/etc/profile/etc/profile 在最后加入一行: export PATH=$PATH:/usr/local/mysql/bin/ 保存后运行 sourcesourcesourcesource /etc/profile/etc/profile/etc/profile/etc/profile 设定完密码后,再来运行最开始进入 mysql 数据库操作界面的命令: mysqlmysqlmysqlmysql ----uuuu rootrootrootroot ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 就报错了,这是因为 root 用户有密码。 mysqlmysqlmysqlmysql -u-u-u-u rootrootrootroot -p-p-p-p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.0.86 MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> 需要加-p选项指定密码,这时就会提示你输入密码了。 当设定密码后,如果要想更改密码如何操作呢? mysqladminmysqladminmysqladminmysqladmin -u-u-u-u rootrootrootroot -p-p-p-p passwordpasswordpasswordpassword "123456789""123456789""123456789""123456789" Enter password: 输入原来 root 的密码就可以更改密码了。 【连接数据库】 刚刚讲过通过使用 mysqlmysqlmysqlmysql -u-u-u-u rootrootrootroot -p-p-p-p 就可以连接数据库了,但这只是连接的本地的数据 库’localhost’,然后有很多时候都是去连接网络中的某一个主机上的 mysql。 mysqlmysqlmysqlmysql -u-u-u-u user1user1user1user1 -p-p-p-p ––––PPPP 3306330633063306 -h-h-h-h 10.0.2.6910.0.2.6910.0.2.6910.0.2.69 其中-P(大写)指定远程主机 mysql 的绑定端口,默认都是 3306;-h指定远程主机的 IP 【一些基本的 MySQL MySQL MySQL MySQL 操作命令】 1. 查询当前所有的库 mysql> showshowshowshow databases;databases;databases;databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 2. 查询某个库的表 mysql> useuseuseuse mysql;mysql;mysql;mysql; Database changed mysql> showshowshowshow tables;tables;tables;tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | func | | help_category | | help_keyword | | help_relation | | help_topic | | host | | proc | | procs_priv | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ 3. 查看某个表的字段 mysql> descdescdescdesc func;func;func;func; //func 是表名 +-------+------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------------------+------+-----+---------+-------+ | name | char(64) | NO | PRI | | | | ret | tinyint(1) | NO | | 0 | | | dl | char(128) | NO | | | | | type | enum('function','aggregate') | NO | | NULL | | +-------+------------------------------+------+-----+---------+-------+ 4. 查看某个表的表结构(创建表时的详细结构) mysql> showshowshowshow createcreatecreatecreate tabletabletabletable func;func;func;func; |Table | CreateTable | | func | CREATETABLE `func` ( `name` char(64) collate utf8_bin NOTNULL default '', `ret` tinyint(1) NOTNULL default '0', `dl` char(128) collate utf8_bin NOTNULL default '', `type` enum('function','aggregate') character set utf8 NOTNULL, PRIMARYKEY(`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User defined functions' | +-------+---------------------------------------------------------------------------------------------------------------------- 5. 查看当前是哪个用户 mysql> selectselectselectselect user();user();user();user(); +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 6. 查看当前所在数据库 mysql> selectselectselectselect database();database();database();database(); +------------+ | database() | +------------+ | mysql | +------------+ 7. 创建一个新库 mysql> createcreatecreatecreate databasedatabasedatabasedatabase db1;db1;db1;db1; Query OK, 1 row affected (0.04 sec) 8. 创建一个表 mysql> createcreatecreatecreate tabletabletabletable t1t1t1t1 (((( `id``id``id``id` int(4),int(4),int(4),int(4), `name``name``name``name` char(40));char(40));char(40));char(40)); Query OK, 0 rows affected (0.02 sec) mysql> descdescdescdesc t1;t1;t1;t1; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | id | int(4) | YES | | NULL | | | name | char(40) | YES | | NULL | | +-------+----------+------+-----+---------+-------+ 9. 查看当前数据库版本 mysql> selectselectselectselect version();version();version();version(); +-----------+ | version() | +-----------+ | 5.0.86 | +-----------+ 10. 查看当前系统时间 mysql> selectselectselectselect current_date,current_date,current_date,current_date, current_time;current_time;current_time;current_time; +--------------+--------------+ | current_date | current_time | +--------------+--------------+ | 2011-05-31 | 08:52:50 | +--------------+--------------+ 11. 查看当前 mysql 的状态 mysql>mysql>mysql>mysql> showshowshowshow status;status;status;status; +-----------------------------------+----------+ | Variable_name | Value | +-----------------------------------+----------+ | Aborted_clients | 0 | | Aborted_connects | 1 | | Binlog_cache_disk_use | 0 | | Binlog_cache_use | 0 | | Bytes_received | 664 | | Bytes_sent | 6703 | 这个命令打出很多东西,显示你的 mysql 状态。 12. 查看mysql 的参数 mysql> showshowshowshow variables;variables;variables;variables; 很多参数都是可以在/etc/my.cnf 中定义的。 13. 创建一个普通用户并授权 mysql> grantgrantgrantgrant allallallall onononon *.**.**.**.* totototo user1user1user1user1 identifiedidentifiedidentifiedidentified bybybyby '123456';'123456';'123456';'123456'; Query OK, 0 rows affected (0.01 sec) all 表示所有的权限(读、写、查询、删除等等操作),*.*前面的*表示所有的数据库,后面 的*表示所有的表,identified by 后面跟密码,用单引号括起来。这里的 user1 指的是 localhost 上的user1,如果是给网络上的其他机器上的某个用户授权则这样: mysql> grantgrantgrantgrant allallallall onononon db1.*db1.*db1.*db1.* totototo 'user2'@'10.0.2.100''user2'@'10.0.2.100''user2'@'10.0.2.100''user2'@'10.0.2.100' identifiedidentifiedidentifiedidentified bybybyby '123456';'123456';'123456';'123456'; Query OK, 0 rows affected (0.00 sec) 用户和主机的 IP之间有一个@,另外主机 IP那里可以用%替代,表示所有主机。例如: mysql> grantgrantgrantgrant allallallall onononon db1.*db1.*db1.*db1.* totototo 'user3'@'%''user3'@'%''user3'@'%''user3'@'%' identifiedidentifiedidentifiedidentified bybybyby '123456';'123456';'123456';'123456'; Query OK, 0 rows affected (0.00 sec) 【一些常用的 sqlsqlsqlsql】 1. 查询语句 mysql> selectselectselectselect count(*)count(*)count(*)count(*) fromfromfromfrom mysql.user;mysql.user;mysql.user;mysql.user; mysql.user 表示mysql 库的user 表;count(*)表示表中共有多少行。 mysql> selectselectselectselect **** fromfromfromfrom mysql.db;mysql.db;mysql.db;mysql.db; 查询mysql 库的db表中的所有数据 mysql> selectselectselectselect dbdbdbdb fromfromfromfrom mysql.db;mysql.db;mysql.db;mysql.db; 查询mysql 库db表的db段。 mysql> selectselectselectselect **** fromfromfromfrom mysql.dbmysql.dbmysql.dbmysql.db wherewherewherewhere hosthosthosthost likelikelikelike '10.0.%';'10.0.%';'10.0.%';'10.0.%'; 查询mysql 库db表host 字段like 10.0.% 的行,这里的%表示匹配所有,类似于前面介绍的 通配符。 2. 插入一行 mysql> insertinsertinsertinsert intointointointo db1.t1db1.t1db1.t1db1.t1 valuesvaluesvaluesvalues (1,(1,(1,(1, 'abc');'abc');'abc');'abc'); Query OK, 1 row affected (0.00 sec) t1 表在前面已经创建过。 mysql> selectselectselectselect **** fromfromfromfrom db1.t1;db1.t1;db1.t1;db1.t1; +------+------+ | id | name | +------+------+ | 1 | abc | +------+------+ 3. 更改某一行 mysql> updateupdateupdateupdate db1.t1db1.t1db1.t1db1.t1 setsetsetset name='aaa'name='aaa'name='aaa'name='aaa' wherewherewherewhere id=1;id=1;id=1;id=1; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 这样就把原来 id为1的那行中的 name 改成’aaa’ 4. 删除表 mysql> dropdropdropdrop tabletabletabletable db1.t1;db1.t1;db1.t1;db1.t1; Query OK, 0 rows affected (0.01 sec) 5. 删除数据库 mysql> dropdropdropdrop databasedatabasedatabasedatabase db1;db1;db1;db1; Query OK, 0 rows affected (0.07 sec) 6. 备份与恢复库 mysqldump -uroot -p mysql >mysql.sql 这里的 mysqldump 就是备份的工具了,-p后面的 mysql 指的是 mysql 库,把备份的文件重定 向到mysql.sql。如果恢复的话,只要: mysql -uroot -p mysql < mysql.sql 关于MySQL 的基本操作笔者就介绍这么多,当然学会了这些还远远不够,希望你能够在你 的工作中学习到更多的知识,如果你对 MySQL 有很大兴趣,不妨深入研究一下,毕竟多学 点总没有坏处。如果想学跟多的东西请去查看 MySQL 官方中文参考手册(5.1) http://dev.mysql.com/doc/refman/5.1/zh/index.html。 第十九章 NFS NFS NFS NFS 服务配置 【什么是 NFSNFSNFSNFS】 NFS 会经常用到,用于在网络上共享存储。这样讲,你对NFS 可能不太了解,笔者不妨 举一个例子来说明一下 NFS 是用来做什么的。假如有三台机器 A、B、C,它们需要访问同一 个目录,目录中都是图片,传统的做法是把这些图片分别放到 A、B、C。但是使用 NFS 只需 要放到 A上,然后 A共享给 B和C即可。访问的时候,B和C是通过网络的方式去访问 A 上的那个目录的。 【配置NFSNFSNFSNFS】 NFS 配置起来还是蛮简单的,只需要编辑配置文件/etc/exports 即可。下面笔者先创建 一个简单的 NFS 服务器。 [root@localhost ~]# catcatcatcat /etc/exports/etc/exports/etc/exports/etc/exports /home/ 10.0.2.0/24(rw,sync,all_squash,anonuid=501,anongid=501) 这个配置文件就这样简单一行。共分为三部分,第一部分就是本地要共享出去的目录,第二 部分为允许访问的主机(可以是一个 IP也可以是一个 IP段)第三部分就是小括号里面的, 为一些权限选项。关于第三部分,笔者简单介绍一下: rw :读写; ro :只读; sync :同步模式,内存中数据时时写入磁盘; async :不同步,把内存中数据定期写入磁盘中; no_root_squash :加上这个选项后,root 用户就会对共享的目录拥有至高的权限控制,就 像是对本机的目录操作一样。不安全,不建议使用; root_squash :和上面的选项对应,root 用户对共享目录的权限不高,只有普通用户的权限, 即限制了 root; all_squash :不管使用 NFS 的用户是谁,他的身份都会被限定成为一个指定的普通用户身份; anonuid/anongid :要和 root_squash 以及 all_squash 一同使用,用于指定使用 NFS 的用户 限定后的 uid 和gid,前提是本机的/etc/passwd 中存在这个 uid 和gid。 介绍了上面的相关的权限选项后,再来分析一下笔者刚刚配置的那个/etc/exports 文件。 其中要共享的目录为/home,信任的主机为 10.0.2.0/24 这个网段,权限为读写,同步,限定 所有使用者,并且限定的 uid 和gid 都为501。 【使用NFSNFSNFSNFS】 当编辑完配置文件/etc/exports 后,就该启动 NFS 服务了。启动方法为: [root@localhost ~]# serviceserviceserviceservice portmapportmapportmapportmap start;start;start;start; serviceserviceserviceservice nfsnfsnfsnfs startstartstartstart NFS 是依托 portmap 的,所以首先要启动 portmap,然后启动 NFS 才能是刚才的配置生效。 启动完 NFS 后,就该使用 NFS 服务了。 [root@localhost ~]# showmountshowmountshowmountshowmount -e-e-e-e 127.0.0.1127.0.0.1127.0.0.1127.0.0.1 (用在 client 上) Export list for 127.0.0.1: /home 10.0.2.0/24 用shoumount -e 加IP就可以查看 NFS 的共享情况,上例中,就可以看到 127.0.0.1 的共享 目录为/home,信任主机为 10.0.2.0/24 这个网段。另外这个 showmount 命令还有一个常用 的选项就是-a了,它的意思是,把连接本机的 NFS 的client 全部列出。 [root@localhost ~]# mountmountmountmount -t-t-t-t nfsnfsnfsnfs 10.0.2.69:/home10.0.2.69:/home10.0.2.69:/home10.0.2.69:/home /mnt/mnt/mnt/mnt (client 上) [root@localhost ~]# showmountshowmountshowmountshowmount -a-a-a-a (nfs 服务器上) All mount points on localhost: 10.0.2.69:/home 前面的 mount 命令为挂载 NFS 共享目录,相信你能看懂这个格式。showmount -a 命令列出 所有的 clinet。 NFS 服务中还有一个常用的命令那就是 exportfs,它的常用选项为[-aruv]。 -a :全部挂载或者卸载; -r :重新挂载; -u :卸载某一个目录; -v :显示共享的目录; 使用exportfs 命令,当改变/etc/exports 配置文件后,不用重启 nfs 服务直接用这个 exportfs 即可。 [root@localhost ~]# catcatcatcat /etc/exports/etc/exports/etc/exports/etc/exports /tmp/ 10.0.2.0/24(rw,sync,no_root_squash) [root@localhost ~]# exportfsexportfsexportfsexportfs -arv-arv-arv-arv (nfs 服务器上) exporting 10.0.2.0/24:/tmp 更改目录后,直接 exportfs -arv 即可生效。 在上面使用到了 mount 命令来挂载 nfs,其实mount 这个nfs 服务还是有些说法的。首先是 用-t nfs 来指定挂载的类型为 nfs。另外在使用 nfs 时,常用一个选项就是 nolock 了,即在挂 载nfs 服务时,不加锁。 [root@localhost ~]# mountmountmountmount -t-t-t-t nfsnfsnfsnfs -o-o-o-o nolocknolocknolocknolock 10.0.2.69:/tmp10.0.2.69:/tmp10.0.2.69:/tmp10.0.2.69:/tmp /mnt//mnt//mnt//mnt/ [root@localhost ~]# showmountshowmountshowmountshowmount -a-a-a-a All mount points on localhost: 10.0.2.69:/home 10.0.2.69:/tmp 另外我们还可以把要挂载的 nfs 目录写到 client 上的/etc/fstab 文件中,挂载时只需要 mount -a即可。 [root@localhost ~]# catcatcatcat /etc/fstab/etc/fstab/etc/fstab/etc/fstab LABEL=/ / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 LABEL=SWAP-hda2 swap swap defaults 0 0 10.0.2.69:/tmp /mnt nfs nolock 0 0 写完/etc/fstab 文件后,只需要 mount -a即可挂载 nfs 服务的共享目录。 [root@localhost ~]# umountumountumountumount /mnt//mnt//mnt//mnt/ 首先把刚才挂载的 nfs 卸载掉 [root@localhost ~]# mountmountmountmount -a-a-a-a [root@localhost ~]# dfdfdfdf -h-h-h-h Filesystem Size Used Avail Use% Mounted on /dev/hda3 7.3G 3.7G 3.3G 53% / /dev/hda1 99M 12M 83M 12% /boot tmpfs 84M 0 84M 0% /dev/shm 10.0.2.69:/tmp 7.3G 3.7G 3.3G 53% /mnt 关于NFS 部分就讲这么多,内容并不多,相信你很快就能掌握! 第二十章 配置 ftp ftp ftp ftp 服务 【什么是 FTPFTPFTPFTP】 也许你对 FTP 不陌生,但是你是否了解 FTP 到底是个什么玩意?FTP 是File Transfer Protocol (文件传输协议)的英文简称,而中文简称为“文传协议”。用于 Internet 上的控制文件的 双向传输。同时,它也是一个应用程序(Application)。用户可以通过它把自己的 PC机与世 界各地所有运行 FTP 协议的服务器相连,访问服务器上的大量程序和信息。FTP 的主要作用, 就是让用户连接上一个远程计算机(这些计算机上运行着 FTP 服务器程序)察看远程计算机 有哪些文件,然后把文件从远程计算机上拷到本地计算机,或把本地计算机的文件送到远程 计算机去。FTP 用的比 NFS 更多,所以你一定要熟练配置它。 【配置ftpftpftpftp】 安装Redhat/CentOS 系统时也许你会连带着把 ftp 装上,系统默认带的 ftp 是vsftp,比较常 用,配置也很简单。但笔者常使用的 ftp 软件为 pure-ftpd。因为这个软件比 vsftp 配置起来 更加灵活和安全。下面是笔者配置 pure-ftpd 的过程: 下载最新的 pure-ftp 源码包 pure-ftpd-1.0.20.tar.bz2 # wget http://syslab.comsenz.com/downlo ... ftpd-1.0.21.tar.bz2 #tar jxvf pure-ftpd-1.0.20.tar.bz2 #cd pure-ftpd-1.0.20 ./configure \ "--prefix=/usr/local/pureftpd" \ "--without-inetd" \ "--with-altlog" \ "--with-puredb" \ "--with-throttling" \ "--with-largefile" \ "--with-peruserlimits" \ "--with-tls" \ "--with-language=simplified-chinese" #make && make install 起动 法一:用参数 /usr/local/pureftpd/sbin/pure-ftpd -S 21 -c 20 -C 1 -E-u 100 -R-t:800 -a 0 & -S 端口 -c 最大用户数 -C 线程数 -E Anonymous logins are prohibited -u Don't allow uids below to log in -R Disallow users (even non-anonymous ones) usage of the CHMOD command -t:800 下载800k,上传无限制 -a 0 除gid 0的组,限制用户再主目录。 法二:用配置文件 #mkdir /usr/local/pureftpd/etc #cd configuration-file #cp pure-ftpd.conf /usr/local/pureftpd/etc/pure-ftpd.conf #cp pure-config.pl /usr/local/pureftpd/sbin/pure-config.pl #chmod 755 /usr/local/pureftpd/sbin/pure-config.pl 启动命令: /usr/local/pureftpd/sbin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf 当然要修改配置文件,英文说明也不是很难。 下面是我的配置文件: ____________________________________ ChrootEveryone yes BrokenClientsCompatibility no MaxClientsNumber 50 Daemonize yes MaxClientsPerIP 8 VerboseLog no DisplayDotFiles yes AnonymousOnly no NoAnonymous no SyslogFacility ftp DontResolve yes MaxIdleTime 15 PureDB /usr/local/pureftpd/etc/pureftpd.pdb LimitRecursion 2000 8 AnonymousCanCreateDirs no MaxLoad 4 AntiWarez yes Umask 133:022 MinUID 100 AllowUserFXP no AllowAnonymousFXP no ProhibitDotFilesWrite no ProhibitDotFilesRead no AutoRename no AnonymousCantUpload no PIDFile /usr/local/pureftpd/var/run/pure-ftpd.pid MaxDiskUsage 99 CustomerProof yes #######接下来该建立用户了############### #/usr/local/pureftpd/bin/pure-pw useradd ftp_test -u www -d /data/wwwroot 其中,-u 将虚拟 用户 ftp_test 与系统用户 www 关联在一起。-d 参数使 ftp_test 只能访问其主目录。执行 完上述命令后,会提示输入密码。 #/usr/local/pureftpd/bin/pure-pw mkdb 另外提供一篇 vsftp 的应用作为参考: vsftp 利用mysql 验证虚拟账户 第二十一章 配置 squid squid squid squid 服务 【什么是 squidsquidsquidsquid】 Squid 是比较知名的代理软件,它不仅可以跑在 linux 上还可以跑在 windows 以及Unix 上,它的技术已经非常成熟。目前使用 Squid 的用户也是十分广泛的。Squid 与Linux 下其它 的代理软件如 Apache、Socks、TIS FWTK 和delegate 相比,下载安装简单,配置简单灵活, 支持缓存和多种协议。 Squid 的缓存功能相当好用,不仅可以减少带宽的占用,同样也大大降低了后台的 WEB 服务器的磁盘 I/O 的压力。Squid 接收用户的下载申请,并自动处理所下载的数据。也就是 说,当一个用户象要下载一个主页时,它向 Squid 发出一个申请,要 Squid 替它下载,然后 Squid 连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用 户申请同样的页面时,Squid 把保存的备份立即传给用户,使用户觉得速度相当快。 Squid 将数据元缓存在内存中,同时也缓存 DNS 查寻的结果,除此之外,它还支持非模 块化的 DNS 查询,对失败的请求进行消极缓存。Squid 支持SSL,支持访问控制。由于使用 了ICP,Squid 能够实现重叠的代理阵列,从而最大限度的节约带宽。 Squid 对硬件的要求是内存一定要大,不应小于 128M,硬盘转速越快越好,最好使用 服务器专用 SCSI 硬盘,处理器要求不高,400MH 以上既可。 【安装squidsquidsquidsquid】 wget http://mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/squid-2.6.STABLE20.tar.gz tar zxvf squid-2.6.STABLE20.tar.gz cd squid-2.6.STABLE20 ulimit -HSn 65535 useradd squid 编译参数 ./configure --prefix=/usr/local/squid \ --disable-dependency-tracking \ --enable-dlmalloc \ --enable-gnuregex \ --disable-carp \ --enable-async-io=240 \ --with-pthreads \ --enable-storeio=ufs,aufs,diskd,null \ --disable-wccp \ --disable-wccpv2 \ --enable-kill-parent-hack \ --enable-cachemgr-hostname=localhost \ --enable-default-err-language=Simplify_Chinese \ --with-build-environment=POSIX_V6_ILP32_OFFBIG \ --with-maxfd=65535 \ --with-aio \ --disable-poll \ --enable-epoll \ --enable-linux-netfilter \ --enable-large-cache-files \ --disable-ident-lookups \ --enable-default-hostsfile=/etc/hosts \ --with-dl \ --with-large-files \ --enable-removal-policies=heap,lru \ --enable-delay-pools \ --enable-snmp \ --disable-internal-dns make && make install 关于squid 的版本,有必要提一下,目前squid 最新版本已经到了 3.1 了,但是笔者认为 2.6 版本比较好用,如果你有兴趣可以研究一下 3.1。 【squid squid squid squid 配置】 编辑配置文件 /usr/local/squid/etc/squid.conf 把原来配置文件删除,替换成: http_port 80 transparent cache_replacement_policy lru #如果有多个(下面两行)缓存目录,则需要写这个参数 cache_dir aufs /cache1 8192 16 256 #缓存目录 1 /cache1 大小为 8G cache_dir aufs /cache2 4096 16 256 #缓存目录 2 /cache2 大小为 4G ## 上面两行定义了缓存目录,这个缓存目录可以只有一个,也可以定义很多个。 cache_mem 2048 MB#分配多少内存给 squid,建议留至少 512M 给系统,如果你是虚拟机 内存很小,只作为试验用的话,那就分一半内存给 squid maximum_object_size 2048 KB#缓存的文件最大不能超过 2M maximum_object_size_in_memory 512 KB#缓存在内存中的文件最大不超过 512k visible_hostname cache.example.com #显示给用户的主机名 client_persistent_connections off #client 端关闭长连接 server_persistent_connections on #server 端打开长连接 memory_pools on memory_pools_limit 1024 MB forwarded_for on log_icp_queries off cache_mgr cache@example.com #定义管理员的 mail 为cache@example.com via on httpd_suppress_version_string off cache_effective_user squid #定义以 squid 用户的身份运行 squid cache_effective_group squid error_directory /usr/local/squid/share/errors/Simplify_Chinese icon_directory /usr/local/squid/share/icons mime_table /usr/local/squid/etc/mime.conf ie_refresh off tcp_recv_bufsize 32 KB acl all src 0.0.0.0/0.0.0.0 acl localhost src 127.0.0.0/8 acl Mgr_ip src 127.0.0.0/8 acl allow_ip dst 127.0.0.0/8 192.168.0.0/16 #定义允许代理的 web 的IP或者IP段 acl PURGE method PURGE acl Safe_ports port 80 8080 acl CONNECT method CONNECT acl manager proto cache_object acl HTTP proto HTTP http_access allow allow_ip http_access allow manager Mgr_ip http_access deny manager http_access deny PURGE http_access deny !Safe_ports http_access deny all icp_access deny all ipcache_size 1024 ipcache_low 90 ipcache_high 95 memory_replacement_policy lru hosts_file /etc/hosts request_header_max_size 128 KB hierarchy_stoplist cgi-bin ?\.php \.html acl QUERY urlpath_regex cgi-bin \?\.php \.html cache deny QUERY quick_abort_min -1 KB quick_abort_max 32 KB quick_abort_pct 95 # error page #error_map http://www.discuz.net/error/404.html 403 #deny_info http://www.discuz.net/aaa.html cctv_Domain # timeout peer_connect_timeout 20 seconds connect_timeout 20 seconds read_timeout 60 seconds request_timeout 20 seconds pconn_timeout 20 seconds shutdown_lifetime 5 seconds strip_query_terms off icp_port 0 # logfile emulate_httpd_log on logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh #access_log /log/squid-log/access.log combined cache_store_log /dev/null cache_log /var/log/squid/cache.log logfile_rotate 12 #MISCELLANEOUS store_objects_per_bucket 15 client_db off 修改完配置文件后保存,然后初始化 squid mkdirmkdirmkdirmkdir /cache1/cache1/cache1/cache1 /cache2/cache2/cache2/cache2 /var/log/squid/var/log/squid/var/log/squid/var/log/squid chownchownchownchown -R-R-R-R squid:squidsquid:squidsquid:squidsquid:squid /cache1/cache1/cache1/cache1 /cache2/cache2/cache2/cache2 /var/log/squid/var/log/squid/var/log/squid/var/log/squid /usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid -z-z-z-z # 用来生成 cache 目录,如果你的配置文件配置出错,往往会在初始化的时候报错,错误信 息会直接显示在屏幕上。初始化成功后,就可以启动 squid 了,启动命令为: nohupnohupnohupnohup /usr/local/squid/bin/RunCache/usr/local/squid/bin/RunCache/usr/local/squid/bin/RunCache/usr/local/squid/bin/RunCache &&&& 启动后,可以去看看 cache.log 在这个日志中,你可以看到很多关于 squid 的信息,当然也 包括一些错误日志。 如果想开机启动则需要在/etc/rc.d/rc.local 中最后加入一行 /usr/local/bin/RunCache & 到这里算是配置完成了,但是还有一个问题,就是如何定义被代理的 web 以及域名?单单 看配置文件并没有说代理的 web 是哪一个。确实,这个配置文件其实可以代理多台 web, 只要你在/etc/hosts 中定义要代理的域名以及 IP即可,hosts 格式在前面已经介绍过。笔者 要提醒你的是,如果是一台 web 上的多个域名,请不要写一行,虽然hosts 是允许的,但是 如果写成一个 IP对应多个域名,squid 代理时就会出错。所以有几个域名就要写几行。更改 /etc/hosts 后要重启 squid 才能生效: /usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid -krec-krec-krec-krec 在重启前可以先检测一下,是否有错,命令为: /usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid/usr/local/squid/sbin/squid ––––kcheckkcheckkcheckkcheck 如果没有错,则不会显示任何信息,否则会显示一些信息出来。 另外希望你也要学一下其他几篇关于 squid 的文章: squid 优化及配置参数 squid 配置详解 squid 防盗链的设置 第二十二章 配置 TomcatTomcatTomcatTomcat 【关于TomcatTomcatTomcatTomcat】 目前有很多网站使用 jsp 的程序编写,所以解析 jsp 的程序就必须要有相关的软件来完成。 Tomcat 就是用来解析 jsp 程序的一个软件, Tomcat 是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共 同开发而成。因为 Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱 并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。 Tomcat 是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下 被普遍使用,是开发和调试 JSP 程序的首选。对于一个初学者来说,可以这样认为, 当在一台机器上配置好 Apache 服务器,可利用它响应对 HTML 页面的访问请求。实 际上Tomcat 部分是 Apache 服务器的扩展,但它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与 Apache 独立的进程单独运行的。 【安装TomcatTomcatTomcatTomcat】 Tomcat 的安装分为两个步骤:安装 JDK;安装 Tomcat。 JDK(Java Development Kit)是Sun Microsystems 针对Java 开发员的产品。自从 Java 推出以来, JDK 已经成为使用最广泛的 Java SDK。JDK 是整个 Java 的核心,包括了 Java 运行环境,Java 工具和 Java 基础的类库。所以要想运行 jsp 的程序必须要有 JDK 的支持,理所当然安装 Tomcat 的前提是安装好 JDK。 1.1.1.1. 安装JDKJDKJDKJDK 下载jdk-6u23-linux-i586.bin cd /usr/local/src/ wget http://mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/jdk-6u23-linux-i586.bin (如果该版本不合适请到下面的官方网站下载适合你的版本): https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/Vie wProductDetail-Start?ProductRef=jdk-6u23-oth-JPR@CDS-CDS_Developer chmod a+x jdk-6u23-linux-i586.bin sh jdk-6u23-linux-i586.bin 此时会出现 JDK 安装授权协议。可以一路按 Enter 浏览,当出现 Do you agree to the above license terms? [yes or no] 的字样,输入yes 即可。 mv jdk1.6.0_23 /usr/local/ 2.2.2.2. 设置环境变量 vim /etc/profile 在末尾输入以下内容 #set java environment JAVA_HOME=/usr/local/jdk1.6.0_23/ JAVA_BIN=/usr/local/jdk1.6.0_23/bin JRE_HOME=/usr/local/jdk1.6.0_23/jre PATH=$PATH:/usr/local/jdk1.6.0_23/bin:/usr/local/jdk1.6.0_23/jre/bin CLASSPATH=/usr/local/jdk1.6.0_23/jre/lib:/usr/local/jdk1.6.0_23/lib:/usr/local/jdk1.6.0_23/jre/li b/charsets.jar export JAVA_HOMEJAVA_BINJRE_HOMEPATHCLASSPATH 执行命令source /etc/profile,使配置立即生效 source /etc/profile 检测是否设置正确: java –version 如果显示如下内容,则配置正确。 java version "1.4.2" gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-46) Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESSFORAPARTICULARPURPOSE. 3.3.3.3.安装TomcatTomcatTomcatTomcat cd /usr/local/src/ wget http://mylinux.5d6d.com/userdirs/c/f/mylinux/attachments/apache-tomcat-7.0.14.tar.gz 如果觉得这个版本不适合你,请到 tomcat 官方网站下载适合你的版本。 tar zxvf apache-tomcat-7.0.14.tar.gz mv apache-tomcat-7.0.14 /usr/local/tomcat cp -p /usr/local/tomcat/bin/catalina.sh /etc/init.d/tomcat vim /etc/init.d/tomcat 在第二行加入以下内容: # chkconfig: 2345 63 37 # description: tomcat server init script JAVA_HOME=/usr/local/jdk1.6.0_23/ CATALINA_HOME=/usr/local/tomcat chmod 755 /etc/init.d/tomcat chkconfig --add tomcat chkconfig tomcat on 启动tomcat: service tomcat start 查看是否启动成功: ps aux |grep tomcat 如果有进程的话,请在浏览器中输入 http://IP:8080/ 你会看到 tomcat 的主界面。 【配置tomcattomcattomcattomcat】 在配置 tomcat 前,先来看看 tomcat 的几个目录: findfindfindfind /usr/local/tomcat//usr/local/tomcat//usr/local/tomcat//usr/local/tomcat/ -maxdepth-maxdepth-maxdepth-maxdepth 1111 -type-type-type-type dddd (-maxdepth 的作用指定目录级数,后边跟 1代 表只查找 1级目录) /usr/local/tomcat/ /usr/local/tomcat/lib # tomcat 的库文件目录 /usr/local/tomcat/temp # 临时文件存放目录 /usr/local/tomcat/webapps # web 应用目录,也就是我们访问的 web 程序文件所在目录 /usr/local/tomcat/conf # 配置文件目录 /usr/local/tomcat/logs # 日志文件所在目录 /usr/local/tomcat/work # 存放JSP 编译后产生的 class 文件 /usr/local/tomcat/bin # tomcat 的脚本文件 Tomcat 的主配置文件为/usr/local/tomcat/conf/server.xml 1.1.1.1. 配置tomcat tomcat tomcat tomcat 服务的访问端口。 默认是 8080,如果你想修改为 80,则需要修改 server.xml 文件。 找到 ,下一行插入新的,内容如下: 完成后,重启 tomcat service tomcat stop; service tomcat start 测试新建的虚拟主机,首先需要修改你电脑的 hosts 文件 vim /data/tomcatweb/test.jsp 加入以下内容:
Now time is: <%=new java.util.Date()%>
保存后,在你的浏览器里输入 http://www.example.cn/test.jsp 看是否访问到如下内容: Now time is: Thu Jun 02 14:32:34 CST 2011 上面的 test.jsp 就是要显示当前系统的时间。 更多关于 tomcat 的配置请点以下链接: 处理tomcat 不必要的日志 配置tomcat 的内置监控 配置tomcat 启动时的优化参数 配置tomcat 的进程数控制 配置tomcat 容器的 access.log 访问日志 Tomcat 配置集锦 第二十三章 配置 samba samba samba samba 服务器 以前我们在 windows 上共享文件的话,只需右击要共享的文件夹然后选择共享相关的选项 设置即可。然而如何实现 windows 和linux 的文件共享呢?这就涉及到了 samba 服务了,这 个软件配置起来也不难,使用也非常简单。 【samba samba samba samba 配置文件 smb.confsmb.confsmb.confsmb.conf】 一般你装系统的时候会默认安装 samba,如果没有安装,只需要运行这个命令安装(CentOS): “yum install -y samba samba-client” Samba 的配置文件为/etc/samba/smb.conf,通过修改这个配置文件来完成我们的各种需求。 打开这个配置文件,你会发现很多内容都用”#”或者”;”注视掉了。先看一下未被注释掉的部 分: [global] workgroup = MYGROUP server string = Samba Server Version %v security = user passdb backend = tdbsam load printers = yes cups options = raw [homes] comment = Home Directories browseable = no writable = yes [printers] comment = All Printers path = /var/spool/samba browseable = no guest ok = no writable = no printable = yes 主要有以上三个部分:[global], [homes], [printers]。 [global][global][global][global] 定义全局的配置,”workgroup”用来定义工作组,相信如果你安装过 windows 的系统, 你会对这个 workgroup 不陌生。一般情况下,需要我们把这里的”MYGROUP”改 成”WORKGROUP”(windows 默认的工作组名字)。 security = user #这里指定 samba 的安全等级。关于安全等级有四种: share:用户不需要账户及密码即可登录 samba 服务器 user:由提供服务的 samba 服务器负责检查账户及密码(默认) server:检查账户及密码的工作由另一台 windows 或samba 服务器负责 domain:指定 windows 域控制服务器来验证用户的账户及密码。 passdb backend = tdbsam # passdb backend (用户后台),samba 有三种用户后台: smbpasswd, tdbsam 和ldapsam. smbpasswd:该方式是使用 smb 工具smbpasswd 给系统用户(真实用户或者虚拟用户)设 置一个 Samba 密码,客户端就用此密码访问 Samba 资源。smbpasswd 在/etc/samba 中,有 时需要手工创建该文件。 tdbsam:使用数据库文件创建用户数据库。数据库文件叫 passdb.tdb,在/etc/samba 中。 passdb.tdb 用户数据库可使用 smbpasswd –a创建Samba 用户,要创建的 Samba 用户必须 先是系统用户。也可使用 pdbedit 创建Samba 账户。pdbedit 参数很多,列出几个主要的: pdbedit –a username:新建 Samba 账户。 pdbedit –x username:删除 Samba 账户。 pdbedit –L:列出 Samba 用户列表,读取 passdb.tdb 数据库文件。 pdbedit –Lv:列出 Samba 用户列表详细信息。 pdbedit –c “[D]”–u username:暂停该 Samba 用户账号。 pdbedit –c “[]”–u username:恢复该 Samba 用户账号。 ldapsam:基于LDAP 账户管理方式验证用户。首先要建立 LDAP 服务,设置“passdb backend = ldapsam:ldap://LDAP Server” load printers 和 cups options 两个参数用来设置打印机相关。 除了这些参数外,还有几个参数需要你了解: netbios name = MYSERVER# 设置出现在“网上邻居”中的主机名 hosts allow = 127. 192.168.12. 192.168.13. # 用来设置允许的主机,如果在前面加”;”则表 示允许所有主机 log file = /var/log/samba/%m.log #定义samba 的日志,这里的%m 是上面的 netbios name max log size = 50 # 指定日志的最大容量,单位是 K [homes][homes][homes][homes] 该部分内容共享用户自己的家目录,也就是说,当用户登录到 samba 服务器上时 实际上是进入到了该用户的家目录,用户登陆后,共享名不是 homes 而是用户自己的标识 符,对于单纯的文件共享的环境来说,这部分可以注视掉。 [printers][printers][printers][printers] 该部分内容设置打印机共享。 【samba samba samba samba 实践】 注意:在试验之前,请先检测 selinux 是否关闭,否则可能会试验不成功。关于如何关闭 selinux 请查看第十五章 linux 系统日常管理的“linux 的防火墙”部分 1.1.1.1. 共享一个目录,任何人都可以访问,即不用输入密码即可访问,要求只读。 打开samba 的配置文件/etc/samba/smb.conf [global]部分 把”MYGROUP”改成”WORKGROUP” 把” security = user” 修改为 “security = share” 然后在文件的最末尾处加入以下内容: [share] comment = share all path = /tmp/samba browseable = yes public = yes writable = no mkdir /tmp/samba chmod 777 /tmp/samba 启动samba 服务 /etc/init.d/smb start 测试: 首先测试你配置的 smb.conf 是否正确,用下面的命令 testparm 如果没有错误,则在你的 windows 机器上的浏览器中输入 file://IP/share 看是否能访问 2.2.2.2. 共享一个目录,使用用户名和密码登录后才可以访问,要求可以读写 打开samba 的配置文件/etc/samba/smb.conf [global] 部分内容如下: [global] workgroup = WORKGROUP server string = Samba Server Version %v security = user passdb backend = tdbsam load printers = yes cups options = raw 然后加入以下内容: [myshare] comment = share for users path = /samba browseable = yes writable = yes public = no 保存配置文件,创建目录: mkdir /samba chmod 777 /samba 然后添加用户。因为在[globa]中” passdb backend = tdbsam”,所以要使用” pdbedit” 来增加 用户,注意添加的用户必须在系统中存在。 useradd user1 user2 pdbedit -a user1 # 添加user1 账号,并定义其密码 pdbedit -a user2 pdbedit -L# 列出所有的账号 测试: 打开IE浏览器输入 file://IP/myshare/ 然后输入用户名和密码 3.3.3.3. 使用linux linux linux linux 访问samba samba samba samba 服务器 Samba 服务在 linux 下同样可以访问。前提是你的 linux 安装了 samba-client 软件包。安装完 后就可以使用 smbclient 命令了。 smbclient //IP/共享名 -U 用户名 如:[root@localhost]# smbclientsmbclientsmbclientsmbclient //10.0.4.67/myshare///10.0.4.67/myshare///10.0.4.67/myshare///10.0.4.67/myshare/ -U-U-U-U user1user1user1user1 Password: Domain=[LOCALHOST] OS=[Unix] Server=[Samba 3.0.33-3.29.el5_6.2] smb: \> 出现如上所示的界面。可以打一个”?”列出所有可以使用的命令。常用的有 cd, ls, rm, pwd, tar, mkdir, chown, get, put 等等,使用 help + 命令可以打印该命令如何使用,其中 get 是下载, put 是上传。 另外的方式就是通过 mount 挂载了: 如: mountmountmountmount -t-t-t-t cifscifscifscifs //10.0.4.67/myshare//10.0.4.67/myshare//10.0.4.67/myshare//10.0.4.67/myshare /mnt/mnt/mnt/mnt -o-o-o-o username=user1,password=123456username=user1,password=123456username=user1,password=123456username=user1,password=123456 格式就是这样,要指定-t cifs //IP/共享名 本地挂载点 -o后面跟 username 和 password 挂载完后就可以像使用本地的目录一样使用共享的目录了。 第二十四章 使用 Nagios Nagios Nagios Nagios 搭建监控服务器 【关于NagiosNagiosNagiosNagios】 Nagios 是一款用于监控系统和网络的开源应用软件,它的模式是服务器—客户端,也就 是说首先要在在一台服务器上(server)部署相应的主要套件,然后在要监控的服务器上部 署客户端程序,这样 server 会和client 通信,从而监控 client 端的各项资源。Nagios 功能十 分强大几乎所有的项目都可以监控,大到服务器的存活状态,小到服务器上的某一个服务 (web)。这些功能都是通过自定义插件(或者叫做脚本)来实现。 当Nagios 监控到某项资源发生异常会通知到用户,你可以接入手机短信接口也可以接 入邮件接口。我们可以通过 web 页面来查看 Nagios 所监控的各项资源,默认搭建的 Nagios 服务器只能监控简单的几个项目,而其他服务之类的监控项目都是由我们自己开发的插件来 实现的。 【需要下载的软件】 nagios-3.0.5 nagios-plugins-1.4.13 nrpe-2.12.tar.gz apache-2.2.11 // 以上软件版本可以不一样 【监控中心 Server Server Server Server 端的配置】 1. 安装apache (略,请参考第 15 章中相关内容,只需安装到后边再配置) 2. 建立nagios 账户 useradd nagios 3. 下载软件 cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/nagios-3.0.5.tar.gz wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz wget http://syslab.comsenz.com/downloads/linux/nrpe-2.12.tar.gz 4. 编译安装 nagios cd /usr/local/src/ tar zxvf nagios-3.0.5.tar.gz cd nagios-3.0.5 ./configure --prefix=/usr/local/nagios make all make install make install-init # 把nagios 做成一个运行脚本,使 nagios 随系统开机启动 make install-config # 把配置文件样例复制到 nagios 的安装目录 make install-commandmode # 给外部命令访问 nagios 配置文件的权限 chown -R nagios:nagios /usr/local/nagios 5. 编译安装 nagios-plugins cd /usr/local/src/ tar zxvf nagios-plugins-1.4.13.tar.gz cd nagios-plugins-1.4.13 ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios make && make install 查看是否安装成功的方法是: ls /usr/local/nagios/libexec/ 看这个目录下是否有插件文件 6. 安装nrpe cd /usr/local/src/ tar zxvf nrpe-2.12.tar.gz cd nrpe-2.12 ./configure --enable-ssl --enable-command-args make all make install-plugin make install-daemon make install-daemon-config 7. 配置web 接口 vim /usr/local/apache2/conf/httpd.conf 在最后加入以下内容: ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin AllowOverride AuthConfig Options ExecCGI Order allow,deny Allow from all Alias /nagios/ /usr/local/nagios/share/ Options None AllowOverride AuthConfig Order allow,deny Allow from all 8. 配置nagios cd /usr/local/nagios/etc/ vim cgi.cfg 把 use_authentication=1 改成 use_authentication=0 意思是不用用户验证 9. 启动nagios 在启动前先检测一下: /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 如果最后显示如下,则说明配置没有问题了。 Total Warnings: 0 Total Errors: 0 启动命令: /etc/init.d/nagios start 或者: /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg 此时,就可以访问 web 页面的 nagios 了,在浏览器中输入: http://IP/nagios/ 看看吧。 【在要监控的机器上 client client client client 部署nagiosnagiosnagiosnagios】 如果你打开了 web 页面,点击左栏的 Host Detail 会在右栏看到一行数据,其中 Host 名为 “localhost”,Status 显示为”up”,并且显示为绿色,如果是其他颜色就说明你的 localhost 出 了问题。目前只有一行数据,也就是说只监控了监控中心(localhost)一台主机,那么如何 添加其他机器被它监控呢?这就需要在要被监控的机器上也部署 nagios 软件。 1. 添加账户 useradd nagios 2. 安装nrpe cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/nrpe-2.12.tar.gz tar zxvf nrpe-2.12.tar.gz cd nrpe-2.12 ./configure --enable-ssl --enable-command-args make all make install-plugin make install-daemon make install-daemon-config 3. 安装nagios-plugin cd /usr/local/src/ wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz tar zxvf nagios-plugins-1.4.13.tar.gz cd nagios-plugins-1.4.13 ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-group=nagios make && make install 到此就算安装完成了,请查看/usr/local/nagios/目录下是否有四个目录分别为:bin etc libexec share 另外在 libexec 目录下会有很多 check_开头的文件。如果你的机器上没有,就 请重新安装吧。 4. 配置 vim /usr/local/nagios/etc/nrpe.cfg 找到”allowed_hosts=127.0.0.1” 改成 “allowed_hosts=127.0.0.1,10.0.4.67” // 后边的 IP是server 的IP 找到” dont_blame_nrpe=0” 改成 “dont_blame_nrpe=1” 5. 启动nrpe /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d 【在监控中心添加被监控主机】 添加主机当然是要到 server 端(监控中心)修改配置文件了。 1. 修改主配置文件 cd /usr/local/nagios/etc/ vim nagios.cfg 增加内容: cfg_dir=/usr/local/nagios/etc/services ##定义一个目录,以后把新增加的主机信息文件全部 放到这里 2. 添加被监控主机信息 mkdir /usr/local/nagios/etc/services cd /usr/local/nagios/etc/services vim 10.0.4.56.cfg 加入如下内容: define host{ use linux-server host_name 10.0.4.56 alias 10.0.4.56 address 10.0.4.56 } define service{ use generic-service host_name 10.0.4.56 service_description check_ping check_command check_ping!100.0,20%!200.0,50% max_check_attempts 5 normal_check_interval 1 } define service{ use generic-service host_name 10.0.4.56 service_description check_ssh check_command check_ssh max_check_attempts 5 normal_check_interval 1 } define service{ use generic-service host_name 10.0.4.56 service_description check_http check_command check_http max_check_attempts 5 normal_check_interval 1 } // 注意,这里的 IP是client 端的IP,监控的项目有三个 ping, ssh, http。其实这三个项目使 用的脚本都为本地脚本,也就是说,即使远程主机没有安装 nagios 和nrpe 同样可以监控这 些项目。但是如果想监控 load,disk,等等就需要通过 nrpe 服务来搞定了,道理很简单,load 和disk 都需要登录到远程主机上去获得信息,而 ping,ssh,http 都不需要的。这个到远程 主机获取相关的信息的过程是由 nrpe 完成的。如果你的 client 上没有启动 nrpe 服务那么我 们是无法获取远程主机的 load 和disk 等信息的。下面笔者配置一下使用 nrpe 来监控远程主 机的相关项目。 在server 端编辑/usr/local/nagios/etc/objects/commands.cfg vim /usr/local/nagios/etc/objects/commands.cfg # 在最后面添加如下内容 define command{ command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ } 然后编辑 10.0.4.56.cfg (还是 server 上) cd /usr/local/nagios/etc/services vim 10.0.4.56.cfg # 加入如下内容: define service{ use generic-service host_name 10.0.4.56 service_description check_load check_command check_nrpe!check_load max_check_attempts 5 normal_check_interval 1 } define service{ use generic-service host_name 10.0.4.56 service_description check_disk_hda1 check_command check_nrpe!check_hda1 max_check_attempts 5 normal_check_interval 1 } define service{ use generic-service host_name 10.0.4.56 service_description check_disk_hda2 check_command check_nrpe!check_hda2 max_check_attempts 5 normal_check_interval 1 } // 这里需要解释一下相关的”check_command”, 先看这个” check_nrpe!check_load” 这里的 check_nrpe 就是上面/usr/local/nagios/etc/objects/commands.cfg 中刚刚定义的,后面的 check_load 是在远程主机上定义的一个命令脚本。具体在哪里定义稍后介绍。为什么中间加 一个”!”,这个是 nagios 特有的形式,无需关心。下面需要到远程主机上去定义上面用到的 脚本了。 在远程主机上编辑/usr/local/nagios/etc/nrpe.cfg 文件 vim /usr/local/nagios/etc/nrpe.cfg (client 上) 把” command[check_hda1]”那行改成: command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1 然后再增加一行: command[check_hda2]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda2 // 这里的 check_hda1 和 check_hda2 都是自定义的,和 server 端的定义的 service 中的 check_command 对应。也就是说,如果在 server 端定义了一个 service(通过 nrpe 方式)那 么必须要在客户端上的 nrpe.cfg 中定义相应的脚本。保存这个文件后,需要重新启动一下 nrpe 服务。 killall nrpe ;/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d (client 上) 3. 重启nagios 服务 修改了配置需要重启服务才能使添加的监控主机生效。 /etc/init.d/nagios restart (server 上) 此时再到 web 页面去观察是否多了一台 10.0.4.56 【在nagios nagios nagios nagios 客户端上自定义监控脚本】 在开始,笔者就讲过,我们可以自定义写监控脚步,从上面的例子中也可以看到监控磁盘状 态时,是根据磁盘分区来监控的。这样不免有些麻烦,因为每台主机的磁盘分区状况都不一 样(一样还好),而且有多少个分区就需要定义多少个命令。所以笔者就自定义写一个 shell 脚本来监控所有的磁盘分区: 1. 在客户端上创建脚本/usr/local/nagios/libexec/check_disk.sh vim /usr/local/nagios/libexec/check_disk.sh 写入如下内容:(client 上) #!/bin/bash row=`df -h -P|wc -l` status=0 for i in `seq 2 $row` do spare=`df -h -P|sed -n "$i"p|awk '{print $4}'` use_percentage=`df -h -P|sed -n "$i"p|sed -n "s/\%//"p|awk '{print $5}'` spare_percentage=`expr 100 - $use_percentage` partition_name=`df -h -P|sed -n "$i"p|awk '{print $6}'` if ["$spare_percentage" -lt "3" ];then echo -n "$partition_name CRITICAL ${spare_percentage}% $spare " status[$i]=2 elif ["$spare_percentage" -lt "5" ];then echo -n "$partition_name WARNING! ${spare_percentage}% $spare " status[$i]=1 else echo -n "$partition_name OK ${spare_percentage}% $spare " status[$i]=0 fi done zhuangtai=0 for j in `seq 2 $row` do if ["${status[$j]}" -gt "$zhuangtai" ];then zhuangtai=${status[$j]} fi done exit $zhuangtai 2. 保存后,修改该脚本的权限 chmod +x /usr/local/nagios/libexec/check_disk.sh (client 上) 3. 然后编辑/usr/local/nagios/etc/nrpe.cfg 文件 vim /usr/local/nagios/etc/nrpe.cfg # 加入一行:(client 上) command[check_disk]=/usr/local/nagios/libexec/check_disk.sh 保存,重启 nrpe 服务 killall nrpe ;/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d (client 上) 4. 检测刚才的脚本是否正常运行的方法是,到 server 端执行如下命令: /usr/local/nagios/libexec/check_nrpe -H 10.0.4.56 -c check_disk (server 上) 如果正常的话,会输出一行磁盘检测的数据,否则可能会报错。 5. 到server 上添加相应的 service cd /usr/local/nagios/etc/services (server 上) vim 10.0.4.56.cfg # 加入如下内容: define service{ use generic-service host_name 10.0.4.56 service_description check_disk check_command check_nrpe!check_disk max_check_attempts 5 normal_check_interval 1 } 6. 重启nagios 服务 /etc/init.d/nagios restart (server 上) 【配置nagios nagios nagios nagios 报警邮件】 现在139 邮箱有顺便发短信的功能,所以当有报警时,只需发送到你的 139 邮箱你就同样会 收到一条报警短信。这样做的优势就是不用再去买短信网关了,节省了很大一笔钱。 vim /usr/local/nagios/etc/objects/contacts.cfg 把” email nagios@localhost” 修改成 “email 你的139 邮箱” vim /usr/local/nagios/etc/objects/templates.cfg 找到: define service{ name generic-service 之所以看这一段,是因为在上面添加的 10.0.4.56.cfg 定义了很多 generic-service 所以要关注 这段的配置。 define service{ name generic-service active_checks_enabled 1 passive_checks_enabled 1 parallelize_check 1 obsess_over_service 1 check_freshness 0 notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 failure_prediction_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 is_volatile 0 check_period 24x7 max_check_attempts 3 normal_check_interval 10 retry_check_interval 2 ontact_groups admins notification_options w,u,c,r notification_interval 60 notification_period 24x7 register 0 } 其中有几个参数需要你注意: notifications_enabled : 是否开启提醒功能。1为开启,0为禁用。一般,这个选项会在主配 置文件(nagios.cfg)中定义,效果相同。 notification_interval: 重复发送提醒信息的最短间隔时间。默认间隔时间是 60 分钟。如果这 个值设置为 0,将不会发送重复提醒。 notification_period: 发送提醒的时间段。非常重要的主机(服务)我定义为 7×24,一般的 主机(服务)就定义为上班时间。如果不在定义的时间段内,无论什么问题发生,都不会发 送提醒。 notification_options: 这个参数定义了发送提醒包括的情况:d = 状态为 DOWN, u = 状态为 UNREACHABLE, r = 状态恢复为 OK, f = flapping。,n=不发送提醒。 要想正确发送邮件,上面的参数得配置合理才行。 第二十五章 使用 bind bind bind bind 搭建 DNS DNS DNS DNS 服务器 【什么是 DNSDNSDNSDNS】 简单一句话,DNS 的功能就是把域名解析成 IP。目前我们使用的 IP都是IPv4 是由三个点分 成的四个数字,可以这样说,世界上的每一个 IP都是唯一的(私网IP除外),我们可以通过 IP去找到相应的主机,这么多 IP我们肯定记不住,所以就产生了域名这个概念。域名就好 记多了,通过域名我们如何找到相应的主机 IP,所以 DNS 服务就产生了。关于更多的 DNS 介绍可以去网上搜一下,你会得到更多的信息。下面简单说下 DNS 查询分类和 DNS 服务分 类。 DNS DNS DNS DNS 查询分为: 1. 递归查询: 即客户端向本地 DNS 服务器请求查询域名,本地 DNS 服务器收到查询任务 后如自身无法回答则向其他服务器查询,直到查到结果后返回结果给客户端。期间 DNS 服 务器可能要查询很多其他 DNS 服务器。 2. 迭代查询:即客户端向本地服务器请求查询域名,本地 DNS 服务器无法回答,则给客户 端返回另一个能查询域名的服务器地址,客户端再向另一服务器查询,期间可能客户端需查 询多个 DNS 服务器,最终查到结果。 DNS DNS DNS DNS 服务器分为: 1. master(主DNS 服务器):拥有区域数据的文件,并对整个区域数据进行管理。 2.slave(从服务器或叫辅助服务器):拥有主 DNS 服力器的区域文件的副本,辅助主 DNS 服务 器对客户端进行解析,当主 DNS 服务器坏了后,可以完全接替主服务器的工作。 3. forward:将任何查询请求都转发给其他服务器。起到一个代理的作用。 4. cache:缓存服务器。 5. hint:根DNS internet 服务器集。 【DNS DNS DNS DNS 服务器的搭建】 目前搭建 DNS 服务最流行的软件当属 Bind。Bind 是一款开放源码的 DNS 服务器软件,Bind 由美国加州大学 Berkeley 分校开发和维护的,全名为 Berkeley Internet Name Domain 它是目 前世界上使用最为广泛的 DNS 服务器软件,支持各种 unix 平台和 windows 平台。下面笔者 将带着你一起在 linux 平台上搭建 DNS 服务。 1. 下载bind cd /usr/local/src wget http://ftp.isc.org/isc/bind9/9.7.3-P1/bind-9.7.3-P1.tar.gz 如果未能下载请到 http://www.isc.org/products/BIND/ 下载你想要的版本 2. 编译安装 tar zxvf bind-9.7.3-p1.tar.gz cd bind-9.7.3-p1 ./configure --prefix=/usr/local/named --enable-threads make && make install 3. 配置bind cd /usr/local/named ./sbin/rndc-confgen > etc/rndc.conf #从rcdc.conf 文件中提取 named.conf 用的key cd etc ; tail rndc.conf |head -9 |sed 's/#//g' >named.conf # 上面的命令是,自动生成 named.conf 文件 mkdir /var/named ; cd /var/named vim localhost.zone #写入如下内容: $TTL 86400 $ORIGIN localhost. @ 1D INSOA@ root ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ); minimum 1D INNS@ 1D INA 127.0.0.1 vim named.local #写入如下内容: $TTL 86400 @INSOA localhost. root.localhost. ( 1997022700 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ); Minimum INNS localhost. 1 INPTR localhost. dig > named.root * 建立test1.com 正向解析文件 vim test1.zone #写入: $ttl 1D @INSOA test1.com. root.test1.com. ( 1053891162 3H 15M 1W 1D ) INNS test1.com. INMX 5 test1.com. www INA 10.0.100.100 * 建立test1.com 反向解析文件 vim test1.local # 写入: $TTL 86400 @INSOA test.com. root.test.com.( 20031001; 7200; 3600; 43200; 86400); @INNS test1.com. 82 INPTR dns.test1.com. vim named.conf # 写入: options { directory "/var/named"; #named 区文件目录 pid-file "named.pid"; #进程id文件名 }; controls { inet 127.0.0.1 allow { localhost; } keys { rndckey; }; }; zone "."IN{ type hint; file "named.root"; }; zone "localhost" IN{ type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN{ type master; file "named.local"; allow-update { none; }; }; zone "test1.com" IN{ type master; file "test1.zone"; allow-update { none; }; }; zone "19.202.220.in-addr.arpa" IN{ type master; file "test1.local"; allow-update { none; }; };
还剩204页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

523382041

贡献于2018-01-29

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf