close

 

如果有時想要研究一下整個系統的 flow 是怎麼跑的...比如說在測試 kernel 的某個 system call 是怎麼跑的, 還是系統開機的整個 flow 或是 grub2 是怎麼運作的..這時如果是在自己的機器上測試 就要不斷的compiler,reboot, compiler,reboot 慘一點的還會掛掉 導致自己的系統當掉 可能不小心改錯了什麼東西之類的等等... 如果你有這樣的需求 我想本篇也是可以讓你參考的一個方法...

在 ubuntu 中有一個 debootstrap 的命令就是能提供我們在現行的機器上去 deploy 一個最陽春的 minimum system.這個系統是不含 X-window 的 base system. 當然如果想要跑 X 那當然就需要把相關的 library 裝進來即可.

現在我們就來裝一個有 lxde 桌面環境的 base system 吧!

首先,先在你的機器上建一個directory, 假設是 ubunbu-scratch

mkdir ubunbu-scratch

接下來, cd ubuntu-scratch

sudo debootstrap --arch=i386 jaunty . http://debian.nctu.edu.tw/ubuntu/ 

(以 jaunty 當成我們的 target, 當然如果要選 intrepid 也可以)
後面的URL - http://debian.nctu.edu.tw/ubuntu/ 可有可無, 不過還是設一下 選擇離自己近的mirror 還是比較好的哩
當然如果你的 ubuntu 是比較舊的版本的 你可能會發現你的 /usr/lib/debootstrap/scripts/ 裡面沒有相應的scripts,這時該怎麼辦呢?

兩個辦法..

1 - 去抓新版的 debootstrap 安裝(廢話)

2 - 硬幹 cp /usr/lib/debootstrap/scripts/{intrepid, januty}之前試過好像勉強可以不過還是不建議啦...

好啦 接下來你會看到一個訊息 base system install completely. 這樣就完成囉! 一個不帶 X-window system 的小環境.

接下來我們就進來這個環境來安裝X-window.

sudo chroot  ubunbu-scratch env -i HOME=/root TERM=xterm /bin/bash --login

會用env -i 的原因是因為不想要讓現存的環境inherit parent shell variable, 同時指定 HOME 和 XTERM 環境變數 如果沒有指定到時會有一堆警告訊息看了很不舒服 ...^^

接下來先umount /proc; umount /sys; 因為chroot 進去後會有一些假象,你實際上沒有 mount 但是它確會出現所以還是先 umount 掉 然後再

mount -t proc proc /proc; mount -t sysfs sys /sys;

mount -t devpts devpts /dev/pts 這個記得要 mount 不然到時裝 X 時和要使用 terminal 時會有問題

接下來先修改一下 /etc/apt/sources.list 將

deb http://debian.nctu.edu.tw/ubuntu jaunty main -> 換成 deb http://debian.nctu.edu.tw/ubuntu jaunty main
 universe mutiverse

apt-get update

接下來要安裝前 先export 兩個東西

export LC_ALL=C

export PATH=$PATH:/usr/bin/

不然又一堆討人厭的警視訊息...

接下來要開始安裝 lxde 囉

apt-get install lxde xinit x11-apps linux-image-2.6.28-11-generic (後面 qemu 會使用到)

慢慢等 這個就會有一點久 ...

到此為止一個 X-window 和 base system 就安裝完成囉....

再還沒談到 qemu 時 我們先來想一個問題 .. 今天如果你在 chroot 的環境 你有build了一個 ap 但是他因為 library dependency 的問題 你沒辦法在非 chroot 的環境下執行 但你又想看一下他現在的執行狀況 這時該怎麼辦呢?  有沒有辦法 讓這個 AP 使用到上層的 X  server 呢? 答案是肯定的.

由於上層的 X server 有一個 .Xauthority (/home/YOUR_ID/.Xauthority) 的檔案,這個檔案記載了 X server 的認證資訊 它是採用 MIT-MAGIC-COOKIE-1 的一個認證協定.

我們只要把這個資訊傳遞到 chroot 的環境當中 如此一來我們就可以使用上層 X 來 display 了.

xauth extract /tmp/display $DISPLAY

這個指令另的意思是將現行的 $DISPLAY 的資訊轉存到 /tmp/display 的檔案當中.這時我們可以開另一個 console 把 /tmp 這個目錄 bind 到 choort environment 的 tmp 目錄中

sudo mount -obind /tmp ubuntu-scratch/tmp

然後在chroot 環境中 xauth merge /tmp/display 如此這個 .Xauthority 就會被安裝到 /root/的 .Xauthority 中

然後再 export DISPLAY=:0  這樣就完成了.  你可以在chroot 環境中執行 xeyes(包含在x11-apps) 就可以發現它會顯示出來囉!

xeyes.jpeg

好啦 扯了這麼多 現在又回過頭來說一下qemu了... 在前面我們已經有裝了 linux-image-2.6.28-11-generic 所以現在我們就要用這一包的 kernel 和 initrd 來開進 X...

首先在 ubunbu-scratch 裡面我們先將 filesystem 瘦身因為剛剛安裝的所有 deb file 都會存在 /var/cache/apt/archives 當中,我們可以使用 apt-get clean 來清除這些檔案..

接下來我們利用  qemu-img create ubuntu-qemu.lxde 2GB 來產生一個 qemu raw format 的 virtual disk file.

mkfs.ext2 -F ubuntu-qemu.lxde

然後 sudo mount -oloop ubuntu-qemu.lxde TARGET(你所建的任意DIR).

把所有檔案丟進去TARGET, rsync -av ubuntu-scratch TARGET, 然後把boot folder 下的 vmlinuz-2.6.28-11-generic, 和 initrd.img-2.6.28-11-generic 先弄出來

因為 X 預設不能讓 root login 所以我們事先得先開一個帳號 所以一樣再chroot的還境下 做如下的動作

useradd ubuntu

passwd ubuntu

mkdir /home/ubuntu; cp /etc/skel/* ubuntu/

chown -R ubuntu.ubuntu /home/ubuntu/

(當然如果你要用useradd也是可以的 只是習慣問題而已)

這個完成後再 sudo umount TARGET.

把下面這個shell script 存成 boot.qemu.

#!/bin/sh
qemu -kernel vmlinuz-2.6.28-11-generic -initrd initrd.img-2.6.28-11-generic -std-vga -hda ubuntu-qemu.lxde -append "root=/dev/sda rw" > /dev/null 2>&1 &

sudo ./boot.qemu 就可以成功的開進去了...

lxde.jpeg

lxde

剛剛被綱哥點 說怎麼內容這麼少 所以 再補充一個

Based on 前面所說的 環境 如果今天你只是單純的想啟動 chroot 下的 X server 和 lxde 試一下 你所做過的變動 比如說 改了某些設定 等等..

那要怎麼辦呢?

X window下有提供一個 Nested X server, 只要把這個東西給裝起來 就可以了 apt-get install xnset.

then xinit /etc/X11/Xsession -- /usr/bin/Xnest :1

這樣也是可以的.

arrow
arrow
    全站熱搜

    sakbk 發表在 痞客邦 留言(1) 人氣()