小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

通過chroot 構(gòu)建Linux操作系統(tǒng)概要

 guitarhua 2012-07-19

通過chroot 構(gòu)建Linux操作系統(tǒng)概要

通過chroot 構(gòu)建Linux操作系統(tǒng)概要

作者:北南南北
來自:LinuxSir.Org
提要:在 已有的Linux操作系統(tǒng)中,安裝另一個開源操作系統(tǒng),我們一般是先構(gòu)建新操作系統(tǒng)的chroot基礎(chǔ)環(huán)境,然后chroot進入 新構(gòu)建的操作系統(tǒng)環(huán)境來安裝和配置。這種構(gòu)建和安裝操作系統(tǒng)的方法,對于我們學習和研究操作系統(tǒng)結(jié)構(gòu)和原理應該說比較重要。本文舉了簡單的例子,以 Fedora Core 5.0 為基礎(chǔ),通過chroot來構(gòu)建Slackware 10.2;



++++++++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++++++++


1、chroot方式安裝操作系統(tǒng)的目的和用途;

chroot 工具是Linux操作系統(tǒng)都具備的工具,從表面的意思看,chroot 是從一個/根到另一個/根。在一個Linux操作系統(tǒng)中安裝另一個操作系統(tǒng),就是利用chroot的這個特點。首先創(chuàng)建chroot運行的基礎(chǔ)環(huán)境,然后 通過chroot到新的/根,然后再用相應的軟件包管理工具把新的操作系統(tǒng)其它軟件包安裝上;

幾乎所有的開源操作系統(tǒng)都可以用 chroot的方法來安裝,比如Gentoo 、LFS及CRUX比較常用chroot;通過chroot安裝操作系統(tǒng),好象堆積木一樣,一塊一塊的把操作系統(tǒng)安裝起來,所以Gentoo和LFS的 Fans特別有成就感。呵,也說是操作系統(tǒng)全手工打造,成就感自然不言而喻了;

通過chroot安裝操作系統(tǒng),我們能學到什么呢?主要是能知道一個操作系統(tǒng)最少需要多少部件可以“動”起來,以及了解一個操作系統(tǒng)需要哪些基礎(chǔ)的必備的“部件”,這對開發(fā)自己的基于Linux操作系統(tǒng)以及了解操作系統(tǒng)的構(gòu)成及原理是比較重要的;


2、通過chroot 方式安裝操作系統(tǒng)所需要的系統(tǒng)環(huán)境;

最根本的環(huán)境是是在您的機器有得有一個能運行的Linux操作系統(tǒng)或一個LiveCD;


3、通過chroot 安裝操作系統(tǒng)的流程;

要下面幾個流程:

一、規(guī)劃硬盤分區(qū)或創(chuàng)建映像文件;請參考:《實例解說 fdisk 使用方法》
二、創(chuàng)建文件系統(tǒng);《存儲設(shè)備分區(qū)操作及文件系統(tǒng)管理概述》
三、掛載文件系統(tǒng);《Linux 創(chuàng)建文件系統(tǒng)及掛載文件系統(tǒng)流程詳解》
四、安裝基礎(chǔ)系統(tǒng);主要通過解壓軟件包來實現(xiàn);
五、修改新系統(tǒng)的配置文件,比如 位于新系統(tǒng)中的/etc/fstab
六、解決依賴關(guān)系,安裝軟件包管理工具;
七、通過chroot進入新系統(tǒng);
八、通過新系統(tǒng)的軟件包我管理工具來安裝其它軟件包;
九、處理引導問題,比如GRUB引導之類的;《系統(tǒng)引導管理器GRUB,為初學者指南》


4、操作系統(tǒng)安裝安裝目的地的介質(zhì)說明;

一 個操作系統(tǒng)可以安裝在物理硬盤中,也可以安裝在一個映像文件中;安裝在物理硬盤中大家都能理解。安裝在一個映像文件中怎么理解呢?比如通過 VMWARE來虛擬安裝操作系統(tǒng)是不是安裝在一個文件中呢?是的,和這個意思差不多; 再說一點,交換分區(qū)swap 也可以是文件;再比如Xen虛擬操作系統(tǒng)就可以安裝在文件映像中;

安裝在映像文件中的操作系統(tǒng),可以用來學習,通過chroot訪問,也可以通過xen來虛擬等 ... ... 還可以做成類似file.iso的形式來存儲文件等;


5、實說簡說在Fedora 中安裝Slackware 10.2;

本 例是在Fedora Core 5.0 中通過chroot 安裝Slackware 10.2,安裝目的地的介質(zhì)分為兩種,一種是物理硬盤;一種是映像文件。安裝在物理硬盤的可以通過GRUB或LILO等引導管理器來獨立真實運行,安裝在 映像文件中的能通過chroot訪問或Xen虛擬運行;


5.1 通過chroot 安裝Slackware 10.2 到一個硬盤物理分區(qū)中;

這個過程好象是有點多余,但寫一寫也好,這是大多開源操作系統(tǒng)的安裝都通用的,也是最原始、最有效的方法,也就是說在一個已有的操作系統(tǒng)環(huán)境中安裝另一個操作系統(tǒng);

首先:您得懂的規(guī)劃您的分區(qū),請參考:《實例解說 fdisk 使用方法》
其次:您還要知道如何創(chuàng)建文件系統(tǒng),請參考:《存儲設(shè)備分區(qū)操作及文件系統(tǒng)管理概述》
第三:您要知道如何掛載一個文件系統(tǒng);請參考:《Linux 創(chuàng)建文件系統(tǒng)及掛載文件系統(tǒng)流程詳解》

掛載文件系統(tǒng)就是通過mount 來掛載;

#mount 存儲設(shè)備    掛載點

舉例:

比如我的硬盤/dev/hda5是空白分區(qū),并且我想創(chuàng)建/dev/hda5為ext3文件系統(tǒng),并且把它掛載到 /mnt/slack目錄中,然后通過chroot來安裝Slackware 10.2;

第一步:您要通過分區(qū)工具fdisk 或parted來規(guī)劃您的分區(qū),此步省略;

請參考:《實例解說 fdisk 使用方法》


第二步:創(chuàng)建文件系統(tǒng);

[root@localhost ~]#mkdir /mnt/slack
[root@localhost ~]# mkfs.ext3 /dev/hda5 注:格式化/dev/hda5為ext3文件系統(tǒng);


第三步:掛載文件系統(tǒng);

[root@localhost ~]# mount /dev/hda5 /mnt/slack 注:掛載/dev/hda5到 /mnt/slack目錄;

第四步:掛載slackware 10.2 光盤的第一張,安裝基礎(chǔ)系統(tǒng);

[root@localhost ~]# mount -o loop slackware-10.2-install-d1.iso /mnt/cdrom/

我們可以先在/mnt/slack目錄中創(chuàng)建一個軟件包存放目錄,用于存放slackware-10.2-install-d1.iso中的所有內(nèi)容;

[root@localhost ~]#mkdir /mnt/slack/pack
[root@localhost ~]# cp -rp /mnt/cdrom/* /mnt/slack/pack

然后把slackware 第一張盤中的slackware目錄中的a目錄中的所有包都進行解壓縮,以及d目錄中g(shù)libc開頭的包,d目錄中的zlib以及zsh 并且把解出來目錄,比如 /usr、etc、lib等所有目錄都復制到 /mnt/slack中;

第五步:解決依賴關(guān)系;

如果我們運行下面的命令提示沒有/bin/bash這個文件時,我們要解決依賴關(guān)系;通過解決依賴關(guān)系,也會發(fā)現(xiàn)運行chroot所需要的必備的基礎(chǔ)軟件包;[root@localhost ~]# chroot /mnt/slack

如果提示缺少一些文件,我們可以自行判斷缺少哪些包;當我們進入/mnt/slack/bin目錄發(fā)現(xiàn),的確沒有bash這個文件,所以我們要復制一個bash過去;

[root@localhost ~]# cd /mnt/slack/bin
[root@localhost bin]# cp bash2.new bash

這時我們還要判斷 bash 所依賴的庫文件;

[root@localhost bin]# ldd bash

出 來的依賴關(guān)系,大多是glibc的,glibc被安裝在了/mnt/slack/lib/tls目錄中,我們可以根據(jù)提示一個一個的做鏈接。少什 么東西就做什么的鏈接;要看/mnt/slack/lib中是否有g(shù)libc的文件,然后做鏈接。如果是存放在tls目錄中的,也要鏈到 /mnt/slack/lib中。鏈接時要用相對路徑,不能用絕對路徑;
創(chuàng)建鏈接文件和在Windows創(chuàng)建快捷方式比較相似,用ln 命令;

#ln -s 原文件名   新文件名

什么才算解決了 bash的依賴關(guān)系了呢?直到能chroot /mmt/slack才算成功;

第六步: chroot成功,進入Slackware系統(tǒng);

chroot 成功后,我們就能進入Slackware系統(tǒng),然后通過pkgtool 或installpkg 工具來安裝其它的軟件包,比如 內(nèi)核什么的;

[root@localhost ~]# chroot /mnt/slack


第七步;更改/etc/fstab文件;

如果要讓一個操作系統(tǒng)獨立運行,非得寫一寫/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


第八步:引導系統(tǒng);

要通過GRUB或LILO引導管理器實現(xiàn)對Slackware的引導;不多說了,請參考 :《系統(tǒng)引導管理器GRUB,為初學者指南》


5.2 通過chroot把Slackware 10.2安裝在一個映像文件中;


第一步:創(chuàng)建映像文件;

比如 我們創(chuàng)建一個名為slack.img的映像文件,體積為2G的,就可以用下面的命令;bs是每個塊的大小為1M,共創(chuàng)建2000塊;

[root@localhost ~]# dd if=/dev/zero of=slack.img bs=1M count=2000 seek=1024

第二步:創(chuàng)建文件系統(tǒng);

我們可以創(chuàng)建為ext3、fat32或reiserfs等文件系統(tǒng),創(chuàng)建文件系統(tǒng),請參考:《存儲設(shè)備分區(qū)操作及文件系統(tǒng)管理概述》

[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 成功切入新的操作系統(tǒng)后的軟件安裝問題補充;

如 果通過chroot能進入新安裝的操作系統(tǒng),我們就可以新操作系統(tǒng)的軟件包管理工具來安裝其它軟件包了,比如 Slackware 用的是pkgtool 或installpkg工具;Fedora 用的是 rpm 等工具;大多發(fā)行版所用的工具不盡相同,以發(fā)行版為準 ;


8、關(guān)于本文;

在 去年的時候就想寫此文,隨著時間的推移,今天想起來的事情可能明天就忘的差不多了,所以用到chroot的時候就想寫,用不到的時候就把寫文檔的 事扔到一邊。今天正好寫關(guān)于Xen的文檔,也恰恰用到chroot方式安裝新的操作系統(tǒng),所以“被迫”中寫了一篇。雖然涉及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: 無法創(chuàng)建目錄 “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: 無法創(chuàng)建特殊文件 “l(fā)ib/udev/devices/loop0”: Operation not permitted
cp: 無法創(chuàng)建特殊文件 “l(fā)ib/udev/devices/kmem”: Operation not permitted
cp: 無法創(chuàng)建特殊文件 “l(fā)ib/udev/devices/net/tun”: Operation not permitted
cp: 無法創(chuàng)建特殊文件 “l(fā)ib/udev/devices/console”: Operation not permitted
cp: 無法創(chuàng)建特殊文件 “l(fā)ib/udev/devices/ppp”: Operation not permitted
cp: 無法創(chuàng)建特殊文件 “l(fā)ib/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” 的權(quán)限: Operation not permitted
chmod: 正在更改 “dev/zero” 的權(quán)限: 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 選項
以設(shè)定的<新根目錄>為運行<命令>的根目錄。

      --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就行了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多