Showing posts with label NAS. Show all posts
Showing posts with label NAS. 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 權限究竟要開那些等等,整體來說是個很有趣的經驗。

2017/06/26

QNAP Browser Station: 免安裝直接使用 NAS 成連線跳板

太久沒寫文章,代表敝部門很久沒產品了嗎?其實不盡然,Container Station 現在是很多 App 的核心,這部分做了很多的努力,這些改進就留到下次想起來再寫。

這次是要介紹最近也是敝部門的新產品 Browser Station,2 個月內下載次數破萬(開心),這項產品的使用情境就是把 NAS 當跳板,像身處中國想用 FB,此時只有家裡有台 NAS 裝上 Browser Station 想連到那都可以,又或是說在家裡很想連到公司的某個網頁服務,這時只要確保你可以連到公司任一台 NAS,便可開啟虛擬的 Browser,讓你從 NAS 直接上網,使用起來像下圖,Chrome in Firefox


有在 follow 我的 github 的人,大概知道我有個星星很多的 project Docker VNC Ubuntu Desktop,原理大概就是那樣,Xvfb, x11vnc, noVNC 等等。

當然 QNAP 這版有一些特殊功能,像是

可打中文,輸入法是直接用外面的 (host)


視窗大小是可以隨意調整的 (不要以為這很好做,超難的)


複製貼上是必備的 


其他使用者的登入情境就不截圖了,就技術上還有 host 上該使用者可存取的 folder 會即時同步到 container 內,這用了 bindfs and inotify 來達成。

另外寫了個 Chrome extension 來替換原本的 Chrome 首頁。

一個有趣的 project...

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: