顯示具有 Ubuntu 標籤的文章。 顯示所有文章
顯示具有 Ubuntu 標籤的文章。 顯示所有文章

2025年10月14日 星期二

ubuntu-dev-tools: /usr/bin/pbuilder-dist-simple

pbuilder-dist-simple 是個方便用來創建 pbuilder base 的 wrapper 腳本,使用的方式也很特別,就是要自己手動建立一個 symbolic link,然後它就會根據 symbolic link 的名稱來自動解析參數來處理。

例如:questing 是 Ubuntu 25.10 的 series name。

$ dpkg -S /usr/bin/pbuilder-dist-simple
ubuntu-dev-tools: /usr/bin/pbuilder-dist-simple
$ mkdir ~/bin
$ ln -s /usr/bin/pbuilder-dist-simple ~/bin/pbuilder-questing

建立完 symbolic link 就可以直接使用了,如果 PATH 有先設好的話。

$ echo $PATH
/home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ pbuilder-questing create
W: /root/.pbuilderrc does not exist
I: Distribution is questing.
I: Current time: Tue Oct 14 06:55:39 UTC 2025
I: pbuilder-time-stamp: 1760424939
I: Building the build environment
I: running debootstrap
/usr/sbin/debootstrap
...
I: creating base tarball [/home/user/pbuilder/questing-base.tgz]
...

接下來我們可以抓 Debian libchewing source package 來試試看

$ pull-debian-source libchewing
Found libchewing 0.10.3-1 in sid
...
Downloading libchewing_0.10.3.orig.tar.xz from deb.debian.org (1.571 MiB)
[=====================================================>]100%
Downloading libchewing_0.10.3-1.debian.tar.xz from deb.debian.org (0.008 MiB)
[=====================================================>]100%

$ pbuilder-questing build libchewing_0.10.3-1.dsc
W: /root/.pbuilderrc does not exist
I: pbuilder: network access will be disabled during build
I: Current time: Tue Oct 14 07:02:09 UTC 2025
I: pbuilder-time-stamp: 1760425329
I: Building the build Environment
I: extracting base tarball [/home/user/pbuilder/questing-base.tgz]
...
dpkg-deb: building package 'libchewing3-data' in '../libchewing3-data_0.10.3-1_all.deb'.
dpkg-deb: building package 'libchewing3-dev' in '../libchewing3-dev_0.10.3-1_amd64.deb'.
dpkg-deb: building package 'libchewing3' in '../libchewing3_0.10.3-1_amd64.deb'.
dpkg-deb: building package 'chewing-tools' in '../chewing-tools_0.10.3-1_amd64.deb'.
...

$ cd ~/pbuilder/ && ls *chewing*
chewing-tools_0.10.3-1_amd64.deb          libchewing_0.10.3-1_amd64.buildinfo  libchewing_0.10.3-1.debian.tar.xz  libchewing_0.10.3-1_source.changes  libchewing3_0.10.3-1_amd64.deb     libchewing3-dbgsym_0.10.3-1_amd64.ddeb
chewing-tools-dbgsym_0.10.3-1_amd64.ddeb  libchewing_0.10.3-1_amd64.changes    libchewing_0.10.3-1.dsc            libchewing_0.10.3.orig.tar.xz       libchewing3-data_0.10.3-1_all.deb  libchewing3-dev_0.10.3-1_amd64.deb

看起來目前的 libchewing 0.10.3-1 in sid 可以在 Ubuntu 25.10 正常編譯沒有問題。

2019年11月22日 星期五

在 Ubuntu 18.04 透過 postfix 來使用 Gmail 寄信

以下內容是參考 https://kifarunix.com/configure-postfix-to-use-gmail-smtp-on-ubuntu-18-04/

首先安裝一下 postfix 與 mailutils

$ sudo apt install postfix mailutils

安裝過程設定使用 Internet site: Mail is sent and received directly using SMTP.

安裝後修改 /etc/postfix/main.cf

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

修改 /etc/postfix/sasl_passwd 加入密碼

[smtp.gmail.com]:587 userid@gmail.com:password

應用程式密碼可以在 https://myaccount.google.com/apppasswords 產生

使用 postmap 產生 db

$ sudo postmap /etc/postfix/sasl_passwd
$ ls /etc/postfix/sasl_passwd*
/etc/postfix/sasl_passwd  /etc/postfix/sasl_passwd.db

變更 /etc/postfix/sasl_passwd* 權限

$ sudo chown root:root /etc/postfix/sasl_passwd*
$ sudo chmod 600 /etc/postfix/sasl_passwd*

設定完成後重啟 postfix

$ service postfix reload

最後寫一封信寄給自己看看有沒有成功收到

$ echo "This is a test mail." | mail -s "test mail" userid@gmail.com

2018年7月27日 星期五

自製 Ubuntu 16.04.X/17.10/18.04.X/18.10 測試硬體安裝使用的 USB 隨身碟

與「自製 Ubuntu 13.04/12.10/12.04.2 與 Debian 7.0 測試硬體安裝使用的 USB 隨身碟」跟「自製 Ubuntu 16.04/16.04.1/16.04.2/16.10/17.04 測試硬體安裝使用的 USB 隨身碟」同樣的步驟只是改用 grub.cfg 這個設定檔。

隨身碟換成某年在 COSCUP 購買的 USB stick 紀念品,所以容量有 16GB 可以用,只是已經不想再不斷地修改 grub.cfg 所以改成自動偵測 vmlinuz 跟 initrd 的檔案名稱,然後會去掃 iso 目錄底下的所有 iso 檔,之後只要爽爽地將新的 iso 檔複製到 iso 目錄底下就會自動找到了,不用在因為新增或刪除 iso 檔而去修改 grub.cfg。

主要修改的部份如下:

for isofile in /iso/*.iso
do
    menuentry "試用 $isofile 免安裝 ($bios)" $isofile {
        loopback loop $2

        if [ -f (loop)/casper/vmlinuz ]; then
            set vmlinuz="(loop)/casper/vmlinuz"
        elif [ -f (loop)/casper/vmlinuz.efi ]; then
            set vmlinuz="(loop)/casper/vmlinuz.efi"
        fi

        if [ -f (loop)/casper/initrd ]; then
            set initrd="(loop)/casper/initrd"
        elif [ -f (loop)/casper/initrd.lz ]; then
            set initrd="(loop)/casper/initrd.lz"
        elif [ -f (loop)/casper/initrd.gz ]; then
            set initrd="(loop)/casper/initrd.gz"
        fi

        linux   $vmlinuz iso-scan/filename=$2 $options $desktop --- $extra
        initrd  $initrd
    }
done

2017年11月26日 星期日

線上編輯與分享 Debian 與 Ubuntu 的自動安裝設定

多年前在弄 https://fourdollars.github.io/d-i/ 時,就已經想到這個主意了,趁這個週末有點時間就用 Python Flask 硬幹出來。

主要是利用下面的機制做出來的:

運作的原理是根據使用者的 IPv4 位址來儲存設定檔,所以另一台透過同樣的 IPv4 位址就可以拿到同一份設定檔,分享的時候也是透過分享 IPv4 位址來達成,但是只有該 IPv4 位址的使用者才能夠編輯給該 IPv4 位址使用的設定。

專案網址:https://fourdollars.github.io/diaas/

我另外弄了一個專門給 Ubuntu 台灣中文社群的通用設定在 https://sylee.org/d-i/?share=08080808,點進去後按下 Save 就可以使用了。

debian-installer (d-i) and preseed.cfg

There is an "Auto mode" while automating the Debian/Ubuntu installation using preseeding.

You can check Debian's or Ubuntu's documentions for details.

Basically if we have prepared a "preseed.cfg" at some right place, like http://example.com/d-i/stretch/preseed.cfg, and then we can use "auto url=example.com" to install Debian stretch by that "preseed.cfg".

"preseed.cfg" is usually a static file so I come out some ideas. How about making it dynamic and we can share it to others.

If you are interested, please check https://fourdollars.github.io/diaas/.

2017年7月10日 星期一

自製 Ubuntu 16.04/16.04.1/16.04.2/16.10/17.04 測試硬體安裝使用的 USB 隨身碟

與「自製 Ubuntu 13.04/12.10/12.04.2 與 Debian 7.0 測試硬體安裝使用的 USB 隨身碟」同樣的步驟只是改用 grub.cfg 這個設定檔。

因為我是放在 8GB 的 USB 隨身碟上面,所以放這幾個 amd64 ISO 檔案就塞滿了。

另外我發現前一篇文章中的 usb-creator-gtk -n -i ubuntu-13.04-desktop-amd64.iso 這個步驟是多餘的,其實使用 grub-install 就夠了,還有這邊的 UEFI 模式不會支援 Secure Boot 因為 GRUB 的安全設定的關係。

2017年6月19日 星期一

手動快速編譯 Ubuntu 16.04 當中 Linux kernel 4.4 裡面的 kernel module

以前寫過一篇「手動快速編譯 Ubuntu 14.04 當中 Linux kernel 裡面的 i915 module」這次是要針對 Ubuntu 16.04 LTS 上面的 Linux kernel 4.4 編譯,步驟都差不多只是有些不一樣的地方。

首先是 Linux kernel git tree 的來源改從 Launchpad 而來,是的! Ubuntu 使用的 Linux kernel 現在也放到 Launchpad 上面了。

$ git clone https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial

然後是編譯的設定檔的位置不一樣了,不過大致上只要找出 config.common.ubuntu config.common.amd64 config.flavour.generic 這三個檔案的位置出來就可以了。

cat ./debian.master/config/config.common.ubuntu ./debian.master/config/amd64/config.common.amd64 ./debian.master/config/amd64/config.flavour.generic > .config

然後這次我的目標是 ubuntu/i915 底下的 kernel module 其它的部份就直接參考前一份文章就可以了。

2017年5月15日 星期一

2017 在 Ubuntu 16.04 上面報稅

沒有最爛只有更爛的報稅系統,Java 連官方都已經不支援使用 Java Applet 建議改用 Java Web Start 了,但是臺灣政府配合的廠商還是在使用過時的技術給 Mac & Linux 系統的報稅者,主管機關也是一直瀆職。

目前 Ubuntu 上的 Firefox 53.0.2 已經不支援 Java Applet 了,所以想要報稅只能安裝舊版本的 Firefox 來避開問題。

首先確認 Firefox 已經都關閉,然後將 ~/.mozilla 換個名稱或是備份起來,以防意外的發生。

$ mv ~/.mozilla ~/.mozilla.bak

接下來要安裝舊版本的 Firefox

$ apt policy firefox
firefox:
  已安裝:53.0.2+build1-0ubuntu0.16.04.2
  候選: 53.0.2+build1-0ubuntu0.16.04.2
  版本列表:
 *** 53.0.2+build1-0ubuntu0.16.04.2 500
        500 http://tw.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages
        500 http://tw.archive.ubuntu.com/ubuntu xenial-security/main amd64 Packages
        100 /var/lib/dpkg/status
     45.0.2+build1-0ubuntu1 500
        500 http://tw.archive.ubuntu.com/ubuntu xenial/main amd64 Packages
$ sudo apt install firefox=45.0.2+build1-0ubuntu1 firefox-locale-zh-hant=45.0.2+build1-0ubuntu1

然後就是依照先前寫過的「在 Ubuntu 16.04 上面使用自然人憑證報稅」來操作,就可以順利報稅了。

2016年7月28日 星期四

LTS 不等於 Stable

很多 Ubuntu 使用者都搞不清楚 LTS (Long Term Support) 與 Stable 的分別。

目前 Ubuntu 最穩定的版本應該是 Ubuntu 12.04.5 LTS (Precise Pangolin),次穩定的版本應該是下個月初才會釋出的 Ubuntu 14.04.5 LTS (Trusty Tahr),而最新的 Ubuntu 16.04.1 LTS (Xenial Xerus) 反而是 LTS 三個版本之中最不穩定的版本,因為它才釋出沒多久,更不用提前一個版本 Ubuntu 16.04 LTS (Xenial Xerus) 一定是問題更多的版本。

每個 Ubuntu LTS 第一個版本的釋出,只是代表著 code base freeze 然後開始不斷地修正裡面的問題,讓它越來越穩定,而 LTS 只是提供更長的維護時間。

如果想要使用很穩定的 Ubuntu 16.04 版本,請等到未來的 Ubuntu 16.04.5 LTS (Xenial Xerus) 釋出後再去使用吧。

Debian 也是一樣的,最穩定的釋出版本其實是 oldoldstable,再來是 oldstable,接下來是 stable,為什麼時間越久的越穩定是因為回報問題跟修正問題都需要時間,剛釋出的跨版號軟體一定不是最穩定的版本,要經過幾次反覆的修正之後才會慢慢地穩定下來,這也就為什麼像是 Linux kernel 還是 Python, Perl 等程式語言,在釋出後還會持續不斷地提供同版號的 minor fixes 的釋出。

2016年7月25日 星期一

Disable Secure Boot in shim-signed

The latest Ubuntu kernel updates bring some Secure Boot enhancement for the kernel modules when the Secure Boot is enabled in BIOS settings. However there is no easy way to sign those kernel modules in DKMS packages automatically so far. If we want to use those DKMS packages, we need to disable Secure Boot in BIOS settings temporarily or we can also disable Secure Boot in shim-signed temporarily. The following steps introduced how to disable Secure Boot in shim-signed.

  1. Open a terminal by Ctrl + Alt + T, execute `sudo update-secureboot-policy` and then select ‘Yes’.
  2. Enter a temporary password between 8 to 16 digits. (For example, 12345678, we will use this password later.)
  3. Enter the same password again to confirm.
  4. Reboot the system and press any key when you see the blue screen (MOK management).
  5. Select “Change Secure Boot state”.
  6. Press the corresponding password character and press Enter. Repeat this step several times to confirm previous temporary password like ‘12345678’ in step 2&3. For exmaple, '2' for this screen.
  7. Select ‘Yes’ to disable Secure Boot in shim-signed.
  8. Press Enter key to finish the whole procedure.

We can still enable Secure Boot in shim-signed again. Just execute `sudo update-secureboot-policy --enable` and then follow the similar steps above.

2016年5月30日 星期一

編譯 Ubuntu 的 Linux kernel 來使用 USB to RS-232 輸出訊息

如果曾經有參加過台北的 Ubuntu Hardware Summit,應該都會拿到一本橘色小手冊 Ubuntu Debugging,當中有提到可以設定幾個 Linux kernel 編譯選項中

CONFIG_USB_SERIAL_CONSOLE=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_PL2303=y

然後就可以在 Linux kernel 開機參數加上

console=tty console=ttyUSB0,115200n8

這樣就可以透過 USB to RS-232 傳輸線將 Linux kernel 訊息輸出到另外一台電腦上面,為什麼要這樣做有時候是因為 Linux kernel 開機時是什麼畫面也沒有,也不曉得中間到底發生了什麼事情,又或者是 Linux kernel 訊息出現的太快了,來不及看清楚完整的訊息一下子就過去了,也沒有來得及儲存到檔案系統上面就當機了,有著許許多多不同的情況可能會需要。

但是實際上要怎麼做才能夠編譯出 Ubuntu 上面所使用的 Linux kernel 呢?

首先是將 Ubuntu 所使用的 Linux kernel 的原始碼下載回來。

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

然後我自己 commit 了一些修改 (主要是針對 amd64)。

$ git diff HEAD^..HEAD
diff --git a/debian.master/abi/4.4.0-22.39/amd64/generic.modules b/debian.master/abi/4.4.0-22.39/amd64/generic.modules
index e1b9392..53d7914 100644
--- a/debian.master/abi/4.4.0-22.39/amd64/generic.modules
+++ b/debian.master/abi/4.4.0-22.39/amd64/generic.modules
@@ -2873,7 +2873,6 @@ pixcir_i2c_ts
 pkcs7_test_key
 pktcdvd
 pktgen
-pl2303
 platform_lcd
 plat_nand
 plat-ram
@@ -4236,7 +4235,6 @@ usblp
 usbmon
 usbmouse
 usbnet
-usbserial
 usb-serial-simple
 usbsevseg
 usb-storage
diff --git a/debian.master/config/annotations b/debian.master/config/annotations
index 825012f..167ab6e 100644
--- a/debian.master/config/annotations
+++ b/debian.master/config/annotations
@@ -6609,7 +6609,7 @@ CONFIG_USB_STORAGE_ENE_UB6250                   policy<{'amd64': 'm', 'arm64': '
 CONFIG_USB_UAS                                  policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 
 # Menu: Device Drivers >> USB support >> Support for Host-side USB >> USB Serial Converter support
-CONFIG_USB_SERIAL                               policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
+CONFIG_USB_SERIAL                               policy<{'amd64': 'y', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_GENERIC                       policy<{'amd64': 'y', 'arm64': 'y', 'armhf': 'y', 'i386': 'y', 'powerpc': 'y', 'ppc64el': 'y'}>
 CONFIG_USB_SERIAL_SIMPLE                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_AIRCABLE                      policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
@@ -6641,7 +6641,7 @@ CONFIG_USB_SERIAL_MOS7715_PARPORT               policy<{'amd64': 'y', 'arm64': '
 CONFIG_USB_SERIAL_MOS7840                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_MXUPORT                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_NAVMAN                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
-CONFIG_USB_SERIAL_PL2303                        policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
+CONFIG_USB_SERIAL_PL2303                        policy<{'amd64': 'y', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_OTI6858                       policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_QCAUX                         policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
 CONFIG_USB_SERIAL_QUALCOMM                      policy<{'amd64': 'm', 'arm64': 'm', 'armhf': 'm', 'i386': 'm', 'powerpc': 'm', 'ppc64el': 'm'}>
diff --git a/debian.master/config/config.common.ubuntu b/debian.master/config/config.common.ubuntu
index 505a3c7..7cb1284 100644
--- a/debian.master/config/config.common.ubuntu
+++ b/debian.master/config/config.common.ubuntu
@@ -8391,7 +8391,8 @@ CONFIG_USB_RIO500=m
 CONFIG_USB_RTL8150=m
 CONFIG_USB_RTL8152=m
 CONFIG_USB_S2255=m
-CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL=y
+CONFIG_USB_SERIAL_CONSOLE=y
 CONFIG_USB_SERIAL_AIRCABLE=m
 CONFIG_USB_SERIAL_ARK3116=m
 CONFIG_USB_SERIAL_BELKIN=m
@@ -8439,7 +8440,7 @@ CONFIG_USB_SERIAL_OMNINET=m
 CONFIG_USB_SERIAL_OPTICON=m
 CONFIG_USB_SERIAL_OPTION=m
 CONFIG_USB_SERIAL_OTI6858=m
-CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_PL2303=y
 CONFIG_USB_SERIAL_QCAUX=m
 CONFIG_USB_SERIAL_QT2=m
 CONFIG_USB_SERIAL_QUALCOMM=m

接著開始編譯 Linux kernel (在有八個 CPU cores 的電腦上)

$ CONCURRENCY_LEVEL=8 fakeroot debian/rules clean binary-generic

最後就會在上層目錄產生 Ubuntu 所使用的 Linux kernel 的 Debian packages 了。

$ ls -1 ../*.deb
../linux-cloud-tools-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-headers-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-image-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-image-extra-4.4.0-22-generic_4.4.0-22.40_amd64.deb
../linux-tools-4.4.0-22-generic_4.4.0-22.40_amd64.deb

這樣就可以將這些 Debian packages 拿去安裝使用了。

最後我放了一份在 http://people.ubuntu.com/~fourdollars/usb2rs232/ 上面,也許有人剛好也需要想要測試一下效果如何。

參考資料:https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks

2016年5月29日 星期日

在 Ubuntu 16.04 上面使用自然人憑證報稅

發現完全可以依照兩年前寫過的在 Ubuntu 14.04 上面使用自然人憑證報稅的步驟,現在不管是 i386 的或是 amd64 的都可以運作。

只是我不明白為什麼自然人憑證用戶端元件安裝 (HiPKIClient) 上面完全沒有提到有 amd64 的版本可以使用。

這樣一來我就不用設法去生一個 i386 的環境來使用。

另外今年大家都會遇到的問題是 HiPKIClient 沒有合法簽章,因為現在的 Firefox 預設上都強制要求 extension/plugin 要有合法簽章才能夠使用,不然的話就要手動停用強制簽署的功能。

「你可以在 Firefox 設定編輯器(about:config 頁面)將 xpinstall.signatures.required 修改成 false 來暫時停用強制簽署的功能。」

還有要注意安裝 EZ-100PU 讀卡機的驅動程式有沒有符合系統的版本,通常使用指令

uname -i
就可以知道當下的系統是 i386 還是 x86_64 (aka amd64) 了。

$ unzip -l 201511920271676073.zip 
Archive:  201511920271676073.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2011-08-10 15:04   EZUSB_Linux/
    69340  2011-08-10 14:54   EZUSB_Linux/EZUSB_Linux_x86_64_v1.5.3.zip (amd64)
    58687  2011-08-10 14:54   EZUSB_Linux/EZUSB_Linux_x86_v1.5.3.zip    (i386)
       58  2008-04-09 13:12   Archive created by free jZip.url
---------                     -------
   128085                     4 files

最後就是要安裝 Java 7 才能夠正常使用,但是 Oracle 已經不再維護 Java 7 了,Oracle 目前建議使用的是 Java 8,但是 Java 8 完全無法在 Ubuntu 16.04 (amd64) 上面的 Firefox 46.0.1 正常使用,不曉得國稅局何時才會請中華電信還是關貿網路來解決這個問題。

出社會工作後都是用 Linux 系統在報稅,可是十幾年過去了,還是覺得政府做得很糟糕。:-(

2016年5月8日 星期日

在 Ubuntu 16.04 上面製作 FreeDOS 開機的 USB 隨身碟

首先是安裝 makebootfat 這個套件。

$ sudo apt install makebootfat

然後就可以參考 /usr/share/doc/makebootfat/README.Debian 這份文件來製作 FreeDOS 開機的 USB 隨身碟,只不過文件內容有點錯誤,所以我根據我的喜好調整了一下,以下假設 USB 隨身碟的 device node 在 /dev/sdb。

$ mkdir ~/tmp/fs-root
$ cd ~/tmp

$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/kernels.zip
$ unzip kernels.zip source/ukernel/boot/fat*.bin
$ cp -v source/ukernel/boot/fat*.bin .

$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/commandx.zip
$ wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/pkgs/unstablx.zip
$ unzip commandx.zip bin/command.com
$ unzip unstablx.zip bin/kernel.sys
$ cp -v bin/kernel.sys bin/command.com fs-root/

$ sudo makebootfat -o /dev/sdb -L FreeDOS -E 255 -1 fat12.bin -2 fat16.bin -3 fat32lba.bin -m /usr/lib/syslinux/mbr/mbr.bin fs-root/

這樣就可以產生 FreeDOS 開機的 USB 隨身碟,不過真正在使用時似乎還是會遇到一些相容性的問題,像是我在 Dell 電腦的 Legacy BIOS mode 都可以正常使用,但是在我自己的 Lenovo ThinkPad X200 上面就不能用。

2017/02/14 補充:做了一個快速使用的腳本程式 mkfreedos.sh

2016年5月6日 星期五

在搭配 32-bit UEFI BIOS 的電腦上面安裝 Ubuntu 16.04 amd64

最近剛好拿到一台硬體上面的 BIOS 只有支援 32-bit UEFI,但是 Ubuntu 16.04 以前的版本包含 Ubuntu 16.04 本身的標準安裝媒體都沒有支援。

不過還好找到 http://askubuntu.com/questions/392719/32-bit-uefi-boot-support 提到了可以借用 Debian multi-arch 的 netboot ISO 裡面的 GRUB 檔案來繞過啟動的問題。

首先是要將 UEFI BIOS 當中的 Secure Boot 關掉,然後將 http://releases.ubuntu.com/16.04/ 上面的 ubuntu-16.04-desktop-amd64.iso 下載回來解開到 USB 隨身碟上面。

$ sudo apt install p7zip-full
$ cd /media/user/USBStick
$ 7z x ~/ubuntu-16.04-desktop-amd64.iso

然後是到 http://cdimage.debian.org/debian-cd/current/multi-arch/iso-cd/ 上面將 debian-8.4.0-amd64-i386-netinst.iso 下載回來,然後掛載起來將當中的 GRUB 檔案複製到 USB 隨身碟上面。

$ sudo mount ~/debian-8.4.0-amd64-i386-netinst.iso /mnt
$ cp -rv /mnt/boot/grub/i386-efi /media/user/USBStick/boot/grub/
$ cp -v /mnt/efi/boot/bootia32.efi /media/user/USBStick/EFI/BOOT/

最後將 /mnt 跟 USB 隨身碟都卸載就可以拿去安裝 Ubuntu 16.04 amd64 了。

$ cd
$ sudo umount /mnt
$ umount /media/user/USBStick

安裝過程中我有接著有線網路,並且提供 DHCP 給它取得 IP,所以它會自己連上網路去下載 grub-efi-ia32 及 grub-efi-ia32-bin 回來安裝使用,這是 Ubuntu 16.04 amd64 之所以能夠正常安裝使用的重要步驟。

另外一個重點是 Debian multi-arch 的 netboot ISO 裡面的 GRUB 檔案可能沒有支援 Secure Boot,還有 Ubuntu 16.04 也沒有提供 grub-efi-ia32-signed 這樣的套件,所以遇上了無法關閉 Secure Boot 的 UEFI BIOS 就無法使用這個方法來安裝了。

補充:只要再使用「自製 Ubuntu 13.04/12.10/12.04.2 與 Debian 7.0 測試硬體安裝使用的 USB 隨身碟」裡面提到的指令,就可以製作出同時可以使用於 Legacy BIOS、32-bit UEFI BIOS 與 64-bit UEFI BIOS 的 Ubuntu 16.04 amd64 安裝 USB 隨身碟

$ sudo apt install grub-pc-bin
$ sudo grub-install --removable --target=i386-pc --root-directory=/media/user/USBStick/ /dev/sdb

不過後來又發現,其實只要使用 Ubuntu 16.04 裡面的工具就不需要使用 Debian multi-arch 的 netboot ISO 裡面的 GRUB 檔案了。 Orz...

$ sudo apt install grub-efi-ia32-bin
$ sudo grub-install --removable --target=i386-efi --root-directory=/media/user/USBStick/ /dev/sdb

當然 grub-pc-bin 跟 grub-efi-ia32-bin 都是從 Debian 而來的,只是使用上最好都維持同樣的版本,比較不會遇到奇怪的問題。

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月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月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 就可以了,這只是我個人的小小潔癖。

2015年9月8日 星期二

在 Ubuntu 14.04 上面使用 pyenv 搭配 virtualenv 建立 Django 的開發環境。

pyenv 是一套管理同時使用不同版本 Python 的工具,也可以搭配 virtualenv 使用。

首先依照 Common build problems 安裝一些套件,由於等一下也會使用到 git 所以一併安裝。

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev git

然後執行官方建議的安裝方式。

$ wget https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer -O - | bash

然後我不是很喜歡每次啟動 shell 就會自動載入使用 pyenv,所以我自己寫了一個 ~/bin/pyenv 的腳本程式來使用。

#!/bin/bash

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h(python)\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
bash --noprofile -l

每次當我要使用 pyenv 時,就要先執行一次 pyenv,接下來我就可以看到 (python) 的提示出現,代表我正在使用 pyenv。

fourdollars@ubuntu(python):~$

接下來來找找看,有哪些 Python 版本可以安裝使用。

$ pyenv install -l
Available versions:
  ...
  2.7.10
  ...
  3.4.3
  ...

我選擇安裝最新(寫這篇文章時)的 Python 2 的穩定發行版本。

$ pyenv install 2.7.10
Downloading Python-2.7.10.tgz...
-> https://yyuu.github.io/pythons/eda8ce6eec03e74991abb5384170e7c65fcd7522e409b8e83d7e6372add0f12a
Installing Python-2.7.10...
patching file ./Lib/site.py
Installed Python-2.7.10 to /home/fourdollars/.pyenv/versions/2.7.10

然後先切進 2.7.10 的環境,更新一下套件。

$ pyenv global 2.7.10
$ pip list --outdated | awk '{print $1}' | xargs pip install --upgrade
You are using pip version 6.1.1, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
You are using pip version 6.1.1, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting setuptools
  Downloading setuptools-18.3.1-py2.py3-none-any.whl (462kB)
    100% |████████████████████████████████| 462kB 666kB/s 
Collecting pip
  Using cached pip-7.1.2-py2.py3-none-any.whl
Installing collected packages: setuptools, pip
  Found existing installation: setuptools 15.2
    Uninstalling setuptools-15.2:
      Successfully uninstalled setuptools-15.2
  Found existing installation: pip 6.1.1
    Uninstalling pip-6.1.1:
      Successfully uninstalled pip-6.1.1
Successfully installed pip-7.1.2 setuptools-18.3.1

接下來要搭配使用 virtualenv 建立一個獨立的 Python 環境。

$ pyenv virtualenv 2.7.10 watchdog
Collecting virtualenv
  Downloading virtualenv-13.1.2-py2.py3-none-any.whl (1.7MB)
    100% |████████████████████████████████| 1.7MB 345kB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-13.1.2
New python executable in /home/fourdollars/.pyenv/versions/watchdog/bin/python2.7
Also creating executable in /home/fourdollars/.pyenv/versions/watchdog/bin/python
Installing setuptools, pip, wheel...done.
Ignoring indexes: https://pypi.python.org/simple
Requirement already satisfied (use --upgrade to upgrade): setuptools in /home/fourdollars/.pyenv/versions/watchdog/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): pip in /home/fourdollars/.pyenv/versions/watchdog/lib/python2.7/site-packages

接下來要建立一個 watchdog 專案目錄,並且在裡面設定使用這個獨立的 Python 環境。

$ mkdir ~/watchdog && cd ~/watchdog
$ pyenv local watchdog
$ pyenv local
watchdog

也就是說在這個目錄底下,pyenv 會自動切進跟專案目錄名稱相同的 virtualenv 環境。

接下來總算可以安裝 Django 來開發了。

$ pip install Django
Collecting Django
  Downloading Django-1.8.4-py2.py3-none-any.whl (6.2MB)
    100% |████████████████████████████████| 6.2MB 110kB/s 
Installing collected packages: Django
Successfully installed Django-1.8.4

安裝完 Django 後要重新登入一下,才可以使用 django-admin 的指令來建立這個新專案。

fourdollars@ubuntu(python):~/watchdog$ django-admin startproject watchdog .

然後就是 Django 的初始化跟啟動開發用的伺服器。

$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: staticfiles, messages
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying sessions.0001_initial... OK
fourdollars@ubuntu(python):~/watchdog$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
September 08, 2015 - 09:50:59
Django version 1.8.4, using settings 'watchdog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.