企业 Linux 系统的运维成为目前企业关注的重点。作为一种优秀的开源网络操作系统,如何充分利用 Linux 的工具并使用相应的方法来提高运维效率是非常重要的工作。本专题将详细介绍几个对系统管理员比较重要的工具和概念,它涵盖了操作硬盘分区、如何避免产生问题以及如何解决系统问题的内容,以为企业 Linux 的实际运维提供有益参考。
应用工具一:应用parted 报告并分区硬盘
parted(分区编辑器)实用程序从命令行报告和操作硬盘分区。palimpsest 实用程序使用 GUI 执行相同的任务。此外,parted print 命令会显示 /dev/sda 驱动器上的分区信息:
- # parted /dev/sda print
- Model: ATA Hitachi HDS12345 (scsi)
- Disk /dev/sda: 165GB
- Sector size (logical/physical): 512B/512B
- Partition Table: msdos
- Number Start End Size Type File system Flags
- 1 32kB 1045MB 1045MB primary ext4 boot
- 2 1045MB 12GB 10GB primary ext4
- 3 12GB 22GB 10GB primary ext4
- 4 22GB 165GB 143GB extended
- 5 22GB 23GB 1045MB logical linux-swap(v1)
- 6 23GB 41GB 18GB logical ext4
- 7 41GB 82GB 41GB logical ext4
在这个例子中,parted 显示的前几行表示型号名称、设备名称、设备容量以及设备上的分区表类型。在这些信息之后,print 命令还会显示一些列,用户可以根据提示来进行操作。
Number 列表示持有该分区的设备的次设备号。这个数字与设备名称中的***的数字相同。在这个例子中,5 对应 /dev/sda5。
Start 列表示分区开始所在的磁盘位置。Parted 实用程序指定一个磁盘位置作为从磁盘开始到分区的距离(以字节为单位)。因此,分区 3 始自从磁盘开始的 12 GB 的位置。
End列表示分区结束所在的磁盘位置。虽然分区 2 结束自从磁盘开始的 12 GB 的位置,分区 3 始自同一位置,parted 需要注意的是单个字节不能在分区间重叠。
Size列表示分区以千字节(KB)、兆字节(MB)或千兆字节(GB)为单位的大小。
Type 列表示分区类型:主、扩展或逻辑。参见图 1 的分区信息。
File system 列表示文件系统类型:ext2、ext3、ext4、fat32、linux-swap 等等。
Flags 列是分区打开标志,包括 boot、raid和 lvm。在这个例子中,1 号分区是引导分区。
图 1. 例子中的主分区和扩展分区
在前面的例子中,分区 4 定义了一个扩展分区,其中包含 165GB 磁盘中的 143 GB(如图 1)。使用时不能更改逻辑分区,否则会影响其中的所有逻辑分区。
除了报告硬盘的布局和大小,还可以采用交互式方式使用 parted 修改磁盘布局。当使用这种方式时要格外小心,开始使用此实用工具之前必需先备份系统。注意更改磁盘上的分区信息(分区表)会破坏磁盘上的信息。请先阅读 parted 信息页,然后再尝试修改分区表。值得注意的是:错误的 parted 使用可以摧毁磁盘上的一切数据。
使用 parted 要小心,因为你是在使用一个可以格式化硬盘的实用程序。使用 parted 所做的更改很容易导致大量数据的丢失。如果使用 parted 所做的事情有任何问题,在应用其更改之前使用 q 命令退出。输入命令后,parted 会立即依据要求进行更改。
要对磁盘进行分区时,在 parted 命令后需要加上要使用的设备名称。在下面的例子中,启动 parted 后,用户输入 help(或只是 h)命令,会显示 parted 命令列表:
- # parted /dev/sda
- GNU Parted 2.3
- Using /dev/sda
- Welcome to GNU Parted! Type 'help' to view a list of commands.
- (parted) help
- align-check TYPE N check partition N for TYPE(min|opt) alignment
- check NUMBER do a simple check on the file system
- cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER copy file system to another partition
- help [COMMAND] print general help, or help on COMMAND
- mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
- mkfs NUMBER FS-TYPE make a FS-TYPE file system on partition NUMBER
- mkpart PART-TYPE [FS-TYPE] START END make a partition
- mkpartfs PART-TYPE FS-TYPE START END make a partition with a file system
- move NUMBER START END move partition NUMBER
- name NUMBER NAME name partition NUMBER as NAME
- print [devices|free|list,all|NUMBER] display the partition table,
- available devices, free ...
- quit exit program
- rescue START END rescue a lost partition near START and END
- resize NUMBER START END resize partition NUMBER and its file system
- rm NUMBER delete partition NUMBER
- select DEVICE choose the device to edit
- set NUMBER FLAG STATE change the FLAG on partition NUMBER
- toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
- unit UNIT set the default unit to UNIT
- version display the version number and copyright information of ...
- (parted)
Help 后边跟上一个 parted 命令参数的名称,则会显示该命令参数的更多信息。当输入 print(或只是 p)命令时,parted 显示当前分区信息,就像命令行上的 print 命令一样。
parted 实用程序不允许设置重叠分区(除逻辑分区可以重叠其包含的扩展分区外)。同样,也不允许创建一个正好始自磁盘开头(柱面 0)的分区。这些情况都会导致数据丢失。
定义一个磁盘分区表时,要记住一些基本的准则。首先,不要删除或修改定义扩展分区的分区,除非你愿意失去扩展分区内所有逻辑分区上的所有数据。其次,如果把 /boot 放在单独的分区上,***放在驱动器开头的位置(分区 1),以便 Linux 可以从位于驱动器最近的分区引导。当磁盘空间的费用不是问题时,***把每个主要文件系统放在单独的分区上。许多人选择把 /(根), /var 和 /usr 合放在一个单独的分区中,这通常会节省空间,但在偶尔情况下也会导致问题。***,虽然 parted 可以创建某些类型的文件系统,但 parted 通常是用来创建分区,然后可使用 mkfs 和 mkswap 在分区上创建文件系统。
以下命令序列(图 2)在一个干净的磁盘上定义了一个 300 兆字节、可引导的 Linux 分区,并将其作为分区 1:
图 2. 定义可引导 Linux 分区的命令序列
当在 parted 内指定大小时,可以使用后缀 k(千字节)、m(兆字节)或 g(千兆字节)。创建分区后,输入 print 命令来查看分区的结束位置。执行这个任务之前要先定义下一个相邻的分区,这样就不会浪费空间。设置所有分区后,使用 quit 命令可退出 parted。
接下来,在每个要包含文件系统(非交换)的分区上创建文件系统。除非有理由不这样做,否则除了交换分区外,请把所有分区设置为 ext4 类型。使用 mkswap 可在一个分区上设立一个交换区。此外,可以使用 e2label 标记一个分区。#p#
应用工具二:应用 logrotate 管理日志文件
你可能想保留日志文件一段时间,而不是删除或截断这些文件,以防万一需要时进行参考。通过轮换、压缩、发邮件以及删除指定的每个文件,logrotate 实用工具可以自动管理系统日志(和其它)文件。logrotate 实用程序由 /etc/logrotate.conf 文件控制,该文件用于设置默认值,可以指定要轮换的文件。通常情况下,logrotate.conf 包含一个 include 语句,指向实用程序指定的 /etc/logrotate.d 中的规范文件。以下是默认的 logrotate.conf 文件:
- $ cat /etc/logrotate.conf
- # see "man logrotate" for details
- # rotate log files weekly
- weekly
- # keep 4 weeks worth of backlogs
- rotate 4
- # create new (empty) log files after rotating old ones
- create
- # use date as a suffix of the rotated file
- dateext
- # uncomment this if you want your log files compressed
- #compress
- # RPM packages drop log rotation information into this directory
- include /etc/logrotate.d
- # no packages own wtmp and btmp -- we'll rotate them here
- /var/log/wtmp {
- monthly
- create 0664 root utmp
- minsize 1M
- rotate 1
- }
- /var/log/btmp {
- missingok
- monthly
- create 0600 root utmp
- rotate 1
- }
- # system-specific logs may be also be configured here.
logrotate.conf 文件为常用的参数设置默认值。每当 logro-tate 读取这些参数的另一个值时,则会重置默认值。可以选择 daily(每天)、weekly(每周)或 monthly(每月)轮换文件。rotate关键字后面的数字指定要保留的被轮换日志文件数量。create 关键字会使 logrotate 创建一个新的日志文件,并与新轮换的日志文件具有相同的名称和属性。dateext 关键字导致 logrotate 使用日期作为文件扩展名。compress 关键字(默认文件中被注释掉)导致日志文件由 gzip 压缩。include 关键字为具体程序的 logrotate 规范文件指定标准 /etc/logrotate.d 目录。当使用 rpm 或基于 rpm 的实用程序安装一个程序时,rpm 把 logrotate 规范文件放在该目录中。
logrotate.conf 中的***指令集会处理 /var/log/wtmp 和 /var/log/btmp 日志文件(wtmp 保存登录记录,而 btmp 保存失败的登录尝试记录);可以查看这些使用 who 的文件。missingok 关键字只覆盖这个文件的隐含默认值 nomissingok,此关键字导致 logrotate 继续运行,即使日志文件丢失也不会发出错误消息。关键字 monthly 只覆盖这个文件的默认值 weekly。create 关键字后面紧跟为新文件建立权限、所有者和组的参数。***的 rotate则建立应保留的轮换日志文件。
/etc/logrotate.d/httpd 文件是实用程序 logrotate 规格文件的一个例子:
- $ cat /etc/logrotate.d/httpd
- /var/log/httpd/*log {
- missingok
- notifempty
- sharedscripts
- delaycompress
- postrotate
- /sbin/service httpd reload > /dev/null 2>/dev/null || true
- endscript
- }
这个文件由 httpd 软件包安装脚本安装,通过 logrotate.conf 中的 include 语句放入 /etc/logrotate.d 中,并使用 /var/log/httpd 中文件名以 log (*log) 结尾的每个文件。如果日志文件是空的,notifempty 关键字导致 logrotate 不轮换日志文件,而是重写空的日志文件。sharedscripts 关键字导致 logrotate 仅执行一次 prerotate 和 postrotate 节的命令,而不是为每个轮换的日志文件执行一次。delaycompress 关键字会导致 logrotate 延迟一个周期压缩。copytruncate 关键字没有出现在这个例子中,它会导致 logrotate 复制后立即截断原来的日志文件,这个关键字对于无法关闭并重新打开日志文件的程序非常有用,因为这些程序可能会在原始文件已被移动的情况下,继续写入原始文件。在轮换开始前,logrotate 实用工具会执行 prerotate 和 endscript 之间的命令。同样,轮换完成后,会执行 postrotate 和 endscript 之间的命令。
logrotate 实用工具使用很多关键字,其中许多带有参数,而且有其它作用。详细信息请参阅 logrotate 手册页。#p#
应用工具三:应用 rsyslogd 记录系统消息
传统上,UNIX 程序会发送日志消息到标准错误。如果需要更***的日志,则会把输出重定向到一个文件。为了克服上述方法的局限性,4.3BSD 引进了目前 Linux 使用的系统日志守护进程(rsyslogd; www.rsyslog.com)。这个守护进程负责监听日志消息,并把它们存储在 /var/log 目录中。除了提供日志记录功能,rsyslogd 还允许一台机器作为日志库服务于网络,并允许其它程序来处理特定的日志消息。
/etc/rsyslog.conf 文件存储 rsyslogd 的配置信息。这个文件中的每一行都包含一个或多个由空格分隔的选择器(selector)和一个动作(action)。选择器定义消息的来源和类型,动作(action)则指定 rsyslogd 如何处理消息。rsyslog.conf 示例行如下(# 开始一个注释):
- # Log all kernel messages to the console.
- kern.* /dev/console
- # Log all the mail messages in one place.
- mail.* /var/log/maillog
- # Log cron stuff
- cron.* /var/log/cron
- # Everybody gets emergency messages
- *.emerg *
- # Save boot messages also to boot.log
- local7.* /var/log/boot.log
选择器
选择器分为设施和优先级两部分,并由句点分隔。设施表示消息的来源。例如 kern 消息来自内核,mail 消息来自邮件子系统。
图 3 是 rsyslogd 使用的设施名称列表以及生成这些消息的系统:
优先级表示消息的严重程度。图 4 为优先级的名字列表及其所表示的条件,按优先级顺序升序列出:
图 4. 优先级示意
一个选择器由单个设施和优先级组成,如 kern.info 会导致相应的动作应用到来自该设施具有该优先级或更高优先级(更迫切)的每条消息。使用 .= 指定单个优先级事项 ; 例如,kern.=info 表示把该动作应用到具有 info 优先级的内核消息。一个惊叹号指定一个不匹配的优先级。因此 kern.!info 将匹配比 info 优先级低的内核消息,kern.!=info 匹配非 info 优先级的内核消息。
一个由分号分隔且包含多个选择器的行,只要有匹配的选择器就执行该动作,该行每个选择器都会约束该匹配,后续选择器通常会收紧该约束。例如,mail.info;mail.!err 选择器匹配具有 debug、info、notice 或 warning 优先级的邮件子系统消息。
可以用星号替换该选择器的每部分以匹配任何内容。该选择器每部分的 none 关键字表示不可能匹配。*.crit;kern.none 选择器会匹配所有关键或更高优先级的消息,来自内核的消息除外。
动作
动作指定 rsyslogd 如何处理一条匹配该选择器的消息。最简单的动作是由其绝对路径指定的普通文件,rsyslogd 对这些文件追加消息。指定 /dev/console 将消息发送到系统控制台。如果想硬拷贝一条消息记录,需要指定一个代表专用打印机的设备文件。在文件名前面加上一个连字符(–)以防止将每条消息写入该文件。这样做可能会提高性能,但如果系统崩溃可能会丢失数据,以至于产生的消息没能来得及写入到一个文件中。
通过指定一个或多个由逗号分隔的用户名,可以将重要消息写入用户终端。通过使用一个星号可以将非常重要的信息写入每个登录的终端。
要将消息转发到远程系统上的 rsyslogd,通过在前面加上一个 @(将消息发送到 UDP 端口 514)或 @@(将消息发送到 TCP 端口 514)以指定系统的名字或 IP 地址。***将来自内核的关键信息转发到另一个系统,因为这些消息通常在系统崩溃之前,可能来不及保存到本地磁盘上。以下 rsyslog.conf 中的行将关键内核消息发送到 plum:
kern.crit @plum |
在远程系统上编辑 /etc/rsyslog.conf,以下两部分命令行是否运行,取决于是否要使用 UDP 或 TCP。不要删除注释中的哈希标记。编辑这个文件后,使用 rsyslog.service 来重新启动 rsyslogd 守护进程。
- # Provides UDP syslog reception
- #$ModLoad imudp
- #$UDPServerRun 514
- # Provides TCP syslog reception
- #$ModLoad imtcp
- #$InputTCPServerRun 514
#p#
应用工具四:掌握系统报告
许多实用程序可以对事项进行报告。例如,who、finger、ls、ps 以及其它实用程序可以生成简单的最终用户报告。在某些情况下,这些报告有助于系统管理。本节介绍的实用程序可以产生更多的详细报告,可以为系统管理任务提供更多的帮助。Linux 还有许多其它报告实用程序,比如 sysstat 包中的 sar(系统活动报告)、iostat(输入 / 输出和 CPU 统计)和 mpstat(处理器统计),netstat(网络报告,位于 net-tools 包)和 nfsstat(NFS 统计,位于 nfs-utils 包)。
使用 vmstat 掌握虚拟内存统计信息
vmstat 实用程序(虚拟内存统计,位于 procps 包)生成包含磁盘和 CPU 活动数据的虚拟内存信息。以下示例显示了每隔 3 秒的 7 个迭代(参数 3 7)的虚拟内存统计信息。***行包括自系统启动以来的时间,后续每行包括自上一行以来的时间间隔。
- $ vmstat 3 7
- procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
- r b swpd free buff cache si so bi bo in cs us sy id wa
- 0 2 0 684328 33924 219916 0 0 430 105 1052 134 2 4 86 8
- 0 2 0 654632 34160 248840 0 0 4897 7683 1142 237 0 5 0 95
- 0 3 0 623528 34224 279080 0 0 5056 8237 1094 178 0 4 0 95
- 0 2 0 603176 34576 298936 0 0 3416 141 1161 255 0 4 0 96
- 0 2 0 575912 34792 325616 0 0 4516 7267 1147 231 0 4 0 96
- 1 2 0 549032 35164 351464 0 0 4429 77 1120 210 0 4 0 96
- 0 2 0 523432 35448 376376 0 0 4173 6577 1135 234 0 4 0 95
以下列表解释了由 vmstat 显示的字段:
- procs 进程信息
- r 等待中可运行的进程数
- b 阻塞的进程数 ( 不间断睡眠中 )
- memory内存信息(以千字节为单位)
- swpd 使用的虚拟内存
- free 空闲内存
- buff 用作缓冲区的内存
- cache用作高速缓存的内存
- swap系统分页活动(每秒千字节)
- si 从磁盘交换到内存
- so 使内存换出到磁盘
- io 系统 I/O 活动(每秒块)
- bi 从块设备接收的块
- bo 发送到块设备的块
- system(单位是每秒)
- in 中断(包括时钟)
- cs 上下文开关
- cpu每个状态所耗费的总 CPU 时间的百分比
- us 用户 ( 非内核 )
- sy 系统(内核)
- id 空闲
- wa 等待 I/O
- st 从虚拟机提取(仅在虚拟机上)
使用 top 列出使用资源最多的进程
top 实用程序是 ps 的有益补充。最起码,top 显示的系统信息包括使用 CPU 密集的进程。 top 实用程序可以定期自我更新,输入 q 即可退出。虽然可以使用命令行选项,但使用交互式命令往往更有帮助。
表 1. top 交互式命令
- $ top
- top - 17:58:53 up 3 days, 4:20, 1 user, load average: 2.16, 1.61, 0.83
- Tasks: 167 total, 5 running, 162 sleeping, 0 stopped, 0 zombie
- Cpu(s): 1.5%us, 0.5%sy, 1.3%ni, 96.0%id, 0.2%wa, 0.6%hi, 0.0%si, 0.0%st
- Mem: 2076092k total, 1990652k used, 85440k free, 18416k buffers
- Swap: 7815580k total, 34908k used, 7780672k free, 1330008k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 31323 zach 25 0 9020 6960 396 R 63 0.3 0:17.58 bzip2
- 31327 zach 18 0 2092 596 492 R 57 0.0 0:00.92 cp
- 31311 root 15 0 0 0 0 S 16 0.0 0:00.38 pdflush
- 6870 zach 27 12 331m 190m 37m R 2 9.4 198:42.98 firefox-bin
- 31303 root 15 0 0 0 0 S 2 0.0 0:00.42 pdflush
- 1 root 15 0 2912 1808 488 S 0 0.1 0:01.55 init
总结
本文着重介绍企业 Linux 系统运维四个重要应用工具的使用和实战,在下一篇文章里面,将介绍企业 Linux 系统运维的重要原则和方法,给企业管理员提供有益参考。