本文简要地介绍了使用 Red Hat Linux的 Kickstart 及网络安装功能方便快捷地升级己有 Linux 系统,文中的例子是从 Red Hat 7.2 远程升级到 Red Hat 9.0。
自从 5.2 版开始, Red Hat Linux 便 增加了一个称为 Kickstart 的功能,其主要是为了减少安装过程中需要jiao互式 (interactive)的系统参数输入,提高安装效率。将其运用于自动安装 Linux,特别是需要在短时间迅速安装至成百台 Linux 工作站这种特殊场合尤为适用,Stanford University 的 Menlo Park 已经有精彩的文章介绍。
1.升级前系统检查
在开始升级系统之前,有一些容易忽视的问题容易中断 Kickstart 过程,这些问题一般是系统配置达不到安装最低要求,所以最好能在自动升级之前有实验条件先进行充分的测试再实施。 Red Hat Linux 系统发展至今,已经不是低得386都可以跑得很流畅的了(Red Hat 9 已经不能在 586 以下的机器上运行),所以在升级之前有必要对系统进行充分的检查,主要包括以下方面:
存储空间是否足够。Red Hat 9 最少需要32MB的内存和472MB的硬盘,内存一般是不会成问题的,但是我未能在一个500MB硬盘上装好系统,当然现在大家的硬盘一般还是比较大,都可以进行完全安装了。Linux 的系统文件主要集中于 /usr 下,/ 下面也有一部分,一般不安装 X 系统和大型软件的情况下,/usr 使用1GB空间、/ 使用500MB空间都可以姿吵工作得很好了。我的系统从 7.2 升级到 9.0 系统,/usr 和 / 的使用情况大约较升级前增加了30% 的样子,所以如果大家的 /usr 和/使用率不是太高的话,磁盘空间 的限制一般是不会有什么问题的。
jiao换分区空悔段间是否足够。Red Hat 9 与 7.2 的一个不易发现的区别便在此,7.2 系统是可以使用少于两倍物理内存容量的jiao换分区,两倍或者多于两倍物理内存的jiao换分区只是建议大小;而 Red Hat 9 则必须使用两倍或者多于两倍物理内存迹前侍大小的jiao换分区,所以如果你的Linux系统只有少于两倍的jiao换分区,那就只有再划分一个jiao换分区或者增加一个jiao换文件,或者拨下你的内存让系统jiao换分区大于两倍物理内存,我建议使用加一个jiao换分区的办法,增加jiao换文件还无法在 Kickstart 中实现,至于拨下内存,远程升级就根本没有办法拨下内存了。
其他杂项,系统在自动升级过程中会检测一系列的硬件,如果选择图形界面安装,但是没有鼠标,系统则会提示使用文本方式安装;或者只有 32MB内存则系统也不能进行图形界面安装,这些都可以在自动安装配置文件里进行修改以避免其发生,但是记下系统的所有硬件配置制成一个清单会对制作自动配置文件有较大的帮助。
2.如何启动安装程序
首先从 Red Hat Linux 的.启动安装程序开始。从 Red Hat Linux 的官方安装装手册上我们可以看到主要的几种启动方式:CDROM、软驱及从 dos 环境运行光碟上的 dosutilsautoboot.bat 文件三种方式,对于我们来说这还是不够的,我们的 Linux 工作站是没有软驱和光驱的,当然更加不会有 dos。通过分析各发行版第一张光盘的 /images目录下的 boot*.img 文件我们发现,这些启动镜像文件其实只有两个主要的文件:vmlinuz 内核和 initrd.img,initrd.img是一个压缩的最小文件系统。将这两个文件提取到己有的 Linux 系统 /boot 目录下,在系统的 bootloader(一般是 LILO 或者 GRUB)配置文件中加入相应的配置行即可启动安装程序。以 Red Hat 7.2 和 GRUB 为例(使用 Red Hat 8.0 的网络启动镜像文件):
[root@client mnt]# mount -o loop -o ro
/mnt/nfs/psyche/cd1/images/bootnet.img bootnet
[root@client mnt]# cd bootnet/
[root@client bootnet]# ls
boot.msg initrd.img options.msgrescue.msgsplash.lsssysLinux.png
general.msgldLinux.sysparam.msgsnake.msgsysLinux.cfgvmlinuz
[root@client bootnet]# cp vmlinuz /boot/vmlinuz8
[root@client bootnet]# cp initrd.img /boot/initrd8
[root@client bootnet]# vi /boot/grub/menu.lst
添加如下三行:
title Upgrade to Psyche via NFS
kernel /boot/vmlinuz8 ro
initrd /boot/initrd8
注意:以上是没有 /boot 分区的配置,有 /boot 分区则不需要前面的 /boot,见 GRUB 配置文件中 NOTICE 部分。
重新启动后即可选择网络升级,和用 bootnet 软盘引导系统的效果是一样的。在这里我们将使用 Red Hat 9 的另外一个启动文件,这也是最近才在 Red Hat 发行版中出现的 boot.iso。将 Red Hat 9 发行版第一张光盘的 ISO 镜像文件装载后,我们发现其下的 images 目录中较 7 系列发行版多了一个 boot.iso 文件(8.0 第一张光碟根目录下也有类似目录),将其装载后发现其中包含一个比较大的内核和 initrd 文件,该initrd 包含了安装系统时常见硬件的驱动,我使用该文件启动时能自动识别出 PM133 主板的显卡及比较少见的adaptec ANA-6911TX 网卡(starfire.o),所以强烈推荐使用 boot.iso 自动升级,可以省却驱动的麻烦。值得一提的是 Red Hat 9 现在已经不在 boot.img 中自带网卡驱动了,而 Red Hat 8 在 bootnet.img 中带了一些常见网卡的驱动的(intel 55X系列、tulip、8139等),解压一下 bootnet.img 中的 initrd.img 文件就可以在lib目录中看到这些驱动模块文件了。
3.从哪里安装
升级系统当然需要新系统的发行版源文件,发行版形式可以多样化,即可以是光碟,也可以是光碟镜像文件(ISO格式),同时也可以是光碟文件的拷贝集。在 Red Hat 9 中,可供选择的安装模式有本地 CDROM、本地硬盘、NFS 镜像、FTP、HTTP。从光碟安装具有最好的兼容性和易 *** 作性,适合个人安装,大批量和远程升级则不适用;本地硬盘是一种比较好的方式,速度快,而且也不需要频繁更换光碟,但是也不适合大批量安装,每台工作站均保存一份发行版镜像拷贝实在是很浪费存储空间,而且要命的是我的那台机器已经没有空间可以放下这么巨大的文件了;NFS 则是一种比较成熟的方式,通过 NFS 方式安装系统只需要将 ISO 格式的光碟镜像文件共享即可,不像 FTP 和 HTTP 方式需要考虑目录树结构,而且 NFS 方式可以选择图形界面安装(FTP 和 HTTP 方式仅能使用文本界面),速度相对 FTP 和 HTTP 方式更快,所以网络安装建议使用 NFS 方式。建立 NFS安装镜像服务器的办法很简单,仅需通过 NFS 将发行版光碟镜像文件共享即可。
[root@server root]$ cat /etc/exports /data/shrike 192.168.0.42/31(ro)
[root@server shrike]# ls
ks.cfgshrike-i386-disc1.isoshrike-i386-disc2.isoshrike-i386-disc3.iso
4.制作 Kickstart
接下来自然就是制作 Kickstart 文件了,Kickstart 技术从最早推出至今已经更新了许多次,配置的语法也是不尽相同,后来的版本也没有做到完全兼容旧有版本语法,不能说这也是一个遗憾,在此我强烈建议使用 Red Hat 9 官方文档来进行 Kickstart 的配置,这样才能做到万无一失。配置文件主要内容如下:
1)ks.cfg 文件位置。很明显安装程序需要读取到 ks 配置文件才能进行自动安装,ks 配置文件可以有以下几种方式读入:启动软盘、启动光盘、硬盘、网络。
软盘读取 ks 配置文件相对较简单,将 ks.cfg 置于软盘根目录下即可,启动后输入 Linux ks=floppy 即可开始 ks 安装。
光盘读取 ks 配置文件需要在制作启动光盘时加入 ks.cfg 配置文件至根目录下,启动后输入 Linux ks=cdrom:/ks.cfg 即可开始 ks 安装。
硬盘读取 ks 配置文件一般是从光驱引导后,再读硬盘中的 ks 配置文件(此时可能没有软驱和网络支持),启动后输入 Linux ks=hd:fd0:/ks.cfg,限制条件是该硬盘分区必须是 VFAT 或者 EXT2。
网络读取 ks 配置文件则用得非常多了,通常用到的是 NFS 方式和 HTTP 方式,格式分别是 ks=nfs:server:/path 和 ks=http://<server>/<path>。需要注意的是网络方式读取 ks.cfg 文件时,局域网能自动分配 IP,因为在内核未取得 ks.cfg 配置文件之前,系统是不知道如何配置 IP 地址的,这时就要先通过 DHCP 获得一个 IP 地址,通过网络读取 ks.cfg 配置文件。在具备网络条件的环境下,我强烈推荐使用网络方式提供 ks.cfg 配置文件,使用 DHCP 配合 ks 的参数置空功能可以为大量的工作站配置不同的 Kickstart 配置文件,自动安装功能各异的系统。我是使用 NFS 方式读取 ks.cfg 文件。
[root@server shrike]# ls
ks.cfgshrike-i386-disc1.isoshrike-i386-disc2.isoshrike-i386-disc3.iso
在待升级系统 GRUB 配置文件中加入 ks 配置语句:
kernel /boot/vmlinuz9 ro ks=nfs:192.168.0.19:/data/shrike/ks.cfg
2)经过测试,升级系统所需要的 ks 配置参数相对较少,具体配置参数就不再累述了, UNIX 的风格就是 KISS。以我的配置为例:
reboot
upgrade
lang en_US
keyboard us
mouse none
text
skipx
network --device=eth0 --bootproto=static --ip=192.168.0.42
--netmask=255.255.255.0--gateway=192.168.0.253
--nameserver=192.168.0.4 --hostname=huter.xtu.edu.cn
nfs --server=192.168.0.19 --dir=/data/shrike
zerombr yes
bootloader --location=mbr
%post
chkconfig --level 345 sshd on
检查一切配置无误就可以开始远程升级系统了!
升级linux内核奋斗记我的piii dell机运行着内核2.4.的redhat,自从linux内核2.6发布以来一直想把该系统升级到内核2.6。经过一番艰辛万苦,终于成功了。为了体验一下在linux下编写多线程程序的步骤,又更新gcc和c语言库。在此愿和各位朋友共享这段经历,共享这段成果。(可能有记录错误,仅供参考)。
具体步骤包括以下内容:
1,升级内核的具体步骤
2,更新gcc
3,使用glibc2.3.5
4,使用nptl线程进行编程
在此之前,先简要地介绍一下linux内核2.6所做的改进及新增功能。linux2.6主要在以下的10个方面作了很大的改进,简单概括如下,有关详细情况,请参阅相关资料。
1)通过改善并行处理能力和采用posix线程等,提高了系统的处理能罩亏信力,从而linux真正具备大型信息系统所要求性能。
2)通过改善文件系统的输出/输入能力和提高对大容量内存的利用效率,使得linux能够更胜任大型信息系统中的数据处理。
3)加强了对数物轮据库应用程序的支持。
4)提高了抗系统高负荷时能力。
5)提高了系统的可用性,包括对不停机空此时备份和不停机时更换硬件功能的支持。
6)强化了对网络的支持,增加了对ipv6, sctp, ipsec,等的支持。
7)通过增加访问控制和内核暗号化技术,提高了系统的安全性。
8)强化了对电源的管理。
9)强化了对嵌入式cpu和系统的支持。
10)添加了更多的硬件驱动程序。
一.升级内核
1, 下载linux-2.6.3.tar.bz2(可以是更新的版本)到/usr/src
bzcat linux-2.6.3.tar.bz2 | tar xvf – cd linux-2.6.3阅读readme及changes 文件,确认必须的工具软件。因为不是笔记本电脑和笔记本电脑有关的软件可以忽略。发现module-init-tools需要更新。
2,下载module-init-tools-0.9.13.tar.bz2
bzcat module-init-tools-0.9.13.tar.bz2 | tar xvf – cd module-init-tools-0.9.13 ./configure --prefix=/usr/local/module-init make make moveold make install /usr/local/module-init/sbin/generate-modpobe.conf >/etc/modprobe.conf成功。
3, 编译linux内核
cd /usr/src/linux-2.6.3 make menuconfig一看太麻烦了,而且许多选项不知所云。退出该程序。 执行make oldconfig,对kernel2.6新增的不熟悉的选项作不选或为缺省。
make bzimage make modules modules_install pwd /usr/src/linux-2.6.3 mv arch/i386/boot/bzimage /boot/bzimage2.6.3 mv system.map /boot/system.map-2.6.3 cd /boot mv system.map oldsystem.map ln –s system.map-2.6.3 system.map4,建立sys目录
mkdir /sys
5, 修改相关文件,增加对sys的支持
在/etc/rc.d/rc.sysinit文件增加对sys的支持。
1) 找到mount –f /proc的行,在其下面,增加 mount –f /sys
2) 找到 action $ “mounting proc filesystem:” mount –n –t proc /proc /proc 在其下面,增加action $ “mounting sysfs filesystem:” mount –n –t sysfs /sys /sys.
3) 把文件中的 ksyms 改成 kallsyms
在/etc/fstab文件中,增加一行:
none /sys sysfs defaults 0 0
在/etc/rc.d/init.d/halt中,增加对sys的支持,把 awk ‘$2 ~/^/$ | ^/proc | ^/dev / {next} 变为:
awk ‘$2 ~/^/$ | ^/proc | ^/sys | ^/dev / {next}
6,启动
修改/etc/lilo.conf, 增加下面的设置
… image=/boot/bzimange2.6.3 label=linux2.6.3 read-only root=/dev/hda3(由自己的pc设置决定)成功。
二,更新gcc (因为gcc2.95.3无法编译glibc-2.3.5)
下载gcc-3.4.4.tar.bz2
bzcat gcc-3.4.4.tar.bz2 | tar xvf – cd gcc-3.4.4 ./configure –prefix=/usr/local/gcc344 –enable-shared –enable-threads –enable-threads=posix –enable-languages=c,c++,f77 make bootstrap (因为使用cflags选项时,出错了,所以省略) make install ln –s /usr/local/gcc344/bin/gcc /usr/bin/gcc 三,使用glibc-2.3.5
1)、通过调查发现要编译glibc-2.3.5,要求binutils在2.13以上。所以必须安装binutils-2.14
下载binutils-2.14.tar.gz
tar zxpvf binutils-2.14.tar.gz mkdir binutils-build cd binutils-build ../binutils-2.14/configure –prefix=/usr –enable-shared make tooldir=/usr make check make tooldir=/usr install cp ../binutils-2.14/include/libiberty.h /usr/include2) 安装glibc-2.3.5
下载 glibc-2.3.5.tar.gz 和 glibc-2.3.5-fix_test-1.patch
tar zxpvf glibc-2.3.5.tar.gz patch –np1 –i ../glibc-2.3.5-fix_test-1.path mkdir glibc-build cd glibc-build ../glibc-2.3.5/configure –prefix=/usr/local/glibc235 –enable-add-ons=linuxthreads –enable-kernel=2.6.0 (若安装在/usr目录下,很危险,可能会损坏你的系统) make make check (必须执行的一步) make localedata /install-locales (对应各国文字) mkdir /usr/man/man3(man的安装路径) make –c ../glibc-2.3.5/linuxthreads/man install上面的安装完成以后,最好把/usr/local/glibc235/lib和/usr/local/glibc235/include加入到系统的路径中,这样在编译程序时,就不必指定库和header文件的路径了。
四、使用nptl进行线程编程
#include #include #include #include void thread_fun(void * arg)char message[] = “i am created thread”int main() { int rntpthread_t new_threadvoid *thread_resultrnt=pthread_create(&new_thread,null, thread_fun, (void*) message)if (rnt != 0) { perrer (“thread creation failed”)exit(exit_failure)} printf(“waiting for other thread to finish…”)rnt = pthread_join(new_thread, &thread_result)if (rnt != 0) { perrer (“thread join failed”)exit(exit_failure)} printf(“thread join, it returned %s ”, (char*) thread_result)printf(“message now %s”, message)exit(exit_success)} void *thread_fun (void * arg) { printf(“the new thread is running. argument was %s”,(char*)arg)sleep(3)strcpy(message, “bye”)pthread_exit(“thank you for the test”)}编译
gcc -d_reentrant test_thread.c -o test_thread -lpthread ./test_thread成功了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)