本文是假设您已经使用 Linux 一段时间,随着硬件的升级或空间不足,必须要升级 Linux 系统,抑或是想提供更多的网络服务给用户,因应这个需求而编写的。
一、调整虚拟内存:
在 Linux 上是使用 swap 技术将硬盘空间挪用为虚拟内存,当服务器建置完成使用一段日子以后,有可能会扩充硬件,其中又以扩充主存储器来改善执行效能最为普遍,在这种情形下,就需要增加 swap 虚拟内存的容量。
由于 swap 跟 LVM 机制一样能将多块磁盘分割区虚拟成一块,因此我们并不需要将旧的 swap 扇区先移除,或是直接修改 swap 扇区大小,而是可以采用追加 swap 扇区的方式来配置。做法如下:
mkswap /dev/hdx2(将新扇区格式化为 swap)
swapon /dev/hdx2(立即启用新的 swap 扇区)
修改 /etc/fstab 加入下面这一行
/dev/hdx2 swap swap defaults 0 0
如果硬盘已经没有剩余空间,而且无法加装新的硬盘,这种情况下,我们没办法变更 swap 扇区来满足需求,但是可以挪用已经挂载的分割区一部分空间,以档案的形式来追加 swap 虚拟内存的容量:
dd if=/dev/zero of=/swapfile bs=1024 count=65536(建立 /swapfile 档案,单位为 KB,所以这是 64MB)
mkswap /swapfile(将该档案空间格式化为 swap)
swapon /swapfile(立即启用新的 swap 档案)
修改 /etc/fstab 加入下面这一行
/swapfile swap swap defaults 0 0
Linux 并没有办法搬移 swap 扇区,如果想要把 swap 作成单一一个扇区,必须先将旧 swap 扇区移除,再加入新的 swap 扇区,如果先加入新扇区,则新旧扇区会联合运作,造成旧扇区无法移除的现象。移除 swap 扇区的方法如下:
swapoff /dev/hdx2(关闭 swap 功能)
修改 /etc/fstab 移除 /dev/hdx2 那一行
二、加载硬盘与档案系统转换:
当硬盘不敷使用时,需要加挂新的硬盘到系统上,加挂硬盘的做法很简单,先使用 fdisk 或 parted 将扇区分割好,接着使用 mkfs 指令来格式化硬盘,最后修改 /etc/fstab 让系统重开机后能自动挂载新的硬盘。fdisk 的使用方法如下:
#> fdisk /dev/hdb(假设要加挂的硬盘,是接在第一条排线的第二个位置)
The number of cylinders for this disk is set to 2498.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., LILO)2) booting and partitioning software from other OSs(e.g., DOS FDISK, OS/2 FDISK)Command (m for help): mCommand actionabcdmnopqstuvwx toggle a bootable flagedit bsd disklabeltoggle the dos compatibility flagdelete a partitionlist known partition typesprint this menuadd a new partitioncreate a new empty DOS partition tableprint the partition tablequit without saving changescreate a new empty Sun disklabelchange a partition's system idchange display/entry unitsverify the partition tablewrite table to disk and exitextra functionality (experts only)Command (m for help):
先用 l 指令列出所有已分割好的扇区,你可以使用 d 指令将不要的扇区删除,或使用 t 指令将扇区的档案系统改为 Linux 用的 82(swap) 或 83(ext2,ext3),假如硬盘是空的尚未分割任何扇区,这时候请用 n 指令建立扇区,所有需要的修改完成后,输入 w 指令将设定储存起来,然后重开机让修改生效,以便进行后续动作。
扇区分割好了以后,必须针对每个不同档案系统将扇区格式化,swap 扇区格式化的方法前面已经提过,而作为一般用途的扇区,建议直接格式化为 ext3:
/sbin/mkfs -t ext3 /dev/hdb1(将空白扇区格式化为 ext3)
ext3 是从 ext2 改良而来,主要是挪用 ext2 一些 inode 拿来做成日志文件(.journal),因此它与 ext2 只有些微不同,两种系统也可以很容易互相转换(转换完仍需自行修改 /etc/fstab 组态):
/sbin/mke2fs /dev/hdb1(将空白扇区格式化为 ext2)
/sbin/tune2fs -j /dev/hdb1 (将 ext2 转为 ext3,转换时顺便建立日志文件)
当新扇区格式化好了之后,就可以将它挂载上来,您可以直接指定要挂载的扇区型态:
/sbin/mount -t ext3 /dev/hdb1 /mount/point(指定挂载 ext3 扇区到 /mount/point 目录)
或先修改 /etc/fstab 然后再挂载,修改 /etc/fstab 的方法是插入下面这一行:
/dev/hdb1 /mount/point ext3 defaults 0 0
接着挂载时不需指定扇区型态及装置名称,指令如下:
/sbin/mount /mount/point
已经格式化为 ext3 的扇区,如果要挂载到 6.X版以前的系统上使用,必须将格式改回 ext2,变更方法如下:
/sbin/tune2fs -O ^has_journal /dev/hdb1 (通知 kjournald 关闭日志文件功能)
mount -t ext2 /dev/hdb1 /mount/point(将 ext3 挂载为 ext2)
rm -f .journal(删除日志文件)
将 ext2 转换成 ext3 有许多好处,包括速度快、安全、高可用性、修复省时......等等优点。简单的讲,所谓 journal 就是把文件读写动作逐项纪录下来,当硬盘未正常关机(unclean shutdown)时,不需要检查硬盘(e2fsck)直接可以挂载(mount),如果以 fsck 强制修复硬盘,则直接从日志文件读取需要修复的扇区资料,而不需要整颗硬盘都检查。由于这些优点,我们也建议不要再使用旧的 ext2 格式。
挂载好后,如需进行数据移转,可以使用 cp -Rp 指令,参数 R 表示连子数据夹一起备份,参数 p 表示要保留所有档案权限设定,例如:cp -Rp /home /home1
三、升级磁盘系统:
LVM 逻辑扇区
事实上新版 Linux 由于提供 LVM (Logical Volume Manager)功能,可以将多个扇区组合成一个 VG(Volume Group),然后将一个 VG 挂载成单一一个目录,这样就可以做到扇区合并的效果,省掉转移资料的麻烦,要使用这项功能,首先在安装 Linux 时,必须先将可能会事后扩充的扇区做成 LVM 扇区型态(代号是 8e),如果您在安装时没有启用这项功能想要事后补做,那样可行不通,因为修改扇区型态将会造成所有资料遗失!
如果是新硬盘上的扇区,请用 fdisk 修改好扇区型态后,利用以下指令来做起始化的动作,在底下的例子里,我们会把新硬盘上的三个扇区合并成一个,并在稍后加入第四个扇区以扩充容量(透过这些步骤,可以了解当初 Linux 安装程序帮我们装 LVM 时,到底做了哪些事情):
/sbin/pvcreate /dev/hdb1
/sbin/pvcreate /dev/hdb2
/sbin/pvcreate /dev/hdb3
然后需建立 VG,建立好的 VG 将被视为一个装置名称,事后可以用 /dev/VG_name 来引用它:
/sbin/vgcreate new_home /dev/hdb1 /dev/hdb2 /devhdb3
对于 VG 这种装置来说,仍必须进一步在上面分割逻辑扇区才能使用,我们不妨把 VG 想象成是一个外挂的 SCSI 磁盘阵列,对主机板来说,他被视为单一一颗硬盘(LVM 并不是真正的 RAID 系统,因为它只能实作 RAID0,事实上 2.4.x 版的 kernel 另外还提供 softRAID 功能,在后面说明)。既然它是一种装置,当然无法直接挂载使用,必须先进一步作虚拟分割及格式化的动作, 下面的例子里,我们仅分割单一一个扇区:
/sbin/lvcreate -L 30g new_home(将 new_home 虚拟装置中的 30 GB 空间割成一个虚拟延伸扇区)
使用 lvcreate 指令除了可以分割l逻辑延伸扇区(所谓延伸是指可以动态变大,当然变小也是可以,但应该没有人会这么做),还可以分割一种称为快照的扇区,这可以用来自动备份某块逻辑延伸扇区,而这种备份是 自动进行的,并不需要人力介入管理。
一但逻辑扇区分割好了,依照惯例仍然得先将扇区格式化,一般是格式化成 ext3:
/sbin/mkfs -t ext3 /dev/new_home/lvol1(由于当初分割扇区时未使用 -n 参数来指定名称,因此系统会自动编号)
格式化好的扇区就可以直接挂载使用:
mkdir /home2
mount -t ext3 /dev/new_home/lvol1 /home2
接下来进行文件转移:
cp -Rp /home /home2(将使用者文件从实体扇区拷贝到 lvm 扇区)
以光盘片开机进入 rescue mode
rm -rf /home (将 /home 删除)
mkdir /home (建立挂载点)
mount -t ext3 /dev/new_home/lvol1 /home (重新将 /dev/new_home/lvol1 挂载到 /home)
rmdir /home2(删除挂载点)
紧接着修改 /etc/fstab 来挂载这个新作好的逻辑扇区:
/dev/new_home/lvol1 /home ext3 defaults 0 0
重开机后,系统会尝试挂载该虚拟扇区,如果挂载失败,请在 /etc/rc.d/rc.local 加入以下指令:
vgchange -a y new_home
mount /dev/new_home/lvol1 /home
假如使用一段时间后, /home 的空间不足,这时我们可以动态加入新的实体扇区(以 /dev/hdb4 为例)来扩充空间:
以 fdisk 修改 /dev/hdb4 的扇区类型为 8e
/sbin/pvcreate /dev/hdb4 (逻辑扇区起始化)
/sbin/vgextend new_home /dev/hdb4(将实体扇区加入到虚拟装置上)
/sbin/lvextend -L +10g /dev/new_home/lvol1 /dev/hdb4(从该实体扇区扩充 10GB 空间至逻辑扇区)
完成以上步骤后,现在的 /home 空间容量已经变成 40GB!然而使用 df 指令去查看 inode,却发现空间没有增加,经过测试后发现必须重新mkfs才能使用新的空间,这个缺点让 LVM 有点美中不足。
SoftRAID 软件磁盘阵列
使用软件磁盘阵列应该在安装 Linux 时,直接透过 Disk-Druid 来设定比较方便,如果事后想要手动加上去,步骤比较繁杂,首先和 LVM 系统一样,你必须先使用 fdisk 将预先割好要作磁盘阵列的分割区改为 fd 类型,千万不要拿已经有资料的 Linux ext2 或 swap 来改,否则资料会全部遗失,修改方法请自行参考前面的解说。特别要注意的是,要作磁盘阵列的分割区其容量必须一致,不可以有大有小!
改好扇区类型后,请用底下指令建立软件磁盘阵列组态文件:
touch
/etc/raidtab
该档案内容如下:
raiddev /dev/md0 //定义磁盘阵列的装置名称
raid-level 1 //定义磁盘阵列的等级,RAID 1 就是 Mirror
nr-raid-disks 2 //定义磁盘阵列是由多少实体分割区组成的
chunk-size 64k //定义 chunk 大小,由于是软件数组所以是使用系统主存储器来进行 chunk,这个数值设大一点虽然对磁盘阵列效能有帮助,但却会耗掉系统资源,建议使用默认值就好了
persistent-superblock 1//启用 superblock,这是用来作磁盘寻址,它能帮助 kernel 在侦测 RAID 磁盘时不会误判
nr-spare-disks 0 //定义备用的扇区
device /dev/hda1 //定义组成 RAID 的第一块实体分割区
raid-disk 0
device /dev/hdc1 //定义组成 RAID 的第二块实体分割区
raid-disk 1
以上面这个例子来说,作好的磁盘阵列在写入数据时,两个实体分割区都会写入数据,读取资料时,则只要其中一个扇区能正常读取即可,这样就可以充分利用磁盘阵列的好处来进行数据保全。做好组态设定以后,接下来请以下列指令开始制作磁盘阵列:
mkraid
/dev/md0
磁盘阵列一但制作好了,依然得先将扇区格式化,一般是格式化成 ext3:
/sbin/mkfs -t ext3 /dev/md0
格式化好的扇区就可以直接挂载使用:
mkdir /secure_data
mount -t ext3 /dev/md0 /secure_data
资料保全测试:
使用 fdisk 将 RAID 磁盘阵列其中一个实体分割区删除后,重新开机,发现 RAID 激活时出现错误讯息,警告我们有部分磁盘损毁,但储存的资料仍然具全没有遗失。
如果开机讯息闪得太快没有看清楚,可以使用底下指令来观察:
lsraid -a /dev/md0
将该分割区重新分割并修改格式为 fd 后,进行资料复原工作:
raidhotadd /dev/md0 /dev/hdc1(将空白扇区 /dev/hdc1 加入 RAID 中并复原资料)
完成以上步骤后,再使用 lsraid 指令来观察,发现 RAID 装置已经恢复正常。
四、工作管理进程:
Linux 提供四种自动执行程序的机制,包含:cron、anacron、at 和 batch。使用时机分述如下:
cron 主要用来做周期性工作的管理进程,会根据系统时间来判断程序是否该执行,万一系统时间设定不正确将会造成进程错乱。
anacron 和 cron 一样也是用来做周期性工作的管理进程,但是它不检查系统时间,而改以读取时间戳记来计算间隔日数,依间隔日数判断是否该执行,适用于每天、每周或每月只执行一次的工作。
at 让指定程序在某个时间点到达时自动执行,适用于只执行一次的工作。
batch 指定工作在系统闲置时执行,可用来避开高负载时段。
使用 cron 前请先确定管理程序是否已经执行,可以使用以下指令来查看:
/sbin/service crond status
虽然 cron 允许使用者自行安排自己的工作,以方便在结束联机后,程序能自动运作,但这类工作对于已经提供多种网络服务的服务器来说负担太大,因此建议不要教使用者使用它,本文也不讨论这类的事情,毕竟我们的服务器只是 PC,不是 main frame。
cron 的主要设定档 /etc/crontab 内容如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前面几行是定义 cron jobs 执行时的环境,我们不需要去修改它,底下四行是用来定义工作管理进程,上面看到的是系统管理进程的定义区分为七个字段,分别代表:分、时、日、月、星期、执行时的身分、要执行的 script,而一般的工作则只区分为六个字段,前五个字段与系统管理进程相同,最后一个字段则是要执行的工作。
字段 有效数值
分 0~59, * 代表每分钟都要执行,1-4 是指前四分钟各要执行一次,如果执行的时间不是连续的,可以用逗号来区隔,例如:5,10,15,20 代表第五分钟、第十分钟、第十五分钟、第二十分钟时要执行,如果每隔五分钟要执行一次,可以简写为 */5。
时 采用 24 时制,有效数值为 0~23,可以使用 * - , / 等通配字符,意义同上。
日 1~31,如果使用 30,则每逢二月会跳过不执行,如果使用 31,会变成大月时才执行,因此对于每月都得执行一次的工作,请安排在 28 日以前执行。当月份有指定时,必须为有效日期,否则该工作将永远不执行。通配字符使用方式同上。
月 1~12,也可以直接用英文缩写:jan、feb......等。 通配字符使用方式同上。
星期 0~7,其中 0 和 7 都代表星期天,也可以使用英文缩写:sun、mon......等。 通配字符使用方式同上。
如果要执行的工作是属于每天、每周或每月执行一次,建议改用 anacron 以确保一定会执行,如果是每小时要执行,建议直接在 /etc/cron.hourly 目录内直接新增一个定义文件,语法需与 /etc/crontab 相同。 其它情形则把定义档放置在 /etc/cron.d,这里的定义档将会每分钟都检查一次。
anacron 的设定档位于 /etc/anacrontab,如前所述它是以检查时间间隔的方式来决定是否执行,因此不受系统时间设定的影响,为了要检查时间间隔必须纪录每个工作每次执行时的时间戳记(timestamp),这些档案会放置在 /var/spool/anacron 目录里面。
anacron 设定文件分为间隔周期、执行延迟时间、工作识别名称、 要执行的工作四个字段,说明如下:
字段 使用说明
间隔周期 每次执行工作时应相隔几天,小于一天的请改用 cron
执行延迟时间 当距离上次执行的时间超过时间间隔,这表示中间有执行失败的情形,这种情形下在延迟几分钟后,该工作会再尝试执行一次。
工作识别名称 用来识别不同工作,同一名称不能重复使用。
要执行的工作 通常是一个命令或 script
anacron 的设定档预设内容如下:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin;/usr/local/sbin;/usr/local/bin
# These entries are useful for a Red Hat Linux system.
1 5 run-parts /etc/cron.daily
7 10 run-parts /etc/cron.weekly
30 15 run-parts /etc/cron.monthly
这个设定可以用来确保 cron job 一定会如期执行。
at 指令用来执行一次性的工作而非周期性的工作,我们可以指定要执行的时间,它和 cron 一样会检查系统时间的设定,因此设定错误会造成工作无法正确执行,设定方式如下:
at 16:00 011503[ ENTER](排定执行时间是 2003年1月15日下午4点)
at> perl /root/backup.pl[Ctrl-D]
我们可以使用 atq 指令来查询现在尚未执行的预定工作。
如果想根据主机负载情形来决定执行时间,必须使用 batch 指令,实际上 batch 指令算是 at 的特殊应用,使用方式如下:
batch[ ENTER](不用指定执行时间)
at> perl /root/backup.pl[Ctrl-D]