通过chroot 构建Linux操作系统概要 通过chroot 构建Linux操作系统概要作者:北南南北 来自:LinuxSir.Org 提要:在
已有的Linux操作系统中,安装另一个开源操作系统,我们一般是先构建新操作系统的chroot基础环境,然后chroot进入
新构建的操作系统环境来安装和配置。这种构建和安装操作系统的方法,对于我们学习和研究操作系统结构和原理应该说比较重要。本文举了简单的例子,以
Fedora Core 5.0 为基础,通过chroot来构建Slackware 10.2;
++++++++++++++++++++++++++++++++++++++++++++ 正文 ++++++++++++++++++++++++++++++++++++++++++++
1、chroot方式安装操作系统的目的和用途;
chroot
工具是Linux操作系统都具备的工具,从表面的意思看,chroot
是从一个/根到另一个/根。在一个Linux操作系统中安装另一个操作系统,就是利用chroot的这个特点。首先创建chroot运行的基础环境,然后
通过chroot到新的/根,然后再用相应的软件包管理工具把新的操作系统其它软件包安装上;
几乎所有的开源操作系统都可以用
chroot的方法来安装,比如Gentoo
、LFS及CRUX比较常用chroot;通过chroot安装操作系统,好象堆积木一样,一块一块的把操作系统安装起来,所以Gentoo和LFS的
Fans特别有成就感。呵,也说是操作系统全手工打造,成就感自然不言而喻了; 通过chroot安装操作系统,我们能学到什么呢?主要是能知道一个操作系统最少需要多少部件可以“动”起来,以及了解一个操作系统需要哪些基础的必备的“部件”,这对开发自己的基于Linux操作系统以及了解操作系统的构成及原理是比较重要的; 2、通过chroot 方式安装操作系统所需要的系统环境;
最根本的环境是是在您的机器有得有一个能运行的Linux操作系统或一个LiveCD; 3、通过chroot 安装操作系统的流程;
要下面几个流程:
一、规划硬盘分区或创建映像文件;请参考:《实例解说 fdisk 使用方法》 二、创建文件系统;《存储设备分区操作及文件系统管理概述》 三、挂载文件系统;《Linux 创建文件系统及挂载文件系统流程详解》 四、安装基础系统;主要通过解压软件包来实现; 五、修改新系统的配置文件,比如 位于新系统中的/etc/fstab 六、解决依赖关系,安装软件包管理工具; 七、通过chroot进入新系统; 八、通过新系统的软件包我管理工具来安装其它软件包; 九、处理引导问题,比如GRUB引导之类的;《系统引导管理器GRUB,为初学者指南》
4、操作系统安装安装目的地的介质说明;
一
个操作系统可以安装在物理硬盘中,也可以安装在一个映像文件中;安装在物理硬盘中大家都能理解。安装在一个映像文件中怎么理解呢?比如通过
VMWARE来虚拟安装操作系统是不是安装在一个文件中呢?是的,和这个意思差不多; 再说一点,交换分区swap
也可以是文件;再比如Xen虚拟操作系统就可以安装在文件映像中; 安装在映像文件中的操作系统,可以用来学习,通过chroot访问,也可以通过xen来虚拟等 ... ... 还可以做成类似file.iso的形式来存储文件等; 5、实说简说在Fedora 中安装Slackware 10.2;
本
例是在Fedora Core 5.0 中通过chroot 安装Slackware
10.2,安装目的地的介质分为两种,一种是物理硬盘;一种是映像文件。安装在物理硬盘的可以通过GRUB或LILO等引导管理器来独立真实运行,安装在
映像文件中的能通过chroot访问或Xen虚拟运行; 5.1 通过chroot 安装Slackware 10.2 到一个硬盘物理分区中;
这个过程好象是有点多余,但写一写也好,这是大多开源操作系统的安装都通用的,也是最原始、最有效的方法,也就是说在一个已有的操作系统环境中安装另一个操作系统;
首先:您得懂的规划您的分区,请参考:《实例解说 fdisk 使用方法》 其次:您还要知道如何创建文件系统,请参考:《存储设备分区操作及文件系统管理概述》 第三:您要知道如何挂载一个文件系统;请参考:《Linux 创建文件系统及挂载文件系统流程详解》
挂载文件系统就是通过mount 来挂载; #mount 存储设备 挂载点 举例: 比如我的硬盘/dev/hda5是空白分区,并且我想创建/dev/hda5为ext3文件系统,并且把它挂载到 /mnt/slack目录中,然后通过chroot来安装Slackware 10.2; 第一步:您要通过分区工具fdisk 或parted来规划您的分区,此步省略; 请参考:《实例解说 fdisk 使用方法》 第二步:创建文件系统;
[root@localhost ~]#mkdir /mnt/slack [root@localhost ~]# mkfs.ext3 /dev/hda5 注:格式化/dev/hda5为ext3文件系统;
第三步:挂载文件系统;
[root@localhost ~]# mount /dev/hda5 /mnt/slack 注:挂载/dev/hda5到 /mnt/slack目录;
第四步:挂载slackware 10.2 光盘的第一张,安装基础系统;
[root@localhost ~]# mount -o loop slackware-10.2-install-d1.iso /mnt/cdrom/ 我们可以先在/mnt/slack目录中创建一个软件包存放目录,用于存放slackware-10.2-install-d1.iso中的所有内容; [root@localhost ~]#mkdir /mnt/slack/pack [root@localhost ~]# cp -rp /mnt/cdrom/* /mnt/slack/pack 然后把slackware 第一张盘中的slackware目录中的a目录中的所有包都进行解压缩,以及d目录中glibc开头的包,d目录中的zlib以及zsh 并且把解出来目录,比如 /usr、etc、lib等所有目录都复制到 /mnt/slack中;
第五步:解决依赖关系;
如果我们运行下面的命令提示没有/bin/bash这个文件时,我们要解决依赖关系;通过解决依赖关系,也会发现运行chroot所需要的必备的基础软件包;[root@localhost ~]# chroot /mnt/slack 如果提示缺少一些文件,我们可以自行判断缺少哪些包;当我们进入/mnt/slack/bin目录发现,的确没有bash这个文件,所以我们要复制一个bash过去; [root@localhost ~]# cd /mnt/slack/bin [root@localhost bin]# cp bash2.new bash 这时我们还要判断 bash 所依赖的库文件; [root@localhost bin]# ldd bash 出
来的依赖关系,大多是glibc的,glibc被安装在了/mnt/slack/lib/tls目录中,我们可以根据提示一个一个的做链接。少什
么东西就做什么的链接;要看/mnt/slack/lib中是否有glibc的文件,然后做链接。如果是存放在tls目录中的,也要链到
/mnt/slack/lib中。链接时要用相对路径,不能用绝对路径; 创建链接文件和在Windows创建快捷方式比较相似,用ln 命令; #ln -s 原文件名 新文件名 什么才算解决了 bash的依赖关系了呢?直到能chroot /mmt/slack才算成功;
第六步: chroot成功,进入Slackware系统;
chroot 成功后,我们就能进入Slackware系统,然后通过pkgtool 或installpkg 工具来安装其它的软件包,比如 内核什么的; [root@localhost ~]# chroot /mnt/slack 第七步;更改/etc/fstab文件;
如果要让一个操作系统独立运行,非得写一写/etc/fstab文件,对于这个您可以参考,比如 下面的这个例子,您改一改就可以用了; /dev/hda7 swap swap defaults 0 0 /dev/hda6 / reiserfs defaults 1 1 /dev/hda1 /mnt/winc ntfs ro 1 0 /dev/hda3 /mnt/wind vfat defaults 1 0 /dev/cdrom /mnt/cdrom auto noauto,owner,ro 0 0 /dev/fd0 /mnt/floppy auto noauto,owner 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0 none /sys sysfs defaults 0 0
第八步:引导系统;
要通过GRUB或LILO引导管理器实现对Slackware的引导;不多说了,请参考 :《系统引导管理器GRUB,为初学者指南》 5.2 通过chroot把Slackware 10.2安装在一个映像文件中;
第一步:创建映像文件;
比如 我们创建一个名为slack.img的映像文件,体积为2G的,就可以用下面的命令;bs是每个块的大小为1M,共创建2000块;
[root@localhost ~]# dd if=/dev/zero of=slack.img bs=1M count=2000 seek=1024
第二步:创建文件系统;
我们可以创建为ext3、fat32或reiserfs等文件系统,创建文件系统,请参考:《存储设备分区操作及文件系统管理概述》 [root@localhost ~]# /sbin/mkfs.ext3 slack.img mke2fs 1.38 (30-Jun-2005) slack.img is not a block special device. Proceed anyway? (y,n) y
第三步:挂载已被格式化映像文件;
[root@localhost ~]# mkdir /mnt/slack [root@localhost ~]# mount -o loop slack.img /mnt/slack/
第四步以后和物理硬盘操作基本相同,省略过去;
7、chroot 成功切入新的操作系统后的软件安装问题补充;
如
果通过chroot能进入新安装的操作系统,我们就可以新操作系统的软件包管理工具来安装其它软件包了,比如 Slackware 用的是pkgtool
或installpkg工具;Fedora 用的是 rpm 等工具;大多发行版所用的工具不尽相同,以发行版为准 ; 8、关于本文;
在
去年的时候就想写此文,随着时间的推移,今天想起来的事情可能明天就忘的差不多了,所以用到chroot的时候就想写,用不到的时候就把写文档的
事扔到一边。今天正好写关于Xen的文档,也恰恰用到chroot方式安装新的操作系统,所以“被迫”中写了一篇。虽然涉及chroot的功用少了点,但
大体上还是把chroot说了差不多了;可能本文的名字有点不符合,我也不知道用什么命名标题不好。慢慢修正中... ...
还是看个chroot的使用例子吧,看过后会理解深点,在我本机上实验的,下面是log hyang0@hyang0-desktop:~$ ls 21-18-vanilla.tar.bz2 log_raza all-patch Mac_files all-patch.tar.bz2 Makefile Desktop mdadm.txt device music Documents Pictures download runtime-New_configuration Examples server-structure fc6-conf share_doc good_job test_cgl_4.0.tar.bz2 job tmp linux-2.6.18.tar.bz2 tmp_c linux-2.6.21-cgl VMware-Workstation-6.5.1-126130.i386.bundle log_cavium workspace hyang0@hyang0-desktop:~$ pwd /home/hyang0 hyang0@hyang0-desktop:~$ cd tmp hyang0@hyang0-desktop:~/tmp$ ls 0001-Add-_lib_dir-RPM-macro-to-support-openhpi-package-b-hyang0-1.patch 0001-Add-_lib_dir-RPM-macro-to-support-openhpi-package-b-hyang0.patch console-log-hpmi.log host-ip hpmi.log.tar.bz2 HRT-cavium-kernel.log hyang0@hyang0-desktop:~/tmp$ mkdir jail hyang0@hyang0-desktop:~/tmp$ cd jail/ hyang0@hyang0-desktop:~/tmp/jail$ mkdir bin lib dev mkdir usr/lib mkdir: 无法创建目录 “usr/lib”: No such file or directory hyang0@hyang0-desktop:~/tmp/jail$ mkdir -p usr/lib hyang0@hyang0-desktop:~/tmp/jail$ cp /bin/bash bin/ hyang0@hyang0-desktop:~/tmp/jail$ cp /bin/ls bin/ hyang0@hyang0-desktop:~/tmp/jail$ ls bin dev lib mkdir usr hyang0@hyang0-desktop:~/tmp/jail$ rm -rf mkdir hyang0@hyang0-desktop:~/tmp/jail$ mkdir tmp hyang0@hyang0-desktop:~/tmp/jail$ ll tmp/ 总用量 0 hyang0@hyang0-desktop:~/tmp/jail$ ls -ld tmp/ drwxr-xr-x 2 hyang0 hyang0 4096 2008-12-22 13:50 tmp/ hyang0@hyang0-desktop:~/tmp/jail$ chmod a=rwx tmp/ hyang0@hyang0-desktop:~/tmp/jail$ ls -ld tmp/ drwxrwxrwx 2 hyang0 hyang0 4096 2008-12-22 13:50 tmp/ hyang0@hyang0-desktop:~/tmp/jail$ ldd bin/* bin/bash: linux-gate.so.1 => (0xffffe000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7ed7000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7ed3000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d88000) /lib/ld-linux.so.2 (0xb7f2e000) bin/ls: linux-gate.so.1 => (0xffffe000) librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7efb000) libacl.so.1 => /lib/libacl.so.1 (0xb7ef4000) libselinux.so.1 => /lib/libselinux.so.1 (0xb7edd000) libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d93000) libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7d7b000) /lib/ld-linux.so.2 (0xb7f17000) libattr.so.1 => /lib/libattr.so.1 (0xb7d77000) libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7d73000) libsepol.so.1 => /lib/libsepol.so.1 (0xb7d32000) hyang0@hyang0-desktop:~/tmp/jail$ ls bin/ bash ls hyang0@hyang0-desktop:~/tmp/jail$ cp -a /lib/* lib cp: 无法创建特殊文件 “lib/udev/devices/loop0”: Operation not permitted cp: 无法创建特殊文件 “lib/udev/devices/kmem”: Operation not permitted cp: 无法创建特殊文件 “lib/udev/devices/net/tun”: Operation not permitted cp: 无法创建特殊文件 “lib/udev/devices/console”: Operation not permitted cp: 无法创建特殊文件 “lib/udev/devices/ppp”: Operation not permitted cp: 无法创建特殊文件 “lib/udev/devices/null”: Operation not permitted hyang0@hyang0-desktop:~/tmp/jail$ sudo cp -a /lib/* lib [sudo] password for hyang0: hyang0@hyang0-desktop:~/tmp/jail$ ls bin dev lib tmp usr hyang0@hyang0-desktop:~/tmp/jail$ cd lib/ hyang0@hyang0-desktop:~/tmp/jail/lib$ ls brltty libnss_dns.so.2 cpp libnss_files-2.6.1.so dhcp3-client libnss_files.so.2 discover libnss_hesiod-2.6.1.so firmware libnss_hesiod.so.2 i486-linux-gnu libnss_mdns4_minimal.so.2 init libnss_mdns4.so.2 iptables libnss_mdns6_minimal.so.2 klibc-lASvnk07aNkfPyCauZ-jxAx49Jk.so libnss_mdns6.so.2 ld-2.6.1.so libnss_mdns_minimal.so.2 ld-linux.so.2 libnss_mdns.so.2 libacl.so.1 libnss_nis-2.6.1.so libacl.so.1.1.0 libnss_nisplus-2.6.1.so libanl-2.6.1.so libnss_nisplus.so.2 libanl.so.1 libnss_nis.so.2 libatm.so.1 libntfs-3g.so.12 libatm.so.1.0.0 libntfs-3g.so.12.0.0 libattr.so.1 libntfs-3g.so.16 libattr.so.1.1.0 libntfs-3g.so.16.0.0 libblkid.so.1 libpamc.so.0 libblkid.so.1.0 libpamc.so.0.81.0 libbrlapi.so.0.4 libpam_misc.so.0 libbrlapi.so.0.4.1 libpam_misc.so.0.81.2 libBrokenLocale-2.6.1.so libpam.so.0 libBrokenLocale.so.1 libpam.so.0.81.6 libbz2.so.1 libparted-1.7.so.1 libbz2.so.1.0 libparted-1.7.so.1.0.0 libbz2.so.1.0.4 libpcprofile.so libc-2.6.1.so libpopt.so.0 libcap.so.1 libpopt.so.0.0.0 libcap.so.1.10 libproc-3.2.7.so libcfont.so.0 libpthread-2.6.1.so libcfont.so.0.0.0 libpthread.so.0 libcidn-2.6.1.so libreadline.so.5 libcidn.so.1 libreadline.so.5.2 libcom_err.so.2 libresolv-2.6.1.so libcom_err.so.2.1 libresolv.so.2 libconsole.so.0 librt-2.6.1.so libconsole.so.0.0.0 librt.so.1 libcrypt-2.6.1.so libSegFault.so libcrypt.so.1 libselinux.so.1 libc.so.6 libsepol.so.1 libctutils.so.0 libslang.so.2 libctutils.so.0.0.0 libslang.so.2.0.7 libdevmapper.so.1.02.1 libss.so.2 libdiscover.so.1 libss.so.2.0 libdiscover.so.1.0.0 libsysfs.so.2 libdl-2.6.1.so libsysfs.so.2.0.1 libdl.so.2 libthread_db-1.0.so libe2p.so.2 libthread_db.so.1 libe2p.so.2.3 libulockmgr.so.1 libext2fs.so.2 libulockmgr.so.1.0.1 libext2fs.so.2.4 libusb-0.1.so.4 libfuse.so.2 libusb-0.1.so.4.4.4 libfuse.so.2.7.0 libusplash.so.0 libgcc_s.so.1 libutil-2.6.1.so libhistory.so.5 libutil.so.1 libhistory.so.5.2 libuuid.so.1 libiw.so.29 libuuid.so.1.2 libkeyutils-1.2.so libvolume_id.so.0 libkeyutils.so.1 libvolume_id.so.0.78.0 libm-2.6.1.so libwrap.so.0 libmemusage.so libwrap.so.0.7.6 libm.so.6 libx86.so.1 libncurses.so.5 linux-restricted-modules libncurses.so.5.6 linux-sound-base libncursesw.so.5 lsb libncursesw.so.5.6 modules libnsl-2.6.1.so security libnsl.so.1 terminfo libnss_compat-2.6.1.so tls libnss_compat.so.2 udev libnss_dns-2.6.1.so hyang0@hyang0-desktop:~/tmp/jail/lib$ cd .. hyang0@hyang0-desktop:~/tmp/jail$ ls bin dev lib tmp usr hyang0@hyang0-desktop:~/tmp/jail$ ls usr/lib/ hyang0@hyang0-desktop:~/tmp/jail$ sudo cp -a /usr/lib/* usr/lib hyang0@hyang0-desktop:~/tmp/jail$ ls -l /dev/null /dev/zero crw-rw-rw- 1 root root 1, 3 2008-11-15 10:44 /dev/null crw-rw-rw- 1 root root 1, 5 2008-12-22 08:34 /dev/zero hyang0@hyang0-desktop:~/tmp/jail$ mknod dev/null c 1 3 mknod: “dev/null”: Operation not permitted hyang0@hyang0-desktop:~/tmp/jail$ sudo mknod dev/null c 1 3 hyang0@hyang0-desktop:~/tmp/jail$ sudo mknod dev/zero c 1 5 hyang0@hyang0-desktop:~/tmp/jail$ chmod a=rw dev/null dev/zero chmod: 正在更改 “dev/null” 的权限: Operation not permitted chmod: 正在更改 “dev/zero” 的权限: Operation not permitted hyang0@hyang0-desktop:~/tmp/jail$ sudo chmod a=rw dev/null dev/zero hyang0@hyang0-desktop:~/tmp/jail$ ls bin dev lib tmp usr hyang0@hyang0-desktop:~/tmp/jail$ man chroot Display all 6007 possibilities? (y or n) hyang0@hyang0-desktop:~/tmp/jail$ man chroot hyang0@hyang0-desktop:~/tmp/jail$ man chroot hyang0@hyang0-desktop:~/tmp/jail$ chroot --help 用法:chroot 新根目录 [命令...] 或:chroot 选项 以设定的<新根目录>为运行<命令>的根目录。
--help 显示此帮助信息并离开 --version 显示版本信息并离开
如果没有命令被指定,则运行“${SHELL} -i” (默认:/bin/sh)。
请向 <bug-coreutils@gnu.org> 报告错误。 hyang0@hyang0-desktop:~/tmp/jail$ ls bin dev lib tmp usr hyang0@hyang0-desktop:~/tmp/jail$ cd hyang0@hyang0-desktop:~$ chroot /home/hyang0/tmp/jail/ chroot: 无法将根目录切换到 /home/hyang0/tmp/jail/: Operation not permitted hyang0@hyang0-desktop:~$ sudo chroot /home/hyang0/tmp/jail/ bash-3.2# ls bin dev lib tmp usr bash-3.2# pwd / bash-3.2#
在最后通过chroot已给进到新的rootfs中了,要退出, exit就行了。
|