本文是假设您已经使用 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): m
Command action
a
b
c
d
m
n
o
p
q
s
t
u
v
w
x toggle a bootable flag
edit bsd disklabel
toggle the dos compatibility flag
delete a partition
list known partition types
print this menu
add a new partition
create a new empty DOS partition table
print the partition table
quit without saving changes
create a new empty Sun disklabel
change a partition's system id
change display/entry units
verify the partition table
write table to disk and exit
extra 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]