快捷搜索:   nginx

Ubuntu无盘工作站安装详细步骤(2)


按照“天使之翼”的方法,如果客户机端原本是有磁盘的话,那么服务器端的准备工作到上文为止已经准备好了(当然并不意味着不再需要到服务器端上去操作,只 是下面到服务器端的操作实际上也是为了准备客户端的文件)。如果您是这种情况,那么请从这里接着阅读、直到完成。
(如果您的情况是和我一样,需要安装一台自始就没有磁盘的客户机端,那么请跳到【正文第三部分】阅读而不要停留于此,否则只会徒增混乱)

在客户端有盘的条件下,整体思路是:在这个磁盘上安装一个适合客户端硬件平台使用的完整的ubuntu系统,然后将根目录整体打包(当然经过一些必要的处 理、屏蔽掉某些目录、修改某些文件,下文将详述),再拷贝到服务器端为客户端准备的虚拟根目录下(对于default客户端来说就是/home /cache/netboot/root),然后就可以取下客户端的磁盘,使之作为一个真正的无盘工作站从网络启动。其过程如下:
(以下全部来自“天使之翼”原文,仅加了必要的注解)

第五步 安装一个新的将来用来在无盘机器上运行的linux,我这里安装的是一个ubuntu 7的版本
(注*这里指的是在客户端磁盘上进行一次传统的安装)

1 安装
注意的是
1> 安装好nfs的client
root@netfs:~# apt-get install nfs-client
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting nfs-common instead of nfs-client
nfs-common is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 14 not upgraded.

2> ip分配需要修改为手动,因为开机器的时候已经分配了ip
(注*这里指的是客户端虽然在网络启动阶段已经从服务器端的dhcp那里获得了一个动态IP,但是当他将来进入自己的虚拟根目录时,前面的动态 IP将不再起作用,而需要用interfaces文件定义一个在正常工作阶段使用的IP,所以这一步需要在拔掉磁盘之前先改动好,下文的host、 hostname、fstab、mtab的修改其原理同此)
root@netfs:~# nano /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

3> 编辑fstab文件,把除了proc外的所有都注释掉,udev会自动完成这个工作
(注*因为客户端无盘运行时的挂载当然与现在有盘时的方式不同,鉴于客户端已经从服务器端取得了/home/cache/netboot/root作为自 己的根目录,所以另外需要的只剩一个proc)

4> 编辑udev的rules中关于网络借口记录的文件,去掉已经定义了的网络接口,否则无盘启动了有个报错
root@netfs:~# :>/etc/udev/rules.d/70-persistent-net.rules
(注*这一步没有理由,只是“天使之翼”的经验之谈,请照做就是)

2 安装initramfs-tools
(注*这是在网络启动阶段用到的最小系统工具,关键是下文的将启动方式改为nfs,照做就是)
root@netfs:~# apt-get install initramfs-tools
Reading package lists... Done
Building dependency tree
Reading state information... Done
initramfs-tools is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 14 not upgraded.
root@netfs:~#

3 编辑initramfs.conf把BOOT=local改为BOOT=nfs
#
# initramfs.conf
# Configuration file for mkinitramfs.
#

#
# MODULES: [ most | netboot | dep | list ]
#
# most - Add all framebuffer, acpi, filesystem, and harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the basemodules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#

MODULES=most

# BUSYBOX: [ y | n ]
#
# Use busybox if available.
#

BUSYBOX=y

#
# NFS Section of the config.
#

#
# BOOT: [ local | nfs ]
#
# local - Boot off of local media (harddrive, USB stick).
#
# nfs - Boot using an NFS drive as the root of the drive.
#

BOOT=nfs

#
# DEVICE: ...
#
# Specify the network interface, like eth0
#

DEVICE=eth0

#
# NFSROOT: [ auto | HOST:MOUNT ]
#

NFSROOT=auto

4 创建支持nfs的initrd.img、vmlinuz文件
首先我们把nfs挂上来,创建的文件直接丢到nfs服务器上去
root@netfs:/# mkdir /netfs
root@netfs:/# mount -t nfs 192.168.1.88:/home/cache/netboot /netfs
建立两目录
root@netfs:/# cd /netfs/;mkdir root tftpboot
(注*这里不要看乱了,“天使之翼”的做法是在客户机端先挂载服务器端的/home/cache/netboot,然后在其下建立两个目录 root和tftpboot,此处的操作后果实际都发生在服务器端的磁盘上,这里的root就是我一再强调的客户端将来的真正的虚拟根目录,而这里的 tftpboot是本文涉及的第二个tftpboot,不同于服务器端/var/lib下面的那个tftpboot,至于为什么会有两个tftpboot 我也没有深究)
创建支持nfs启动的initrd.img文件
root@netfs:/# mkinitramfs -o /netfs/tftpboot/initrd.nfs
拷贝内核到tftpboot目录
root@netfs:/# cp /boot/vmlinuz-2.6.24-16-generic /netfs/tftpboot/linux
(注*上面的两个文件initrd.nfs和linux其结果也都是生成在服务器端的/home/cache/netboot/tftpboot 目录下,其作用类似于普通系统里的initrd.gz和vmlinuz,是启动整个系统所必须的两个文件。从这里也可以看出/home/cache /netboot下的两个子目录的分工情况:由tftpboot进行启动,然后交给root,后者就是客户机端实际工作的虚拟根目录)

5 打包ubuntu版本的/为tgz文件,先apt-get update一下,然后apt-get clean
一下,打包的时候请排除掉proc等目录
root@netfs:/etc# apt-get clean
root@netfs:/etc# apt-get autoclean
Reading package lists... Done
Building dependency tree
Reading state information... Done
#用下面的命令打包
root@netfs:/# tar zcvfp /netfs/root/netfs.tgz / --exclude=/sys/* --exclude=/netfs --exclude=mnt/* \
--exclude=/lost+found --exclude=/var/tmp/* —exclude=/proc/*

OK,打包完成了以后,关掉这个机器,到nfs服务器上那个机器去
(注*至此有盘的客户机端工作完成,可以拔掉磁盘)

第六步
1> 在nfs服务器上拷贝内核和initrd.img到到/var/lib/tfptboot/
root@ubuntu:~# cp /home/cache/netboot/tftpboot/* /var/lib/tftpboot/
(注*看似两个tftpboot里都需要启动文件initrd.nfs和linux,有谁知道是为什么吗?)

2> 把刚才压缩的netfs.tgz文件解压缩一份到
/home/cache/netboot/root/
(注*也就是把客户机端将来要用的整个系统拷贝到服务器端的对应虚拟根目录下)
root@ubuntu:/home/cache/netboot/root# ls -lh netfs.tgz
-rw-r--r-- 1 root root 96M 2007-12-22 06:03 netfs.tgz

root@ubuntu:/home/cache/netboot/root# cp netfs.tgz /home/cache/
root@ubuntu:/home/cache/netboot/root#

root@ubuntu:/home/cache/netboot/root# tar zxvf netfs.tgz && rm -fr netfs.tgz
root@ubuntu:/home/cache/netboot/root# ls
bin dev home initrd.img media opt root srv tmp var
cdrom etc initrd lib mnt proc sbin sys usr vmlinuz
删除mtab文件
root@ubuntu:/# cd /home/cache/netboot/root/etc/
root@ubuntu:/home/cache/netboot/root/etc# rm mtab
root@ubuntu:/home/cache/netboot/root/etc#
(注*这个删除mtab的目的与上文的修改fstab大体相同,是不是因为客户机端自身还在运行的时候删不掉,所以才留到现在在服务器端做?)


第七步 设置一个客户机从网卡启动
当然你的机器一定要支持网络启动,并且网卡的驱动已经在内核里面了,如果没在,请重新编译内核,找到对应的网卡驱动,然后敲空格选择星号表示把驱动编译到 内核里面
(注*现在的主板自带网卡大多数可以支持PXE启动,如果遇到网卡问题请自行寻找参考资料解决,本文不涉及该问题)


【正文第三部分】客户端从没有磁盘开始安装


从这里开始,是本人全新编写的部分,主要参考了“Ubuntu高地”一文中的简要描述,对该文没有讲明的一些细节,下文将着重进行补充。首先让我们回顾一 下,在【正文第一部分】服务器端准备完成后,我们已经作了哪些工作:
1、服务器端已经运行了三大服务tftp、dhcp和nfs
2、PXE启动必须的pxelinux.0 已经生成并且放在服务器端var/lib/tftpboot里
3、与每个客户端对应的虚拟根目录位置信息已经在服务器端的/var/lib/tftpboot/pxelinux.cfg/这个目录下的对应文件里配置 好
所以说,我们下面要做的,实际就是要在客户机端没有磁盘的情况下,在服务器端的为其已经准备好(即nfs服务已经export)的目录里,生成其可以使用 的操作系统,体现为根目录下常见的bin、usr、home……文件结构。对应[正文第二部分]的有盘客户端安装的内容(未阅读该部分也无妨,见下列列表 即可),这个系统里必须有:
1、能够作为nfs-client,因为启动后虚拟根目录需要从服务器端nfs出来
2、必须有initramfs-tools,并且initramfs.conf要修改为支持nfs启动
3、修改fstab、mtab、hosts、hostname、interfaces、udev里的rules以符合客户机端正常运行时的情况
以上三条体现于虚拟根目录下,也就是服务器端的/home/cache/netboot/root目录,但是别忘了还有与其平行的/home/cache /netboot/tftpboot下必须有:
4、启动操作系统的两个文件initrd.nfs和linux(是vmlinuz的改名)
所以,以下的工作就是围绕上述1—4这四个目标来做:

【正文第三部分-1】为无盘客户机端建立基本系统而在服务器端进行的工作

第一步 利用debootstrap生成一个基本的可登录系统

因为客户机端一片空白、且没有磁盘,所以这一步要在服务器端进行,目标是在/home/cache/netboot/root下生成一个最基本的可登录系 统。首先:
root@ubuntu:/# cd /home/cache/netboot;mkdir root tftpboot创建两个目录
root@ubuntu:/#debootstrap —arch=i386 hardy /home/cache/netboot/root
(注意arch前面是连续两个-,而http://debian.nctu.edu.tw/ubuntu是我这里最快的源,也可以改成其他任何一个源)

该命令的结果是在/home/cache/netboot/root里面生成了一个可以字符登录的最基本的系统,该系统不依赖于任何特定的客户机硬件平 台,只要是i386芯片的客户机端在接下来都可以登录进去。当然,如果是amd64的芯片,则在上述debootstrap命令后跟的就是— arch=amd64了。
经过检查发现,nfs-client和initramfs-tools的功能已经随着基本的系统而自然生成,下面只需修改/home/cache /netboot/root/etc/initramfs-tools/initramfs.conf:
# nfs - Boot using an NFS drive as the root of the drive.
#
BOOT=nfs
#
此时已经完成了我们四大目标中的1和2

第二步 修改几个重要的配置文件

/home/cache/netboot/root/etc/fstab文件修改成:
proc /proc proc defaults 0 0
192.168.1.88:/home/cache/netboot/root / nfs defaults,rw 0 0
(注意:与上文“天使之翼”只保留proc那一行不同,我在客户端将来的fstab里写明了要用到的nfs根目录,这样更保险)

/home/cache/netboot/root/etc/hosts文件修改成:
127.0.0.1 localhost
127.0.1.1 netfs
(注意:netfs是修改后的结果,在修改前这个位置实际是你现在所在的服务器的名字)

/home/cache/netboot/root/etc/hostname文件修改成:
netfs
(修改前这个位置实际也是你现在所在的服务器的名字ubuntu)

/home/cache/netboot/root/etc/network/interfaces文件修改成:
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.28
netmask 255.255.255.0
gateway 192.168.1.1
(注意:与“天使之翼”不同的是我直接指定了客户机的静态IP192.168.1.28,在ubuntu里静态IP的定义好像一定要这样写得很完全)

/home/cache/netboot/root/etc/mtab文件修改成:
192.168.1.88:/home/cache/netboot/root / nfs rw 0 0
proc /proc proc rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
(注意:与“天使之翼”删除mtab不同,原因与上述fstab的修改一样,实践证明可行。特别注意第1行末尾与fstab第一行是不一样的)

/home/cache/netboot/root/etc/udev/rules.d/70-persistent-net.rules文件的修改:
root@ubuntu:/#:>/home/cache/netboot/root/etc/udev/rules.d/70-persistent-net.rules
(这一步其实可以省略,因为在基本的arch系统里这个文件本来就是空的)

除此之外,还有一个很重要的步骤,就是将服务器/etc/apt/sources.list的内容拷贝到/home/cache/netboot /root/etc/apt/sources.list里,否则到时候客户机端的源里只有生成arch-i386时的一条(在本文中就是http: //debian.nctu.edu.tw/ubuntu),会导致很多软件包找不到。

这样,我们就完成了四大目标中的3

第三步 创建支持nfs的initrd.nfs、linux(vmlinuz)文件

这一步同样需在服务器端完成,只要服务器端本身具有nfs功能(因为我们在一开头已经配置了服务器端的nfs服务),那么可以通过以下命令生成 initrd.nfs:
root@ubuntu:/# mkinitramfs -o /home/cache/netboot/tftpboot/initrd.nfs
至于linux(也就是vmlinuz),其实内核文件随处可见并且是通用的,可以:
#cp /boot/vmlinuz-2.6.24-16-generic /home/cache/netboot/tftpboot/linux
也就是将服务器端本身的vmlinuz拷贝到/home/cache/netboot/tftpboot中并且改名为系统所要求的linux。
当然随后必要忘记把两个文件拷贝到/var/lib里的tftp目录下:
root@ubuntu:~# cp /home/cache/netboot/tftpboot/* /var/lib/tftpboot/

就这样,四大目标中的第4也完成了。如果一切正常,此时无盘的客户机端应该可以通过PXE启动方式,进入一个字符终端。

【正文第三部分-2】完全无盘客户机端的后续安装

此时,我们终于可以来到客户机端进行后续的工作。如果一切正常,客户机端可以用root用户和空口令登入(这个root是无盘客户机端的root,从现在 起客户机端的用户系统与服务器端已没有关系),第一步就应该是用#passwd给root建一个口令,否则在后面xsession启动的时候,没有口令的 root是无法登录的。
接下来的工作其实有点类似从一个纯字符的ubuntu服务器上建立x windows应用,只不过后者是在本地硬盘上安装文件,而我们的无盘工作站是把文件通过nfs远程安装到服务器端上的虚拟根目录(也就是/home /cache/netboot/root)里。
当然,我们开始工作的这个只有arch的系统,比已经是字符型服务器的系统少了很多东西,所以需要一步步地添加进去。在“Ubuntu高地”一文中,这部 分是最容易让人迷惑的,因为文章里看起来很容易,但是如果不是亲自尝试,就很难想象会有那么多细节性的问题,而每一个问题带来的都是字符终端失去反应的后 果。
现在让我们按顺序来进行配置:

设置网关转换:如内网网卡IP:192.168.1.1
                          外网网卡IP:192.168.60.82
root@tyc-desktop:/home/tyc# cat /proc/sys/net/ipv4/ip_forward
0(为0,内网数据不能通过外网网卡)
root@tyc-desktop:/home/tyc# echo 1 > /proc/sys/net/ipv4/ip_forward(修改为1,可通过)
root@tyc-desktop:/home/tyc# iptables -t nat -I POSTROUTING -j MASQUERADE
对内网数据进行地址转换,否则外部发给内网中电脑的数据找不到内网电脑的地址


第一步 安装内核
对,安装内核。arch-i386虽然已经可以登录,但是内核的部分其实还缺很多,所以需要安装,具体来说,装的应该是全功能系统需要的很多库和模块。安 装的命令是:
root@netfs:/#apt-get update
#root@netfs:/#apt-get dist-upgrade
root@netfs:/#apt-get install linux-image-2.6.24-16-generic
前面两条是更新源、升级发行版,最后1条才是安装内核包。注意:内核一定要用linux-image-2.6.24-16-generic而不能用 linux-image-2.6.24-16-386,虽然两者其实是一样的,但是因为两者在/home/cache/netboot/root/lib /modules/里生成的目录名是不同的,只有-generic生成的那个不会带来后续的路径问题。

第二步 安装console-data
root@netfs:/#apt-get install console-data
此处安装过程中会有类似dos那样的彩色字符窗口来设置键盘布局,需要按tab键选择ok等按钮、用方向键选择项目,鼠标此时是不起作用的。

第三步 安装xserver-xorg
root@netfs:/#apt-get install xserver-xorg

第四步 安装ubuntu-desktop
root@netfs:/#apt-get install ubuntu-desktop
注意:按照“Ubuntu高地”的文章,在xserver-xorg完成后就可以安装gnome或者xfce了,但实际上是不行的,如果那样做的话,在 gnome安装的最后会停下来报错说找不到fontpath,而fontpath就是在安装ubuntu-desktop的时候自动配置的,所以到时候还 是要补充安装ubuntu-desktop。那么按照报错的信息提示,所缺乏的东西应该提前安装好,也就是ubuntu-desktop应该在gnome 之前安装。
顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论