如果有時想要研究一下整個系統的 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) 就可以發現它會顯示出來囉!
好啦 扯了這麼多 現在又回過頭來說一下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
剛剛被綱哥點 說怎麼內容這麼少 所以 再補充一個
Based on 前面所說的 環境 如果今天你只是單純的想啟動 chroot 下的 X server 和 lxde 試一下 你所做過的變動 比如說 改了某些設定 等等..
那要怎麼辦呢?
X window下有提供一個 Nested X server, 只要把這個東西給裝起來 就可以了 apt-get install xnset.
then xinit /etc/X11/Xsession -- /usr/bin/Xnest :1
這樣也是可以的.