Showing posts with label Ubuntu. Show all posts
Showing posts with label Ubuntu. Show all posts

2017/10/30

LXC Ubuntu 17.10 Desktop on QNAP NAS via Container Station


Ubuntu 17.10 在前幾天發行了,此版本是 Ubuntu 第一次使用 GNOME 當做預載的桌面系統。Doro 花了點時間將 Ubuntu 17.10 轉成 LXC Container,並能透過內建的網頁版 VNC 直接存取桌面系統,再包裝成能在 QNAP NAS 能直接使用的格式。隨後,此文將針對 gnome-shell 做了一些調效,並簡單試用了一下 snap 安裝殺手級應用 nextcloud。

Ubuntu 17.10 Desktop on LXC Container


在任意 QNAP x86 NAS 下開啓 Container Station,進入 Preference → Application Repository,將 Owner 改成 fcwu 後按下 Apply。


進入 Create Container 便能發現 Ubuntu 17.10 Desktop,按下 Install。


在 Port forwarding 的地方注意一下,看要使用那個 port 存取網頁 VNC 功能,這裡我用 port 5950。



經過好一陣子下載及建立,終於完成,進到剛才建立的 Container 直接按連結,便能看到 Ubuntu 桌面,預設的帳密為 ubuntu/ubuntu。


登入畫面已是 GDM,使用預設密碼 ubuntu 進入。


真的是 Ubuntu 17.10 喔。


開了幾個 App,點擊左上會把所有視窗給平鋪出來了,右邊目前有看到 2 個 workspace ,可以直接把視窗拉到不同的 workspace。


點擊左下角會出現目前有安裝的 Apps。


點擊正上方的日期,會有日曆以及通知。


右上則是音量,網路,設定等功能。


gnome-shell extension

gnome-shell 好玩的地方在很多 extension 可以安裝,我本身還是習慣以前的 Unity 使用方式,所以重新找了一些 extension。

要裝 extension 前建議先裝 Chrome or Chromium。


用 Chrome 開啟 https://extensions.gnome.org 會提示有些 packages 要安裝,按照指示 apt install chrome-gnome-shell 後,便可直接用該網站安裝 gnome-shell extensions。



我安裝了以下 extensions
  1. Dash to Dock - 左邊的 docker
  2. Frippery Move Clock - 時鐘移到右邊
  3. Gnome Global Application Menu - 整合 menu 至上方 panel
  4. Pixel Saver - title bar 放在 panel
  5. system-monitor - 系統資源監控
  6. User Themes - 方便安裝 themes


theme 的部分,我是直接 apt install gnome-tweak-tool numix-*,隨後再開 gnome-tweak-tool 來調整。

 


 安裝 Nextcloud


自從 Canonical 有了 snap,安裝這些應用真的很容易,指令就 snap install nextcloud,或是 UI 開 Ubuntu Software 也可點一點就裝完。



裝完後,第一次會要求你建立管理員帳號。



因為在 LXC Container 內使用,所以得進到 Container Station UI 上,設一下轉埠,我這裡用 18080。


從別台機器存取,nextcloud 會要求將此 IP/Domain 加入信任網域,照著指示在同台機器開那個網址便設定完成。



後記


要在 GNOME (wayland) 裡跑這種虛擬桌面真的有不少 know how,從 systemd, systemd-logind, xdummy or xvfb 選擇, novnc package, 以前桌面開在 tty7 現在是 tty1 for greeter, tty2… for session,LXC 權限究竟要開那些等等,整體來說是個很有趣的經驗。

2015/11/23

QNAP Ubuntu Station: 透過 NAS 上的 HDMI 輸出,使用 Ubuntu 桌面


今年年中敝部門第一項作品 Container Station 發佈後,年底第二項作品也終於要登場,Ubuntu Station。

QNAP NAS 是少數幾個有支援 HDMI 輸出的 NAS 品牌,過去公司開發了 HD Station,HD Station 針對了電視上使用的族群設計並結合一些常用應用程式,像 Kodi,YouTube TV。

Ubuntu Station 也是使用了 NAS HDMI 輸出,但輸出的是 Ubuntu 桌面,藉此讓 QNAP NAS 能有更多輕鬆的客制化方式。以下將對 Ubuntu Station 的功能做介紹。

完整的 Ubuntu 功能

此 Ubuntu 是由 LXC Ubuntu 14.04.3 (約 11 月初的版本) 客制化而成,原先 Ubuntu 可以使用的應用程式或套件管理系統 apt 皆能正常使用,因此過往在 NAS 很難安裝其他自由軟體在 NAS 上的問題也能迎刃而解。下圖是使用指令安裝 VLC 播放器的螢幕截圖:



除了一般的軟體外,QNAP 針對 DKMS (Ubuntu 內動態編譯 kernel module 的機制) 也有做修正;舉例來說若要安裝 VirtualBox ,按照官網說明即可安裝,與一般軟體不同的是,在安裝中會編譯 VirtualBox 需要的 kernel module (vbox*.ko) 並安裝至系統中,QNAP 有針對這個流程優化,下圖即是在 Ubuntu Station 使用 VirtualBox 安裝 Windows 7 的截圖:



整體來說 QNAP 在這裡是儘可能的減少客制化,以提供跟光碟安裝出來相同的使用情境。(其實 QNAP 做了不少 bug fixes)

QTS 網頁控制頁面

在第一次安裝只需在 QNAP NAS App Center 裡點選安裝 Ubuntu Station 即可,開啟 Ubuntu Station 網頁控制頁面,第一次使用時約需下載 700 MB root file system,以及從 Ubuntu repository 下載更新,完成安裝後網頁界面如下圖:



它除了可控制解析度,聲音來源,另外我們提供的網頁界面的 VNC 可直接遠端操作 Ubuntu。

資料匣同步

在 Ubuntu 內也有 /share 資料匣這部份完全跟 NAS shared folder 同步,此外開啟 Ubuntu 檔案總管 (nautilus),我們將 NAS shared folder 直接放在左邊的 Sidebar,讓使用者更容易操作 NAS 上的檔案,如下圖左上視窗,而在 NAS 上的 File Station 也多了個 Ubuntu 類別直接存取 Ubuntu 登入使用者的家目錄,如下圖右下:



藉此,像是 NAS 原本提供的服務,如 Backup Station 將可直接備份 Ubuntu 檔案到遠端電腦。

獨立 IP

原先在 LXC 網路設計是用 veth,這樣的網路架構對於要開 port 給別人存取的服務會很不方便,所以這部分 QNAP 故意改用 bridge 到 default gateway 的網卡,讓 Ubuntu 也能有跟 NAS 同一個網域的 IP。

LXC 原生效能,安全,硬體加速

LXC 提供了接近原生效能,也更安全,我想這 2 點不用多說。靠著原本 LXC 設計的架構 QNAP 授與它直接與 graphic 硬體存取能力,因此原本這張顯卡能提供多少的能力,在 Ubuntu Station 也能提供相同能力,下圖顯示了 glxinfo and VAAPI 的支援狀況:


總結

目前看來 Ubuntu Station 應能在 TS-X53A 推出時一同上市,而其它較新的機種(X51, X53, X70, X71...)應該在 12 月中一同支援。因為小弟家裡是 TVS-471,這台應該能得到更好的支援(誤)


最後我想學跟蛋黃哥一樣躺著說:好~累~喔~

2015/08/17

QNAP Container Station in COSCUP





週六,有幸能在 COSCUP 分享用 QNAP Container Station 打造 CI 環境。投影片如下:



伴隨著即將 release 的 NAS Firmware 4.2,Container Station 也終於能一同發佈了。

Container Station 有許多獨家功能,像是
  1. 同時支援 ARM and x86 平台,最近出的 NAS 都有支援這個功能。
  2. 除了當紅炸子雞 Docker 外,我們還支援 LXC,LXC 更適合做 OS 的虛擬化。
  3. 自動偵測 Docker Image 裡的設定,大部分 Image 不用多做設定就能直接使用。
除此之外,為了廣大的開發者我們還提供了這些實用功能:
  1. 一鍵架設 Docker Registry,相信真的在用 Docker 的人都需要這個服務。
  2. Container Station 也可以存取已經架好的 Private Registry
  3. 用 Docker compose 來架 App Repository,而且也開放格式在 github 上。
  4. 可以輕易自己 fork 我們的 qnap-dev/container-app 來放你自己的 App,UI 上設一下就可擺脫 QNAP 的控制 (雖然我們很希望你提 PR 給我們)
  5. 進階使用者,我們已經為你提供直接存取 docker service 用到的 CA, Cert and Key,照著 UI 提示就行。
  6. 進階使用者,我們也提供了我們的 API,你可以輕易用 API 打造自己的工具。

此外,Container 也能跟原本 QNAP 獨家提供的 Virtualization (qemu-kvm) 也能結合應用。
以下影片是在 docker container 內,跑 qemu-kvm 的虛擬化,你只要給定 ISO 的位置,就可以輕易開出一台虛擬機,還附上了 HTML5 VNC 的功能,這種應用我想目前是拿來做 target under test 是還不錯方便。



最後,LXC 還有一些額外應用,COSCUP 現場,我們的攤位上,2 台電視上的 Ubuntu 是直接用 Container Station 內的 LXC container 輸出的,這個功能也讓你的 NAS 不再只是 NAS,說是台桌機也不為過,實際上我用 TS-471 拿來裝 Steam 玩遊戲,效果很不錯。




最後的最後,我相信我們產品是非常有趣且富競爭力,我們也還在徵人,辦公位址可以在忠孝新生捷運站附近或汐止,有 Python,Go,AngularJS/React 技能的人非常歡迎直接與我聯絡 dorowu_AT_qnap.com。

2013/11/12

使用 Arduino 及 Android 自製萬能遙控器 (4) - Arduino on ASUSTOR's NAS and Demo



(圖:在電視前多放了一塊板,還好不會太突兀)

還是稍微提一下前三篇提到的四隻主要程式

  1. web.py
  2. iremote (Android App)
  3. serial_tx.c
  4. ir-tx.cpp

現在只需再將 Arduino 放到 ASUSTOR NAS 上執行就完成了。

因為我在 NAS 已經放了個 Ubuntu 12.04 的環境了,所以需要完成的只剩 serial driver 的部分。Arduino 所要用的 driver 為 cdc-acm.c。在編成 .ko 時,會發生以前曾經遇到的問題 Unknown symbol and disagree about version of,所有的解決方法可參考以前寫的這篇這篇即可。

這次用很髒的方法來解,直接將有問題的函式用它的位址直接取代,如下:

// doro <<
#undef dev_info
#define dev_info(dev, fmt, arg...) _dev_info2(dev, fmt, ##arg)
int (*_dev_info2)(const struct device *dev, const char *fmt, ...) = (void *)0xffffffff8140a280;
int (*dev_warn2)(const struct device *dev, const char *fmt, ...) = (void *)0xffffffff8140a340;
int (*device_create_file2)(struct device *device, const struct device_attribute *entry) = (void *)0xffffffff8140a150;
void (*device_remove_file2)(struct device *dev, const struct device_attribute *attr) = (void *)0xffffffff8140a060;
int (*dev_err2)(const struct device *dev, const char *fmt, ...) = (void *)0xffffffff8140a3a0;
// doro >>

完整程式可參考 cdc-acm.c

最後 demo 影片:用手機操作電視


2013/11/11

使用 Arduino 及 Android 自製萬能遙控器 (3) - Arduino 環境 及 Serial 程式




接下來終於要進入高潮了,這篇會有點長,要介紹的主題包含硬體架設,在 Ubuntu 上開發 Arduino,Arduino 紅外線發送接收程式,及 Ubuntu 的 Serial 程式。


準備硬體



接法及紅外線簡介可參考這篇,非常詳細。其中要注意的是每個人用的紅外線接收零件可能略有不同,請一定要照規格上的腳位接。

以我這裡用的 TL1838




接收部分,接完長這樣



發送時,接完長這樣


(這張圖好像接反了,總之 LED 長腳接 pin 3,短腳接地)

開發環境


安裝 Arduino 開發環境,在 Ubuntu 12.04 上只需

sudo apt-get install arduino arduino-core arduino-mk

此外,還需要紅外線控制(編解碼)的 library Arduino-IRemote

cd /usr/share/arduino/libraries/
sudo git clone https://github.com/coopermaa/Arduino-IRremote IRemote



接收 Go!


選擇 Arduino IDE 的 File —> Examples —> IRemote —> IRecvDump 程式就跑出來了,在前幾行的地方,有個 RECV_PIN 從 11 改成 4,如下:

int RECV_PIN = 4;

程式上傳後,打開內建的 Serial Monitor,再拿著遙控器對著接收器隨便按個幾個鍵,紅外線的編碼即會顥示出來,接下來要做的就是將等會要用到按鍵都按過一輪,並記下來,如下圖:




發送 Go!


我家電視的遙控器是 NEC 32 bits 編碼,並且加入從 serial 讀進指定字元,傳出對應的紅外線:

if ((d = Serial.read()) != -1) {
        switch (d) {
            case '1': code = 0x1CE3807F; break;
            case '2': code = 0x1CE340BF; break;
            case '3': code = 0x1CE3C03F; break;
            case '4': code = 0x1CE320DF; break;
            case '5': code = 0x1CE3A05F; break;
            case '6': code = 0x1CE3609F; break;
            case '7': code = 0x1CE3E01F; break;
            case '8': code = 0x1CE310EF; break;
            case '9': code = 0x1CE3906F; break;
            case '0': code = 0x1CE300FF; break;
            case 'q': code = 0x1CE3708F; break; // volume up
            case 'a': code = 0x1CE3F00F; break; // volume down
            case 'w': code = 0x1CE350AF; break; // channel up
            case 's': code = 0x1CE3D02F; break; // channel down
            case 'e': code = 0x1CE3C837; break; // source
            case 'd': code = 0x1CE3A25D; break; // enter
            case 'p': code = 0x1CE348B7; break; // power
            default: code = 0;
        }
        if (code != 0) {
            irsend.sendNEC(code, 32);
        }

完整的程式可參考 github 上的 ir-tx.cpp


使用指令編繹、上傳


這支程式計畫是要在 NAS 上跑,NAS 上用指令編譯上傳會比較方便,所以若是需要用指令編譯的話,要先準備一隻 Makefile,內容如下:

BOARD_TAG = uno
ARDUINO_PORT = /dev/ttyACM0
ARDUINO_LIBS = IRremote
ARDUINO_DIR = /usr/share/arduino
include /usr/share/arduino/Arduino.mk

.PHONY: minicom

minicom:
    sudo minicom -D ${ARDUINO_PORT} -b 9600 -o

在原本的 Arduino 程式內需加上一些 header,舉例來說之前的 ir-tx.cpp 需在開頭加入:

#include <arduino.h>
#include <hardwareserial.h>

接著在放程式及 Makefile 目錄下:

make  # 編譯
make upload  #上傳
make minicom  # 打開 minicom

即可編譯,上傳。


Serial 程式


在確定用 minicom 傳接都沒問題後,在上一篇內有提到一隻 web.py 裡頭呼叫了外部程式 serial_tx 來傳送 serial 字元給 arduino,這程式請參考 serial_tx.c

若是發生 minicom 可正常傳接收串列資料,但自己的程式不行,可用 stty 來輔助除錯,它可將串列設定全都印出。

2013/11/05

使用 Arduino 及 Android 自製萬能遙控器 (2) - Android App 及 RESTful HTTP Server



(來源)

前情提要

Android App IRemote 會讓使用者直接藉著這個 App 發送指令給 NAS,NAS 準備了一隻 HTTP Server 接收這些指令。目前,只提供 2 組指令:

  1. 取得按鍵列表: curl -i http://localhost:8850/keys
  2. 按下按鍵,本例為按鍵 1: curl -i http://localhost:8850/keys/1

使用 python 寫 RESTful Service 非常容易,配合 Flask module 整隻程式不到 50 行就解決了,程式可參考這裡,所有的按鍵在程式一開頭的變數 keys 定義了。想要更進一步了解 Flask 的用法,可以參考這篇寫得相當不錯。

接著是 Android App IRemote [github]。這隻程式的重點,沒有重點,大致上來說就是按下按鍵時,去叫一隻繼承 AsyncTask 的 SendCommandTask,裡頭會幫忙送出 HttpRequestBlocking (使用 java.net.HttpURLConnection),最後再用 org.json.JSONObject 來解析回傳的 json。

相關的 IP:Port 設定都放在 AppRemote.java 這個所有 Activities 共用的物件裡。

程式畫面如下,簡單用 TableLayout 畫出,及一些 drawable 的按鈕外觀設定。



這篇真是入門的可以了...

2013/11/04

使用 Arduino 及 Android 自製萬能遙控器 (1) - 前言及架構





前言


前陣子那有趣的案子做完後,又想起以前還有東西想做沒空做的想法:用電腦來控制家庭內的所有紅外線設備。

會想做這個主題是因在前公司華芸時,做了個 Boxee 及那精美的手機 App AiRemote 直接可操作 Boxee。因為員工的關係,家裡的客廳也攞了台相同的東西,平常拿來看看日劇電影什麼的非常爽快。但可惜的是對於像我這種沙發馬鈴薯而言,光要手抬起來拿起電視遙控器,切到 HDMI,再拿起手機操作 Boxee ,就要我的命了。為什麼不直接用手機直接操作電視就好。

當然上網找一下就可以找到類似的解決方案,只是我挑了個工程師最喜歡動手做的方案:自已用 Arduino 及家裡的 NAS 兜一個來玩。

架構


這個系統的架構很簡單,包含了

  • Android App 透過 WIFI 告訴 NAS 使用者按了什麼鍵
  • NAS 會有一隻 HTTP Server 接收 Android App 命令,再由 serial port 將命令傳送給 Arduino
  • Arduino 接收到 serial 傳過來的命令後,再由它的 IR Tx 將紅外線放送個其它電器

以上,總共會寫 4 隻程式,程式全都放在 github https://github.com/fcwu/iremote 上。這 4 隻程式分別為

  1. Android App IRemote
  2. HTTP Server, written in Python, with RESTful API design
  3. Serial Tx
  4. Arduino IR

另外有些其他細節所需程式就等之前講到該章節時,再行介紹。預計接下來還會有以下幾篇介紹:

(1) - 前言及架構
(2) - Android App 及 RESTful HTTP Server
(3) - Arduino 環境 及 Serial 程式
(4) - Arduino on ASUSTOR's NAS and Demo

demo:

2013/10/30

初嚐 Greasemonkey: LpTable


有時會想要在任意的網頁上加入一些特殊設定或是需要重新排版成看起來比較爽的頁面,舉例來說:在 facebook 的登入畫面做一個快速切換帳號的按紐;又或是最近在用 Lauchpad 的 bugs 覺得它的排版很鳥,所以自己重新用 jQuery 的 tablesorter 重新排一下。

想要解決這樣的問題,一來是可以寫瀏覽器的外掛來改,二或是用我今天要介紹的方法 userscript 來達成,以 firefox 的使用者需要先安裝 greasemonkey,chrome 的使用者則要安裝 tampermonkey

這次就 Launchpad 為例,原先 Launchpad 的 bug 列表長這樣



經過了 LpTable 的 script 會變這樣



Firefox 的使用者來說,在安裝完 greasemonkey 後,再到 LpTable 的頁面按下 Install 即可使用了


基本上寫這些 script 如果已有網頁基本能力寫起來很容易,因此我就在做 LpTable 用到的一些手法來介紹。


jQuery


要在 userscript 裡載入其他 javascript 檔,只需在檔頭的部分加入 @require filepath 即可,如下:

// @require     http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.7.2.js
// @require     http://datatables.net/release-datatables/media/js/jquery.dataTables.js


CSS


要加入自訂的 CSS 也有幾種方法可以用,舉例來說第一種用 GM_getResourceText,再用 GM_addStyle 將樣式加入,在使用之前記得要先用 @grant 取得權限。又或是用比較原始的的手法,自己建立一個 style element 插在 head 裡如下:

function initStyleSheets() {
    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) { return; }
        style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }

    var css_alert = '.alert {padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; color: #468847; background-color: #dff0d8; border-color: #d6e9c6}';

    addGlobalStyle(css_alert);
    var stylesheets = ['https://dl.dropboxusercontent.com/u/23905041/media/css/demo_table.css',
                       'https://dl.dropboxusercontent.com/u/23905041/media/css/jquery.dataTables.css'
                       ];
    $.each(stylesheets, function(index, value) {
        var link = window.document.createElement('link');
        link.rel = 'stylesheet';
        link.type = 'text/css';
        link.href = value;
        document.getElementsByTagName("HEAD")[0].appendChild(link);
    });
}


Persistent Storage


要將某些資料存起來,在下次 reload 網頁時再用,可用 GM_getValue and GM_setValue 這組 API。使用前記得要 grant 權限,


TableSorter


最後是關於網頁表格的應用,跟 greasemonkey 完全沒關係。當初是希望能有一個表格,可輕鬆動態插入資料,排序,過濾資料,google 一下很快就找到了 TableSorter 這個 jQuery plugin。這部分的線上文件範例都超多,自己網上看看吧。

2013/10/13

desktop-mirror 串流螢幕上的影像及聲音到其他電腦上




desktop-mirror 最近在玩的 project,這隻程式主要是讓使用者的電腦上的畫面及聲音可以即時傳送給其他同網域的電腦,相類似的應用如 AirPlay Mirroring and Miracast

所有程式可在 github 上找到。


目前 desktop-mirror 在以下環境下測試皆能順暢的分享螢幕上畫面及聲音 Windows 7, Ubuntu 12.04 and XBMC。以下是實際使用的影片:



技術細節 - 影音串流


螢幕畫面的串流是用 ffmpeg 及 crtmpserver。其中,ffmpeg 配合著影像輸入為 x11grab (Ubuntu) 或 dshow (Windows) 將影像編碼成 H.264 baseline profile,聲音則是輸入為 ALSA 編碼成 mp3,最後封裝成 flv ,透過 TCP 傳出去。在接收端為非 XBMC 的情形下,ffmpeg 會將輸出結果送至 crtmpserver,接著 crtmpserver 為改成用 rtmp protocol 等待接收端來要求影音。

在這整個流程中有很多其他選擇,但考慮到跨平台及不同的接收端,最後才採用這樣的(奇怪)組合。

技術細節 - Windows/Ubuntu 平台移植


這隻程式使用的語言及 GUI library 是 wxPython,因此在各個平台之間的移植沒遇到什麼大問題。當然,前提是在選擇 library 及 external program 要十分注意,像是 mDNS (Avahi/Bonjour) 在 python 上介面是不是跨平台等。

唯一踩到的地雷是在 python 處理 process 輸出時用到的 select/epoll,這類的 function 在 Windows 上只支援 socket descriptor,因此重新用 Queue 及 thread 重新做了一個類似功能的東西。

最後打包成安裝檔的部分。在 Windows 就準備 py2exe,一堆的動態鏈結的程式庫和執行檔,及 NSIS 的包裝檔。Ubuntu 的部分則就準備 debianize 的資料匣,再準備個 recipe 讓它定期自行去 github import 程式,再自動編成 package 放到 PPA。

最後


這個 project 自認為很好玩,也還有一些遠端遙控的部分功能可以加強,只是我又想到別的好玩東西了,這個案子就做到這裡就好。

後記:參加了 QNAP 舉辦的 APP 競賽得到了第一名節殊榮




2013/08/12

使用 live-build 客製化無人值守 Ubuntu 安裝光碟




要客製化 Ubuntu 安裝光碟,在 Ubutnu wiki 有兩篇教學。1) LiveCDCustomization。2) InstallCDCustomization 。這兩篇文章雖然都很有參考價值,但需要先下載 Ubuntu 的光碟,並以此加工。

小弟早有所聞用 live-build 也可自製開機光碟,google 一下便又找到 Ubuntu 12.04 Cloud LiveLive-build使用指南由於不需先下載光碟,個人偏好使用這種方式,本文也將以此繼續發揮。

Build ISO


不囉嗦,請照下面步驟做:

$ sudo apt-get install live-build livecd-rootfs syslinux-themes-ubuntu-oneiric gfxboot-theme-ubuntu
$ mkdir live-build && cd live-build
$ git clone https://github.com/fcwu/custom-ubuntu-config.git config
$ sudo PROJECT=ubuntu SUITE=precise ARCH=amd64 lb build


約過半小時或好幾個小時,便會生成 binary.iso,此檔便是 Ubuntu 12.04 的安裝光碟。若要改成 13.04 的話,只需將 SUITE=precise 改成 SUITE=raring 即可。

大方向來說,指令可分 3 種, config, clean and build,這些指令若在 auto 資料匣內有相對應的檔案,舉例來說,以我們的平台 lb build 會去執行 auto/build。以下是各指令簡單的介紹:

  • lb config:在當前目錄下建立 config 目錄和相關配置文件
  • lb clean:清空所有做 ISO 時的遺物,其後還可接像 --stage --chroot --bootstrap 這類的參數來指令要清除那部分
  • lb build:按照 config 目錄下的各種配置腳本建構 ISO

無人值守安裝


好加在,Ubiquity (Ubuntu 的安裝程式) 本來就有為了無人值守留後門,Ubiquity 會用 debconf 從 /var/cache/debconf/config.dat 內讀取安裝的設定。要修改這部分可以參考 config/binary_local-includes/preseed/ubuntu.seed 或官方 preseed 文件說明

此外,要讓 Ubiquity 直接跳過那些選項,需在 boot command 加上 automatic-ubiquity。如同 config/binary_local-includes/isolinux/txt.cfg 內的這段

label live-install-auto
menu label ^Install Ubuntu Automatically
kernel /casper/vmlinuz
append file=/cdrom/preseed/ubuntu.seed boot=casper automatic-ubiquity initrd=/casper/initrd.lz quiet splash --


安裝更多軟體


安裝程式可以選擇安裝到 live 系統,或是用 Ubiquity 安裝到硬碟的 install 系統。以下提供 2 種方法。

用 .deb 安裝


這種方法會同時安裝到 live and install 系統。只需將要安裝的 .deb 丟到 config/chroot_packages 即可。但要注意 .deb 相依性的問題。

用 apt-get install 安裝


用 apt-get 的安裝方式,可任選要安裝到 live or install 系統。我們要做的事只需將要安裝的程式列表放到 package-lists 裡即可,如同 config/package-lists/example.chroot.list 所示。

terminator
vim
vim-gtk


若想選擇擇只裝到 live 或 install 系統的話,在命名 *.list 有這些規則

  • *_install.list: 只安裝到 install 系統
  • *_live.list: 只安裝到 live 系統

live-build 內部


live-build 在製作 iso 時,共分 4 大步驟:

  1. bootstrap
  2. chroot
  3. binary
  4. source

更進一步在查看 lb 源碼後,可以發現在執行 lb build 時,會分別做這 4 大步的指令 lb bootstrap, lb chroot, lb binary, lb source。相關源碼在 /usr/share/live/build/scripts/build 裡,如 lb_bootstrap, lb_chroot 這些 scripts。

bootsrap 最主要工作是用 lb bootstrap_debootstrap 建立起最基本的 root filesystem。

chroot 的工作是 chroot 到剛才建立起的 root filesystem,接著按照 config/chroot_*, package-lists and task-lists 的內容將所需修改的部分裝進去。舉例來說 chroot_local-hooks 可以放一些 hook script,chroot_local-includes 拿來放要覆蓋的檔案。

最後,binary 的工作是將 ISO 的 rootfs 和 ISO 產生出來。

source 沒在用,不用提了。

最後的最後,值得一提的是在做完任何一項工作時,.stage/ 資料匣內會產生表示做過的 flag 檔案,若有時只需重做部分工作,可手動將之刪除即可。要不然每次都等個半小時重做 ISO 就太...笨...了