2016年4月13日 星期三

正式成為 Ubuntu 社群成員

一些 FLOSS 社群朋友都知道我在 Canonical 台北分公司工作,不過在 Canonical 公司工作的員工並不代表是正式的 Ubuntu 社群成員,正式的 Ubuntu 社群成員會有 https://wiki.ubuntu.com/Membership#Ubuntu_Community 所提到的權利。

像是可以使用 Ubuntu logo 來印名片、可以在社群會議上投票、有個 @ubuntu.com 的 Email alias、有 1~1.5 GB 的 http://people.ubuntu.com/~fourdollars 空間、Mark Shuttleworth 親筆簽名的證書之類的。

其實我工作的部門與 Ubuntu 社群完全無關,主要是在處理個人電腦、筆記電腦上面預載 Ubuntu OEM 客製化版本,這樣的工作也做了六年多了,還是在做差不多的事情,而成為正式認證過的 Ubuntu 社群成員並不在我的工作要求之中,完全只是我個人的興趣,也是我個人進入 Canonical 公司的小小目標之一。

這次我取得資格是 Ubuntu Contributing Developer,這是開發者路線的第一個升級,正式的 Ubuntu 社群成員其實有許多不同的發展路線,有翻譯的、QA 的、美術的、文件的、本地社群經營之類的,而我目前只是專注在開發者這條路線上面而已,有點像是電玩游戲裡面的職業一樣,每個職業有自己技能樹的發展,只是正式的 Ubuntu 社群成員可以同時發展不同的職業,以後有機會再來分享,如果對於 Ubuntu 開發者路線有興趣的人不妨參加每週二的 TOSSUG 聚會,可以跟我聊聊。

BTW,TOSSUG 聚會也有在進行 Debian 開發者路線的活動,有興趣的人也可以來參加。

2016年3月5日 星期六

在 Debian/Ubuntu amd64 上面解決 Google Chrome 更新的問題 (2016/03/11 已修正)

Google Chrome 已經不再提供 Linux i386 的版本,所以在 Debian/Ubuntu amd64 使用上可能會遇到下面的問題,並不會導致無法正常更新系統,只是老是看到它很討厭。

W: 無法取得 https://dl.google.com/linux/chrome/deb/dists/stable/Release,在 Release 檔案找不到要有的「main/binary-i386/Packages」項目 (sources.list 項目有問題或檔案格式不對)

E: 某些索引檔未能下載。其已遭略過,或改為使用舊的。

此時可以參考 https://wiki.debian.org/Multiarch/HOWTO 將 /etc/apt/sources.list.d/google-chrome.list 內容修改成下面這樣就可以解決問題了。

deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main

2016/03/07 補充:

修改後隔天又恢復原狀了,查了一下是 /etc/cron.daily/google-chrome 的關係,所以只能等到 Issue 1759243002: Add multiarch specification to apt repo config. 被釋出到穩定版本才能真正解決問題。

2016/03/11 補充:

google-chrome-stable 49.0.2623.87-1 已經修好了

2015年11月17日 星期二

第一次上傳 Debian package 到 Debian 上去

今天是我正式成為 Debian Maintainer (DM) 之後,第一次自己直接上傳套件到 Debian 裡面。

成為 DM 之後,必需要有 Debian Developer (DD) 的幫忙,開特定套件的上傳權限,DM 才能夠自己上傳套件。

我正在處理的是 kore - Fast SPDY capable web server for web development in C

我參考 DebianMaintainer/Tutorial - Debian Wiki,先用 git-buildpackage -S -sa 將 Debian source package 創建出來,然後再用 sbuild -s -A -d sid-amd64 kore_1.2.3-2.dsc 來編譯成 Debian binary package,然後再用 debsign kore_1.2.3-2_amd64.changes 簽上數位簽章,然後用 dput ftp-master kore_1.2.3-2_amd64.changes 上傳。

只是上傳後馬上收到一封 kore_1.2.3-2_amd64.changes REJECTED 的通知信,覺得很奇怪,我的步驟跟方法應該都正確啊!為什麼會有問題呢?

No target suite found. Please check your target distribution and that you uploaded to the right archive.

===

Please feel free to respond to this email if you don't understand why
your files were rejected, or if you upload new files which address our
concerns.

後來到 OFTC IRC 的 #debian-mentors 求助,結果有人叫我去檢查 kore_1.2.3-2_amd64.changes 的內容,然後我發現了。

...
Distribution: sid-amd64
...

原來是 sbuild 時指定使用了 sid-amd64,所以產生出來的 kore_1.2.3-2_amd64.changes 自然也會是寫著 sid-amd64,手動將它改成 Distribution: unstable 後,再用 debsign 簽章一下用 dput 上傳後就順利的進去了。

2015年11月9日 星期一

手動快速編譯 Ubuntu 14.04 當中 Linux kernel 裡面的 i915 module

首先要下載 Linux kernel source tree

$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-trusty.git

然後進去該目錄,並且切換到 vivid branch (這邊使用的是 Ubuntu 14.04 當中 LTS Enablement Stacks 當中的 vivid)

$ git checkout -b vivid origin/lts-backport-vivid

快速產生目標的 .config

$ cat debian.vivid/config/config.common.ubuntu debian.vivid/config/amd64/config.common.amd64 debian.vivid/config/amd64/config.flavour.generic > .config

執行一些設定腳本

$ make oldconfig && make prepare && make scripts

設定環境變數 (接下來會使用到)

$ export KDIR=$PWD

複製 Module.symvers (如果要編譯的 Linux kernel 跟系統所使用的剛好相同)

$ cp -v /lib/modules/$(uname -r)/build/Module.symvers Module.symvers

不然就需要至少編譯整個 Linux kernel 一遍才行 (-j? 可以參考 /proc/cpuinfo 的數量來決定)

$ make -j8

切換到該 module 的目錄底下,不過 Ubuntu 的 Linux kernel 目前有兩份不同的 i915 module,一份放在 drivers/gpu/drm/i915 底下,另一份放在 ubuntu/i915 底下。

$ cd drivers/gpu/drm/i915

或是

$ cd ubuntu/i915

然後開始編譯 (J=? 可以參考 /proc/cpuinfo 的數量來決定)

$ make -C $KDIR M=$PWD J=8

參考資料:Kernel/BuildYourOwnKernel - Ubuntu WikiDocumentation/kbuild/modules.txt

2015年9月29日 星期二

在 Mac mini (PowerPC) 上面安裝 Lubuntu 15.10

我有一台 1.42GHz Mac mini,這幾天台灣颱風天沒事做就試著將 Debian/Ubuntu 安裝上去,試了許多方法,最後選擇了安裝 Lubuntu 15.10 最小安裝。

首先是到 http://ports.ubuntu.com/ubuntu-ports/dists/wily/main/installer-powerpc/current/images/powerpc/netboot/ 下載 mini.iso 燒錄到一張可覆寫光碟上面,然後在啟動 Mac mini (PowerPC) 時按住鍵盤上的 C 鍵讓系統從光碟開機,開機後會看到停在 Yaboot 的 boot: 提示字元,此時直接按下 Enter 鍵就可以進入安裝介面,或者是輸入 install radeon.tv=0 進入安裝介面。

只是過程中間手動設定使用 free.nchc.org.tw 的 Ubuntu 檔案鏡像站,目錄則是維持使用 /ubuntu-ports/ 這樣。


之後的安裝過程跟一般的 Debian/Ubuntu netboot 安裝方式相同,如同之前分享過的 Lubuntu 14.04 的最小安裝 來安裝系統。

安裝完成後要自己調整一下系統,首先是顯示的部份,要修改 /etc/yaboot.conf 在 Kernel 參數加上 radeon.tv=0,這樣才能夠將沒有在使用的 S-video 輸出關掉,修改完後需要執行一下 sudo ybin -v 更新開機設定。

接下來是音效的部份,要將 /etc/modprobe.d/blacklist.local.conf 整個移除掉,或是將裡面的內容都註解掉。

# Local module settings
# Created by the Debian installer

#blacklist snd-aoa-codec-tas
#blacklist snd-aoa-fabric-layout
#blacklist snd-aoa-i2sbus
#blacklist snd-aoa-soundbus
#blacklist snd-aoa

然後是修改 /etc/modules 將 snd-powermac 註解掉,然後加上其它需要載入的 kernel modules。

#snd-powermac
snd_aoa_i2sbus
snd_aoa_fabric_layout
snd_aoa_codec_tas
snd_aoa_codec_onyx

最後是 WiFi 的部份要手動安裝 linux-firmware-nonfree_1.14ubuntu1_all.deb,並且鎖住版號不要更新。

echo "linux-firmware-nonfree hold" | sudo dpkg --set-selections

主要是需要下面列出的軔體檔案。

/lib/firmware/b43/ucode5.fw
/lib/firmware/b43/pcm5.fw
/lib/firmware/b43/b0g0initvals5.fw
/lib/firmware/b43/b0g0bsinitvals5.fw

如果是使用 Ubuntu 15.10 之前的版本,則會有 X Window System freezing 的問題,需要使用 radeon.agpmode=-1 來避開問題。

就這樣顯示、音效跟無線網路都可以運作了,只是用 Firefox 來播放 YouTube 影片會很頓很頓這樣。

2015年9月17日 星期四

從 git repository 自行製作上游軟體的 snapshot tarball

在 Linux 系統上面的軟體開發,偶而會遇到需要直接從 git repository 取出尚未正式釋出的版本,以下分享一下我在參加 DebConf15 後,學會的使用流程。

以下以 http://www.freedesktop.org/wiki/Software/libmbim/ 為例子。

首先要找到 git repository 的位置,然後使用 git 指令 clone 到本地端。

$ git clone git://anongit.freedesktop.org/libmbim/libmbim

然後在該目錄底下,找出最後 commit 的日期。

$ git log -1 --format=%cd --date=short . | sed 's/-//g'
20150910

找出目前的版本號碼,libmbim 的版本號碼在寫作這篇文章時寫在 configure.ac 裡面。

dnl Process this file with autoconf to produce a configure script.                                                                                                                                                                             
AC_PREREQ([2.68])

dnl The libmbim version number
m4_define([mbim_major_version], [1])
m4_define([mbim_minor_version], [13])
m4_define([mbim_micro_version], [0])
m4_define([mbim_version],
          [mbim_major_version.mbim_minor_version.mbim_micro_version])

版本號碼也就是 1.13.0 這樣。

然後檢查一下有沒有 .gitignore,如果有的話要先另建一個文字檔 .gitattributes 放入下面的內容。

.gitattributes export-ignore
.gitignore export-ignore

然後就可以使用 git 跟 xz 指令來產生 tarball 檔案。

$ git archive --worktree-attributes --format=tar --prefix=libmbim-1.13.0+20150910/ HEAD | xz > ../libmbim-1.13.0+20150910.tar.xz

如果本來就沒有 .gitignore 的話,就可以不需要使用參數 --worktree-attributes,這樣產生出來的 tarball 檔案就不會包含 .gitignore 在裡面,在使用 Debian 上的一些 git based 的管理工具,會因為 .gitignore 的存在而產生問題。

最後檢查一下 libmbim-1.13.0+20150910.tar.xz 的內容,看看是否沒有那些不應該存在的 .git 開頭的檔案在裡面。

$ tar tf libmbim-1.13.0+20150910.tar.xz
libmbim-1.13.0+20150910/
libmbim-1.13.0+20150910/AUTHORS
libmbim-1.13.0+20150910/COPYING
libmbim-1.13.0+20150910/COPYING.LIB
libmbim-1.13.0+20150910/Makefile.am
libmbim-1.13.0+20150910/NEWS
libmbim-1.13.0+20150910/README
libmbim-1.13.0+20150910/autogen.sh
libmbim-1.13.0+20150910/build-aux/
libmbim-1.13.0+20150910/build-aux/Makefile.am
libmbim-1.13.0+20150910/build-aux/mbim-codegen/
libmbim-1.13.0+20150910/build-aux/mbim-codegen/Makefile.am
libmbim-1.13.0+20150910/build-aux/mbim-codegen/Message.py
libmbim-1.13.0+20150910/build-aux/mbim-codegen/ObjectList.py
libmbim-1.13.0+20150910/build-aux/mbim-codegen/Struct.py
libmbim-1.13.0+20150910/build-aux/mbim-codegen/mbim-codegen
libmbim-1.13.0+20150910/build-aux/mbim-codegen/utils.py
libmbim-1.13.0+20150910/build-aux/templates/
libmbim-1.13.0+20150910/build-aux/templates/Makefile.am
libmbim-1.13.0+20150910/build-aux/templates/mbim-enum-types-template.c
libmbim-1.13.0+20150910/build-aux/templates/mbim-enum-types-template.h
libmbim-1.13.0+20150910/build-aux/templates/mbim-error-quarks-template.c
libmbim-1.13.0+20150910/build-aux/templates/mbim-error-types-template.c
libmbim-1.13.0+20150910/build-aux/templates/mbim-error-types-template.h
libmbim-1.13.0+20150910/configure.ac
libmbim-1.13.0+20150910/data/
libmbim-1.13.0+20150910/data/Makefile.am
libmbim-1.13.0+20150910/data/mbim-service-auth.json
libmbim-1.13.0+20150910/data/mbim-service-basic-connect.json
libmbim-1.13.0+20150910/data/mbim-service-dss.json
libmbim-1.13.0+20150910/data/mbim-service-ms-firmware-id.json
libmbim-1.13.0+20150910/data/mbim-service-ms-host-shutdown.json
libmbim-1.13.0+20150910/data/mbim-service-phonebook.json
libmbim-1.13.0+20150910/data/mbim-service-proxy-control.json
libmbim-1.13.0+20150910/data/mbim-service-sms.json
libmbim-1.13.0+20150910/data/mbim-service-stk.json
libmbim-1.13.0+20150910/data/mbim-service-ussd.json
libmbim-1.13.0+20150910/data/pkg-config/
libmbim-1.13.0+20150910/data/pkg-config/Makefile.am
libmbim-1.13.0+20150910/data/pkg-config/mbim-glib.pc.in
libmbim-1.13.0+20150910/docs/
libmbim-1.13.0+20150910/docs/Makefile.am
libmbim-1.13.0+20150910/docs/libmbim-icon.svg
libmbim-1.13.0+20150910/docs/libmbim-logo.png
libmbim-1.13.0+20150910/docs/libmbim-logo.svg
libmbim-1.13.0+20150910/docs/man/
libmbim-1.13.0+20150910/docs/man/Makefile.am
libmbim-1.13.0+20150910/docs/reference/
libmbim-1.13.0+20150910/docs/reference/Makefile.am
libmbim-1.13.0+20150910/docs/reference/libmbim-glib/
libmbim-1.13.0+20150910/docs/reference/libmbim-glib/Makefile.am
libmbim-1.13.0+20150910/docs/reference/libmbim-glib/libmbim-glib-common.sections
libmbim-1.13.0+20150910/docs/reference/libmbim-glib/libmbim-glib-docs.xml
libmbim-1.13.0+20150910/docs/reference/libmbim-glib/version.xml.in
libmbim-1.13.0+20150910/gtester.make
libmbim-1.13.0+20150910/m4/
libmbim-1.13.0+20150910/m4/compiler-warnings.m4
libmbim-1.13.0+20150910/src/
libmbim-1.13.0+20150910/src/Makefile.am
libmbim-1.13.0+20150910/src/libmbim-glib/
libmbim-1.13.0+20150910/src/libmbim-glib/Makefile.am
libmbim-1.13.0+20150910/src/libmbim-glib/generated/
libmbim-1.13.0+20150910/src/libmbim-glib/generated/Makefile.am
libmbim-1.13.0+20150910/src/libmbim-glib/libmbim-glib.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-cid.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-cid.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-compat.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-compat.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-device.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-device.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-enums.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-errors.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-message-private.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-message.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-message.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-proxy-helpers.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-proxy-helpers.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-proxy.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-proxy.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-utils.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-utils.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-uuid.c
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-uuid.h
libmbim-1.13.0+20150910/src/libmbim-glib/mbim-version.h.in
libmbim-1.13.0+20150910/src/libmbim-glib/test/
libmbim-1.13.0+20150910/src/libmbim-glib/test/Makefile.am
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-cid.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-fragment.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-message-builder.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-message-parser.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-message.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-proxy-helpers.c
libmbim-1.13.0+20150910/src/libmbim-glib/test/test-uuid.c
libmbim-1.13.0+20150910/src/mbim-proxy/
libmbim-1.13.0+20150910/src/mbim-proxy/76-mbim-proxy-device-ownership.rules.in
libmbim-1.13.0+20150910/src/mbim-proxy/Makefile.am
libmbim-1.13.0+20150910/src/mbim-proxy/mbim-proxy.c
libmbim-1.13.0+20150910/src/mbimcli/
libmbim-1.13.0+20150910/src/mbimcli/Makefile.am
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-basic-connect.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-completion
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-dss.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-helpers.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-helpers.h
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-ms-firmware-id.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-ms-host-shutdown.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli-phonebook.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli.c
libmbim-1.13.0+20150910/src/mbimcli/mbimcli.h
libmbim-1.13.0+20150910/utils/
libmbim-1.13.0+20150910/utils/Makefile.am
libmbim-1.13.0+20150910/utils/mbim-network.in

2015年9月13日 星期日

製作 Ubuntu 安裝用的 USB 隨身碟

分享一下我經常在使用的步驟,以下假設該 USB 隨身碟的 device node 在 /dev/sdb。

首先把 MBR 區域清成零。

$ sudo dd if=/dev/zero of=/dev/sdb bs=1M count=1
輸入 1+0 個紀錄
輸出 1+0 個紀錄
複製了 1048576 個位元組 (1.0 MB), 0.193325 s, 5.4 MB/s

再來用 fdisk 建立磁碟分割區

$ sudo fdisk /dev/sdb
裝置不含有效的 DOS 分割表,也不含 Sun、SGI 或 OSF 磁碟標籤
以磁碟識別碼 0xf6805fe6 建立新的 DOS 磁碟標籤。
變更將僅存於記憶體之中,直到您決定寫入它們。
在此之後,前一個內容當然將無法回復。

警告:分割表 4 的無效旗標 0x0000 將由 w(rite) 所修正

命令 (m 以獲得說明): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分割區編號 (1-4, 預設 1): 
使用預設值 1
起初 磁區 (2048-7908470, 預設 2048): 
使用預設值 2048
最後 磁區, +磁區 或 +大小{K,M,G} (2048-7908470, 預設 7908470): 
使用預設值 7908470

命令 (m 以獲得說明): t
已選分割區 1
十六進位編碼 (輸入 L 以列出編碼): c
分割區 1 的系統類型已變更為 c (W95 FAT32 (LBA))

命令 (m 以獲得說明): p

磁碟 /dev/sdb: 4049 MB,4049137152 位元組
125 磁頭,62 磁區/磁軌,1020 磁柱,總計 7908471 磁區
單位 = 磁區 之於 1 * 512 = 512 位元組
磁區大小 (邏輯/實體):512 位元組 / 512 位元組
I/O 大小 (最小/最佳化):512 位元組 / 512 位元組
磁碟識別碼:0xf6805fe6

所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/sdb1            2048     7908470     3953211+   c  W95 FAT32 (LBA)

命令 (m 以獲得說明): w
分割表已變更!

呼叫 ioctl() 以重新讀取分割表。

警告:如果您已建立或修改任何 DOS 6.x
分割區,請參看 fdisk 線上手冊以獲得額外
資訊。
同步磁碟。

使用 partprobe 指令讓系統重新讀取分割表。

$ sudo partprobe 

製作 FAT32 檔案系統,並且使用 UbuntuStick 的名稱。

$ sudo mkfs.vfat -n UbuntuStick /dev/sdb1
mkfs.fat 3.0.26 (2014-03-07)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows

掛載 FAT32 檔案系統。

$ gvfs-mount -d /dev/sdb1
/dev/sdb1 已掛載於 /media/fourdollars/UbuntuStick

最後再使用 usb-creator-gtk 來選擇使用 Ubuntu ISO 製作 Ubuntu 安裝用的 USB 隨身碟

$ usb-creator-gtk -n

當然也可以直接使用 usb-creator-gtk 就可以了,這只是我個人的小小潔癖。