2009年12月28日 星期一

台哥大mu-q101行動網卡驅動方式

為自已在ubuntu-tw的文章備份一下

簡單的說就是用udev來偵測usb是否插入,並送出suspend訊號到q101,之後就可以正常使用了

在 /etc/udev/rules.d 新增一個 udev rule (順序建議可以小一點,避免被其他rule蓋掉,這裡以 30-q101.rules 為例)
#
# first, q101 will be detected as usb_storage of 0408:1000
# you have to force it suspend to change running mode from
# storage to 3.5g card

SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ACTION=="add", ATTRS{idVendor}=="0408", ATTRS{idProduct}=="1000", RUN+="/bin/sh -c 'cd /sys$env{DEVPATH};until test -f power/level;do cd ..;done;if [ -f power/level ];then echo suspend > power/level;fi'"

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暫存檔,即可恢復原狀。

2009年12月22日 星期二

patch wine source for D2GS

先準備編譯環境
sudo apt-get build-dep wine
下載源碼
apt-get source wine
編輯server/sock.c
if ((event & POLLOUT) && (sock->state & FD_WRITE))
{
sock->state &= ~FD_WRITE;
sock->pmask |= FD_WRITE;
sock->hmask |= FD_WRITE;
編譯、安裝
dpkg-buildpackage -us -uc -b
sudo dpkg -i wine_*.deb
開啟regedit,將EnableNTMode設為零
啟動虛擬X server
Xvfb :1 &
執行D2GS
DISPLAY=:1 wine d2gs

2009年12月14日 星期一

uml的網路設定

host端 (ip設定為10.222.222.254/24)
在/etc/network/interface中設定一個新的tap裝置

auto tap0
iface tap0 inet static
address 10.222.222.254
netmask 255.255.255.0
tunctl_user uml-net
up /etc/network/uml.sh
down /etc/network/uml.sh
uml.sh內容
#!/bin/sh
case $MODE in
start)
iptables -t nat -A POSTROUTING -s $IF_ADDRESS/$IF_NETMASK -j MASQUERADE
;;
stop)
iptables -t nat -D POSTROUTING -s $IF_ADDRESS/$IF_NETMASK -j MASQUERADE
;;
esac
使用sysctl開啟ip forwarding
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-uml.conf
修改/etc/default/uml_utilities以符合設定
# Options to pass to uml_switch.

# set to "false" if you want to prevent uml_switch from
# starting with SysV scripts in /etc/init.d
# UML_SWITCH_START="false"

# For preconfigured tap setup, see
# /usr/share/doc/uml-utilities/examples/interfaces.example
UML_SWITCH_OPTIONS="-tap tap0"

# User as which to run uml_switch
UML_SWITCH_USER="uml-net"

# Socket file to use
# Debian's default is:
#UML_SWITCH_CTL="/var/run/uml-utilities/uml_switch.ctl"
#
# if you instead use your rolled up kernel from upstream
# sources you may want to uncomment the following:
UML_SWITCH_CTL="/tmp/uml.ctl"

uml client端依正常方式設定,gateway設成host端ip就好

執行

./linux ubd0=root_fs mem=512M eth0=daemon

UML建置筆記

因為bash對env vars的處理方方式改變,必須使用2.6.32-rc2以後的kernel source才行
指令勿照抄

首先配置虛擬的root fs(以下指令大多需root權限)先用dd產生虛擬磁碟:
dd if=/dev/zero of=root_fs bs=1 count=5G
格式化成ext4(或其他格式)
mkfs.ext4 -L uml -F root_fs
掛載
mount -o loop root_fs /mnt
安裝debian squeeze基本系統
debootstrap squeeze /mnt http://ftp.tw.debian.org/debian
修改基本設定
cp /etc/hosts /mnt/etc/hosts
echo "/dev/ubd/0 / ext4 errors=remoount-ro 0 1">/mnt/etc/fstab
chroot進去做細部設定
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -t devpts none /mnt/dev/pts
chroot /mnt
配置編譯kernel所需要的環境
apt-get build-dep linux-2.6
下載新版source,解開編譯source(要記得把使用到的fs type編進kernel裡)
make defconfig ARCH=um
make menuconfig ARCH=um
make ARCH=um
make modules ARCH=um
安裝kernel modules
make modules_install ARCH=um
退出chroot環境
exit
把kernel複製出來
cp /mnt/path/to/linux .
還原chroot工作環境
umount /mnt/proc /mnt/sys /mnt/dev/pts /mnt
修改owner,避免以root執行造成破壞的可能性
chown user_id:user_id linux root_fs
備份一下root_fs之後(避免玩壞了還要重建一份),就可以開機進行更進一步的調整、測試了(不需root權限)
./linux mem=512M ubd0=root_fs