2009年12月26日 星期六

建構一個適合測試套件編譯及相依設定的uml環境

為了簡化測試的步驟,將會在uml環境中設定ssh server及一個本地的源碼套件庫。
  • 首先,需要準備一個uml kernel(為了使用高效能的ext4,建議按照UML建置筆記的方式自行編譯)
    uml kernel可以放在/usr/bin裡,方便未來使用,以下皆以/path/to/uml/kernel指稱。
  • 產生root fs,大小視想測試的套件而定;若編譯時的相依套件不多,又沒有用到X視窗的話,1G左右的空間就相當充裕了,否則建議設2G以上(以下以1024x1024x2000 bytes,約2G為例)
    dd if=/dev/zero of=root_fs bs=1024 count=2048000
    格式化(以ext4為例)
    mkfx.ext4 -f root_fs
    掛載並配置基本的系統(以Ubuntu karmic為例)
    sudo mount -o loop root_fp /mnt
    debootstrap karmic mnt
    cp /etc/hosts /mnt/etc
    echo "/dev/ubd0 / ext4 errors=remount-ro 0 1" > /mnt/etc/fstab
    參考uml的網路設定來設定網路(以下host端ip指定為192.168.1.1,uml端為192.168.1.2)
    chroot進入root_fs,變更root密碼以避免初次啟動uml時無法登入
    mount -t proc proc /mnt/proc
    mount -t sysfs sys /mnt/sys
    sudo su -c "chroot /mnt passwd"
    將ssh key複製到root_fs中,避免重複打密碼的麻煩
    sudo mkdir -p /mnt/root/.ssh
    sudo cp ~/.ssh/id_rsa.pub /mnt/root/.ssh/authorized_keys
    取消掛載root_fs
    sudo umount /mnt
  • 進入uml環境,準備作細部微調
    /path/to/uml/kernel ubd0=root_fs mem=256M eth0=daemon

    以下皆在uml環境中執行

    修改系統時區、產生一個一般使用者等事項不再一一贅述。
    安裝基本的編譯環境
    aptitude -y install autoconf build-essential
    產生要測試的source套件庫結構
    mkdir -p /repo/src
    修改source.list,保留必要的套件庫,同時移除所有的源碼套件庫後,加上本地的源碼套件庫
    deb-src file:/repo src/
    關閉uml
    shutdown -h now
  • 編輯dput設定檔(通常是~/.dput.cf),加入用專用項目
    [uml]
    fqdn = 192.168.1.2
    method = scp
    incoming = /repo/src
    login = root
    allow_unsigned_uploads = 0
    post_upload_command = ssh root@192.168.1.2 "cd /repo && dpkg-scansources src | gzip > src/Sources.gz && apt-get update"

至此,uml環境已建立完成,未來只需使用uml內建的cow功能便可重複測試而不需備份或再次建置。

測試套件的步驟:
  1. 開啟cow功能,啟動uml(假設cow暫存檔的位置是/tmp/cow)
    /path/to/uml/kernel mem=256M ubd0=/tmp/cow:root_fs eth0=daemon
  2. 從host端以dput將源碼套件傳入uml環境
    dput uml package_version.changes
  3. 切換至uml視窗以一般使用者登入(或以ssh方式代替),按正常方式編譯套件。例如:
    sudo apt-get build-dep package
    apt-get source package
    cd package-version
    dpkg-buildpackage
關閉uml環境後刪除cow暫存檔,即可恢復原狀。