2015年6月25日 星期四

Spotify 的 2015-06-25 金鑰到期了

如果有原本在使用 SpotifyDebian repository,從今天 2015-06-26 開始可能會遇到下面的問題。

W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://repository.spotify.com stable InRelease: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY 13B00F1FD2C19886

W: 無法取得 http://repository.spotify.com/dists/stable/InRelease,

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

這是因為原本的金鑰到期了

pub   2048R/94558F59 2012-06-25 [到期: 2015-06-25]
uid                  Spotify Public Repository Signing Key <operations@spotify.com>

這時候只要新增金鑰就可以解決了。

sudo apt-key adv --recv-key --keyserver keyserver.ubuntu.com D2C19886

順便將原本到期的金鑰給移除掉。

sudo apt-key del 94558F59

2015年5月9日 星期六

在 Ubuntu 14.04 上面使用 sbuild 來建立 Debian unstable 的編譯環境

首先是安裝所需要的套件

$ sudo apt-get install sbuild ubuntu-dev-tools lintian piuparts

接著是產生給 sbuild 使用的公私鑰(需要去做其它的操作來產生足夠的系統亂數,例如去瀏覽網頁)

$ sudo sbuild-update --keygen
Generating archive key.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 186 more bytes)

接下來將自己加入 sbuild 群組

$ sudo sbuild-adduser $LOGNAME
正將 `sylee' 使用者新增至 `sbuild' 群組 ...
正在將使用者“sylee”加入到“sbuild”群組中
完成。

# Setup tasks for sudo users:

# BUILD
# HOME directory in chroot, user:sbuild, 0770 perms, from
# passwd/group copying to chroot, filtered
# Maybe source 50sbuild, or move into common location.

Next, copy the example sbuildrc file to the home directory of each user and
set the variables for your system:

  cp /usr/share/doc/sbuild/examples/example.sbuildrc /home/sylee/.sbuildrc

Now try a build:

  cd /path/to/source
  sbuild-update -ud 
  (or "sbuild-apt  apt-get -f install"
       first if the chroot is broken)
  sbuild -d  _

然後登出 X Window System 再重新登入來使 sbuild 群組權限生效,如果不想重新登出登入的話,可以使用下面指令直接取得 sbuild 的群組權限。

$ newgrp sbuild

複製 sbuild 的設定範本到家目錄底下

$ cp /usr/share/doc/sbuild/examples/example.sbuildrc $HOME/.sbuildrc

開始建立 Debian unstable 的編譯環境

$ mk-sbuild --arch amd64 --distro debian unstable
[...中略]

Done building sid-amd64.

 To CHANGE the golden image: sudo schroot -c source:sid-amd64 -u root
 To ENTER an image snapshot: schroot -c sid-amd64
 To BUILD within a snapshot: sbuild -A -d sid-amd64 PACKAGE*.dsc

接下來就可以使用 sbuild -A -d sid-amd64 PACKAGE*.dsc 來編譯 Debian binary package 了。

$ sbuild -A -d sid-amd64 x11-touchscreen-calibrator_0.2-2.dsc

另外可以修改 ~/.sbuildrc 在編譯完成時,自動加上 lintian 以及 piuparts 的檢查。

$run_lintian = 1;
$lintian_opts = ['-EviIL', '+pedantic', '--profile', 'debian'];

$run_piuparts = 1;
$piuparts_opts = ['-D', 'debian', '--schroot=chroot:sid-amd64'];

參考資料:https://wiki.debian.org/sbuild

2015年3月23日 星期一

為 Bay Trail 低功耗小電腦安裝 Ubuntu 14.04.2 所做的一些最佳化

首先是實體記憶體只有 1~2 GB

所以安裝 zram-config 跟修改 /etc/default/grub 當中的 GRUB_CMDLINE_LINUX 加上 zswap.enabled=1

sudo apt-get install zram-config
sudo service zram-config start
sudo sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="zswap.enabled=1"/' /etc/default/grub
Zram 是壓縮實體記憶體當中的資料的技術,而 Zswap 則是壓縮 Swap 分割區當中的資料的技術,兩者都會稍微增加 CPU 使用量。

然後是透過 VAAPI 來使用硬體解碼器

首先可以安裝 VAAPI 相關的軟體套件。

sudo apt-get install i965-va-driver gstreamer1.0-vaapi vainfo

然後就可以透過 vainfo 指令看到有支援哪些硬體加速編碼跟解碼

$ vainfo
libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_35
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.35 (libva 1.3.0)
vainfo: Driver version: Intel i965 driver - 1.3.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD

然後安裝 VLC 媒體播放器後,再從偏好設定中開啟功能。

sudo apt-get install --yes vlc

讓 Chromium 支援 VAAPI

然後因為到目前為止 (2015/03/23) Google Chrome/Chromium 並沒有支援一般 Linux 系統上的 VAAPI,所以如果想要使用必須安裝 ppa:saiarcot895/chromium-beta 所提供的 Chromium 才會有。

另外可能還需要更改 Chromium 的啟動參數,為了減少 Chromium 的記憶體使用量,我還參考了 Process Models - The Chromium Projects 上面的模式,使用了 --process-per-site。

sudo add-apt-repository --yes ppa:saiarcot895/chromium-beta
sudo apt-get update
sudo apt-get install --yes chromium-browser
sudo sed -i 's/CHROMIUM_FLAGS=""/CHROMIUM_FLAGS="--ignore-gpu-blacklist --process-per-site"/' /etc/chromium-browser/default

另外還要在 Chromium 上安裝 Adblock for Youtube™h264ify,安裝 Adblock for Youtube™ 是因為 Youtube™ 影片內嵌的廣告會影響到播放品質,在這個低功耗的電腦上面特別明顯,而安裝 h264ify 則是因為 Youtube™ 預設的串流編碼是 VP9,而我用的這個電腦上面並沒有支援 VP9 的硬體加速解碼,所以安裝 h264ify 強制讓 Youtube™ 串流編碼變成 H264。

另外就是 Ubuntu Unity 桌面預設的 Totem 媒體播放器目前還沒有支援 VAAPI,不然安裝 gstreamer1.0-vaapi 可以派上用場了,不過也許可以參考 http://gitorious.org/vaapi/gstreamer-vaapi 當中的 README 使用 gst-launch-1.0 來感受一下。

Usage
-----

  VA elements are automatically plugged into GStreamer pipelines. So,
  using playbin (or playbin2 with GStreamer 0.10) should work as is.
  However, here are a few alternate pipelines that could be manually
  constructed.

  * Play an H.264 video with an MP4 container in fullscreen mode
  $ gst-launch-1.0 -v filesrc location=/path/to/video.mp4 ! \
      qtdemux ! vaapidecode ! vaapisink fullscreen=true

  * Play a raw MPEG-2 interlaced stream
  $ gst-launch-1.0 -v filesrc location=/path/to/mpeg2.bits ! \
      mpegvideoparse ! vaapidecode ! vaapipostproc ! vaapisink

  * Convert from one pixel format to another, while also downscaling
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=yuy2 width=1280 height=720 ! \
      vaapipostproc format=nv12 height=480 ! vaapisink

  * Encode a 1080p stream in raw I420 format into H.264
  $ gst-launch-1.0 -v filesrc location=/path/to/raw_video.yuv ! \
      videoparse format=i420 width=1920 height=1080 framerate=30/1 ! \
      vaapiencode_h264 rate-control=cbr tune=high-compression ! \
      qtmux ! filesink location=/path/to/encoded_video.mp4

Mozilla Firefox 目前好像也沒有支援 VAAPI,也許有人可以幫忙補充一下進度。

未來的 PowerVR 對於 VP8 的硬體加速解碼支援

目前只看到了兩則報導,分別是去年十月的 Intel Publishes DRM Driver For PowerVR Video Decoder! VP8 Decoding! 跟今年一月的 Intel Is Still Working On The VED DRM Driver For PowerVR,但是還沒有看到那些 commits 進到 mainline kernel 裡面,另外 Youtube™ 上面的預設串流編碼是 VP9,不曉得 VP8 的硬解支援能不能夠幫助到 VP9,目前看起來未來會多一兩個檔案名稱內有 ipvr 的 kernel module 。

最後另外順便收集了一下 Dell New XPS 13 在 vivid 上面的 vainfo 感覺還不錯。

libva info: VA-API version 0.37.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_37
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.37 (libva 1.5.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Broadwell - 1.5.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice

2014年9月13日 星期六

解決 Debian packaging 過程中的 compiler-flags-hidden 警告訊息

compiler-flags-hidden 警告訊息的說明在 https://qa.debian.org/bls/bytag/W-compiler-flags-hidden.html 可以看到。

裡面提到的

可以參考一下,其主要的目的是要盡可能地強化執行檔的安全性。

以 x11-touchscreen-calibrator 0.2-1 為例,將其編譯導向某個檔案儲存,然後再使用 blhc 指令來檢查,就可以看到:

$ blhc --all --color ../log
NONVERBOSE BUILD:   CC       x11_touchscreen_calibrator-x11-touchscreen-calibrator.o
NONVERBOSE BUILD:   CCLD     x11-touchscreen-calibrator

因為 x11-touchscreen-calibrator 上游將 Automake Silent Rules 預設開啟,然後 x11-touchscreen-calibrator 又只使用最簡單的 debian/rules 如下:

#!/usr/bin/make -f                                                                                                                                      
# -*- makefile -*-

%:
        dh  $@

然而 debhelper 到了 9.20140817 預設上還是不會將 --disable-silent-rules 自動加上使用,請見 https://wiki.debian.org/ReleaseGoals/VerboseBuildLogs 的資料。

不過在 Debian Bug report logs - #751207 在有設定 DH_VERBOSE 且 DH_VERBOSE 的值不為空字串的條件下,會自動加上 --disable-silent-rules,所以將 debian/rules 改寫成如下:

#!/usr/bin/make -f                                                                                                                                      
# -*- makefile -*-

export DH_VERBOSE=1

%:
        dh  $@

這樣就可以將 --disable-silent-rules 加上,而且有更詳細的套件包裹編譯過程,不過 blhc 的檢查還是會看到其它的訊息:

$ blhc --all --color ../log
CFLAGS missing (-fPIE): gcc -DHAVE_CONFIG_H -I.   -D_FORTIFY_SOURCE=2  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -c -o x11_touchscreen_calibrator-x11-touchscreen-calibrator.o `test -f 'x11-touchscreen-calibrator.c' || echo './'`x11-touchscreen-calibrator.c
LDFLAGS missing (-fPIE -pie -Wl,-z,now): libtool: link: gcc -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wl,-Bsymbolic-functions -Wl,-z -Wl,relro -o x11-touchscreen-calibrator x11_touchscreen_calibrator-x11-touchscreen-calibrator.o  -lX11 -lXi -lXrandr

這時候就可以將 debian/rules 改成如下:

#!/usr/bin/make -f                                                                                                                                      
# -*- makefile -*-

export DH_VERBOSE=1
export DEB_CFLAGS_MAINT_APPEND=-fPIE
export DEB_LDFLAGS_MAINT_APPEND=-fPIE -pie -Wl,-z,now

%:
        dh  $@

這樣就可以將缺少的 CFLAGS 跟 LDFLAGS 參數加入使用。

最後我們可以使用 hardening-check 來檢查一下執行檔。

使用前:

$ hardening-check /usr/bin/x11-touchscreen-calibrator 
/usr/bin/x11-touchscreen-calibrator:
 Position Independent Executable: no, normal executable!
 Stack protected: yes
 Fortify Source functions: yes
 Read-only relocations: yes
 Immediate binding: no, not found!

使用後:

$ hardening-check /usr/bin/x11-touchscreen-calibrator 
/usr/bin/x11-touchscreen-calibrator:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: yes
 Read-only relocations: yes
 Immediate binding: yes

這也是 W-compiler-flags-hidden 這個警告訊息想要讓我們做的事情,透過調整編譯時的參數來強化執行檔的安全性。

2014年9月4日 星期四

Lubuntu 14.04 的最小安裝

一般的 Lubuntu 14.04 安裝會順便安裝一些安排好的應用程式上去,如果想要自己調整的話,安裝完 Lubuntu 14.04 又要再手動去將不想要的應用程式移除掉,這樣的作法不但麻煩,而且會清得不夠乾淨,另外一方面也怕移除掉重要的系統元件,導致 LXDE 桌面環境無法正常使用,那麼就可以考慮使用 Lubuntu 的最小安裝模式。

作法很簡單,就是透過 netboot 來安裝,首先到 http://cdimage.ubuntu.com/netboot/ 上面找到自己想要的安裝方式,無論是透過 PXE 還是直接製作 bootable USB stick 都可以。

然後就啟動 netboot 的環境來安裝,而中間會有一個步驟讓你選擇想要安裝的套餐,如下圖(可以多選):

只要選擇 Lubuntu minimal installation 就可以了。

安裝完的桌面如下:


清爽的桌面。

檔案管理程式 PCManFM

XTerm 終端機程式

Openbox 組態管理器跟桌面偏好設定

至於其它的東西就打開 XTerm 再用 apt 程式來一個一個安裝上去就好了,相當清爽又簡潔,還沒有再安裝其它東西之前總共使用空間約 1.7 G。

補充資料:

2014年8月18日 星期一

在 Ubuntu 14.04 桌面環境上面設定 Exim4 使用 Gmail 來寄信

一般來說 Ubuntu 桌面環境安裝好就已經將 exim4 安裝在裡面了,只不過預設上是使用「只傳送本機的郵件;並未位於網路上」,如果要改用 Gmail 就要執行以下的指令。

$ sudo dpkg-reconfigure exim4-config

然後選擇「使用 smarthost 來傳送郵件;且無本機郵件」

接下來的「系統郵件名稱 (mail name)」填入“localhost”

「在有 SMTP 連線傳入時,要進行監聽的 IP 位址」維持“127.0.0.1 ; ::1”

「要進行接收的其它郵件位址」填入空白

「本機使用者的虛擬網域名稱」維持“localhost”

「外寄郵件時所使用的 smarthost 的 IP 位址或主機名稱」填入“smtp.gmail.com::587”

之後都用預設值,直到結束。

接下來使用以下指令來找出 Gmail 的 smtp 伺服器。

ubuntu@trusty:~$ host smtp.gmail.com
smtp.gmail.com is an alias for gmail-smtp-msa.l.google.com.
gmail-smtp-msa.l.google.com has address 74.125.25.108
gmail-smtp-msa.l.google.com has address 74.125.25.109
gmail-smtp-msa.l.google.com has IPv6 address 2607:f8b0:400e:c02::6d

然後就可以編輯 /etc/exim4/passwd.client 這個檔案,加入以下這行。

*.google.com:SMTPAccountName@gmail.com:y0uRpaSsw0RD

然後編輯一下 /etc/email-addresses 將自己本機上的帳號跟 Gmail 關聯起來。

$ echo "$(whoami): SMTPAccountName@gmail.com" | sudo tee -a /etc/email-addresses

最後再用以下指令,重新啟動 exim4 應該就可以寄信出去了。

$ sudo service exim4 restart

可以使用下面這個指令的寄給自己測試一下。

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

P.S. 上面提到的 SMTPAccountName 請改成自己的帳號,y0uRpaSsw0RD 密碼可以到 https://security.google.com/settings/security/apppasswords 上面產生取得。

參考資料:https://wiki.debian.org/GmailAndExim4

2014年7月15日 星期二

在 Ubuntu 上面安裝 mainline kernels

所謂的 mainline kernels 就是在 The Linux Kernel Archives 上面由 Linus Torvalds 本人釋出的版本, 而 Ubuntu 本來有一個 Ubuntu Kernel PPA 專門用來編譯這些 mainline kernels, 只是後來不曉得為何就不再使用 PPA 改用手動編譯的方式,可能是因為 Linux kernel 的釋出方式有了許多變化,除了原本的 stable 跟 mainline 還另加入了 longterm 的支援, 而 Ubuntu 的 Kernel team 本來就有準備一個 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 上面備份了所有的 mainline kernels, 所以就繼續沿用這樣的名稱,但其實這上面還包括了 stable 跟 longterm 後來所有的版本。

總之 http://kernel.ubuntu.com/~kernel-ppa/mainline/ 上面放的是沒有 Ubuntu 額外加料的原始 kernel 版本,只是都編譯成了 Debian package, 所以想要使用的人可以直接下載來安裝就可以使用了,而這些 kernel 如果在安裝使用上會有什麼問題,當然也不會在 Ubuntu 的支援之中,這些 kernel 的存在只是用來測試的,藉由安裝不同的版本來找出問題是在哪兩個版本之間發生的,或是在哪兩個版本之間解決的,進而幫助開發者縮小問題發生的地方,來找出相關合適的修補檔。

但是這樣不斷地手動下載安裝,也是很麻煩的,所以我寫了一個小工具來幫忙,它就叫做 mainline-kernels.sh,下載後像下面這樣執行就可以看到使用說明:

$ ./mainline-kernels.sh --help
Usage ./mainline-kernels.sh:
    -h|--help       The manual of this script
    -f|--from NUM   Lower bound of kernel version
    -t|--to   NUM   Upper bound of kernel version
    -l|--list       List available kernel versions
    -r|--remove     Remove mainline kernels

可以先使用 ./mainline-kernels.sh --list 來找出現在有哪些 kernel 可以使用。

$ ./mainline-kernels.sh --list
2.6.15               2.6.24.7             2.6.24                       2.6.25               2.6.26               2.6.27.47-intrepid
2.6.27.58-intrepid   2.6.27.59-intrepid   2.6.27.60-intrepid           2.6.27.61-intrepid   2.6.27.62-intrepid   2.6.27
2.6.28.10            2.6.28               2.6.29.6                     2.6.29               2.6.30.10            2.6.30
...
3.15~rc3-utopic      3.15~rc4-utopic      3.15~rc5-utopic              3.15~rc6-utopic      3.15~rc7-utopic      3.15~rc8-utopic
3.15-utopic          3.15.1-utopic        3.15.2-utopic                3.15.3-utopic        3.15.4-utopic        3.15.5-utopic
3.16~rc1-utopic      3.16~rc2-utopic      3.16~rc3-utopic              3.16~rc4-utopic      3.16~rc5-utopic

然後直接安裝想要的 Linux kernel

$ ./mainline-kernels.sh 3.16~rc4-utopic 3.16~rc5-utopic

或是指定一個範圍來安裝

./mainline-kernels.sh --from 3.15~ --to 3.16

或是什麼都不指定直接執行,之後再慢慢從選單上面挑選。

./mainline-kernels.sh

最後再將安裝的 Linux kernel 移除掉。

./mainline-kernels.sh --remove

要提醒的一點是,這邊的版本號碼是遵循 Debian version 的規則,所以波浪符號有特別的意義,可以參考我以前的文章

最後分享一下 Ubuntu to Mainline kernel version mapping,結束這一回合。