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

2017年7月4日 星期二

用 caff + gmail 簽署別人的金鑰

雖然已經簽了很多次,但時隔太久,沒想到還是忘光了。還是寫在 blog 作個紀錄。

先安裝 caff:
$ sudo apt install caff

caff 應該會自己把你系統上已有的 GPG key 寫在 ~/.caffrc,確認一下有沒有舊的或 revoke 的 key。加入自己的姓名和 Email。為了使用 msmtp,所以加入下面這行:
$ENV{'PERL_MAILERS'} = 'sendmail:/usr/bin/msmtp';

接下來,按照 Google 的說明網頁產生一組應用程式密碼。必須要先打開兩階段驗證才能產生應用程式密碼。 然後安裝 msmtp-mta:
$ sudo apt install msmtp-mta

然後 ~/.msmtprc 的設定如下:
account       gmail
host          smtp.gmail.com
port          587
auth          on
protocol      smtp
tls           on
tls_certcheck off
domain        lexical.tw #代換成你的 Email domain
from          kengyu@lexical.tw #代換成你的 Email
user          kengyu@lexical.tw #代換成你的 Email
password      你的應用程式密碼
syslog        LOG_MAIL
account       default: gmail

接下來就用 gpg --recv-keys KEY_ID,把你想簽的人的 Key 抓下來,然後確認一下 fingerprint 正不正確。如果沒問題就可以簽署:
$ caff KEY_ID

因為我們前面已經把 .msmtprc 和 .caffrc 設定好了,簽過的 key 會直接寄給那個人的 Emails。

2012年6月11日 星期一

在 Ubuntu 上執行 Diablo 3 (暗黑破壞神)

首先我的顯示卡是 AMD Radeon HD7750,可惜這麼新的硬體在 Ubuntu 中的支援一向不是很好。

所以需要 AMD Catalyst™ 12.6 Beta Driver (fglrx 8.980)Linux 版驅動程式下載位置

下載下來解壓縮,再將它轉成 .deb 套件,再安裝。

./amd-driver-installer-8.98-x86.x86_64.run --buildpkg Ubuntu/precise
sudo dpkg -i fglrx-amdcccle_8.980-0ubuntu1_amd64.deb fglrx_8.980-0ubuntu1_amd64.deb

接下來要為 wine apply 幾個給 Diablo 3 用的 patch;還有一個為了 HD7750 我寫的 patch;因為我也有玩 WoW,所以也加了一個魔獸的 patch。

PPA下載位置: https://launchpad.net/~lexical/+archive/diablo3

直接裝應該就可以。接下來再用下列的 script 來啟動。因為我是用 playonline 做出來的 prefix,請自行代換。

#!/bin/sh

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

WINEPREFIX=~/.PlayOnLinux/wineprefix/DiabloIII/ WINENOPULSE=1 force_s3tc_enable=true taskset -c 0-1 setarch i386 -3 wine ~/.PlayOnLinux/wineprefix/DiabloIII/drive_c/Program\ Files/Diablo\ III/Diablo\ III -launch -opengl -w

2012年4月18日 星期三

亮度熱鍵和消失的OSD

在這個cycle中,Hardware Enablement team 遇到了好幾款筆電的亮度熱鍵 bug;癥狀為亮度調整功能正常,但是亮度的 OSD 卻沒有出現。

看起來是個小 bug,但是因為牽涉到硬體、kernel 驅動程式和gnome之間行為的互動,而成了有點難解的問題。

主要的問題在於對於亮度鍵的行為在不同的硬體上並沒有統一,有些廠牌的筆電會直接送出 scancode,gnome-settings-daemon 收到 keycode 之後會再去對 driver 產生出來的 sysfs backlight 介面做存取,之後再由 driver 負責來調整亮度。gnome-settings-daemon 在收到 keycode 的同時也會產生 libnotify 的 dbus message,而 notify-osd 收到之後負責畫出 OSD。

但在一些其它的筆電,在按下亮度鍵時並不產生 scancode,而是透過 WMI 通知 OS,kernel driver 在收到後必須負責調整亮度。在這樣的情況下因為沒有 scancode 和 keycode,所以 gnome-settings-daemon不 會收到任何通知,所以也沒有 OSD。

當然我們也可以更改 driver 程式碼,讓 driver 在收到 WMI 時也同時產生 keycode,這樣的確可以讓 OSD 正確的出現;但是因為硬體已經調整了亮度,driver 產生的 keycode 會讓亮度再被調整一次,所以導致只按了一次卻調了兩格亮度的 bug。

一個比較好的解決方式是 gnome-settings-daemon 應該使用 uevent 而不是 keycode(至少在Linux平台上),如 Corentin Chary 在Gnome Bug 672380的comment:

Because what not how it *should be done*. Keys are not notifications at all. Keys are emitted if a user press something that should be interpreted by userspace as "in reponse to this key, please adjust the brightness".

In this case, what we get from the hardware is only a brightness change notification, and it's what we will relay to userspace. It's just how the Linux backlight class works. And, really, the OSD should only pop in response to backlight notification, and never in response to keys, keys should only be used to adjust the backlight (which will pop a notification by itself).

2012年1月13日 星期五

Ubuntu Packaging Guide 和 UDD

Ubuntu Packaging Guide 如果只看文章標題和列表的話,表面上似乎和 debian 沒什麼差別。

但是 Ubuntu 現在都是透過 Ubuntu Distributed Development 的模式來開發,所以裡面許多章節都是重寫過的,新增加了 UDD 的部份。

例如 Uploading a package,裡面提到了在 dput 之面必須用 bazzar 在 launchpad 建立一個 branch 之類的新流程。

取得WMI GUID的三個方式

許多筆記型電腦的熱鍵(hotkey)都是透過WMI介面來控制的,常見的如音量大小、亮度,wifi開關等…。

在實作或是debug時,第一步就是必須取得WMI的GUID。在Linux下我所知道的有三種方式可以取得:

方式一:`ls -l /sys/class/wmi`

這種方式只能列出所有由wmi.ko (ACPI-WMI Mapping Driver)得到的GUID,沒有其它如flag的資訊。

方式二:使用 wmidump

wmidump可以列出詳細的wmi資訊,但是用法比較麻煩,必須先dump DSDT,再用文字編輯器把 _WDG 中的資料複製到另一個文字檔案,然後再餵給 wmidump。wmidump也沒在debian/ubuntu archive中,必須自己從上面的git tree clone下來編繹。

方式三:`sudo fwts wmi`

yeah,最簡單的方式,用 Firmware Test Suite (fwts) \o/。可以列出完整的wmi資訊,用法又簡單。

2012年1月12日 星期四

增加fwts的測項

幫fwts增加一個測項十分簡單,十分類似kernel driver的型式。

下面這段簡單的例子是從 http://kernel.ubuntu.com/git?p=hwe/fwts.git;a=blob;f=src/example/blank/blank.c 刪掉一些 comment 而來。

不過如果你真的要開始coding的話,可以直接從 blank.c 開始,裡面有更多詳細的註解。

#include "fwts.h"

static int example_init(fwts_framework *fw) {
}

static int example_deinit(fwts_framework *fw) {
}

static int example_test1(fwts_framework *fw) {
}

static int example_test2(fwts_framework *fw) {
}

static fwts_framework_minor_test example_tests[] = {
 { example_test1, "Example sub test1 name." },
 { example_test2, "Example sub test2 name." },
 { NULL, NULL }
};

static fwts_framework_ops example_ops = {
 .description = "Example name.",
 .init        = example_init,
 .deinit      = example_deinit,
 .minor_tests = example_tests
};

FWTS_REGISTER(example, &example_ops, FWTS_TEST_ANYTIME, FWTS_BATCH);

2012年1月9日 星期一

Firmware Test Suite (fwts): BIOS測試工具

Firmware Test Suite(fwts)是目前Canonical Hardware Enablement team維護的BIOS測試工具。HWE的日常工作常常遇到許多BIOS的bug,所以我們將常見的BIOS bug的測項寫成這個工具。

在這個Ubuntu release cycle,我開始接下fwts套件的維護工作,歡迎大家的使用。 :-)

git tree: http://kernel.ubuntu.com/git?p=hwe/fwts.git

想使用最新版本,也可在firmware testing team PPA安裝。

2011年12月3日 星期六

ibus-array patch-applied tree

目前 ibus-array 有許多未 merge 到 upstream 的 patch,主要是在製作 debian 套件時放在 debian/patches 中的 quilt patch。

將這些 patch 做了些整理,放在 https://github.com/lexical/ibus-array/tree/patch-applied

2011年12月2日 星期五

betaradio libindicator port

我是 FourdollarsBetaradio 的愛用者,但是Ubuntu目前只支援indicator,而原本的 betaradio 需要 notification area,在Ubuntu預設是不顯示的。

隨手寫了一個betaradio indicator的版本:

git branch: https://github.com/lexical/betaradio/tree/indicator
ppa: https://launchpad.net/~lexical/+archive/indicator-betaradio

2011年11月22日 星期二

apport-bug 某個「癥狀」

apport-bug後面也可以接目前bug的「癥狀」(symptom),例如我要收集對解audio問題有用的apport log,可以用下列指令:
apport-bug audio --save=audio.apport
會出現視窗,問你幾個和這個bug相關的問題。
這些symptom被包含在apport-symptoms套件中,目前只有「audio」、「storage」、「display」、「storage」四種。

2011年11月17日 星期四

將apport的資料存下來

apport是Ubuntu中一套用來回報除錯資訊的軟體,一般的用法是後面直接接launchpad的bug number即可:
apport-collect 888888

這樣就會自動把一些有用的debug資訊送到launchpad上。

但是有個限制是你必須是原始的bug回報者才能回報這些debug資訊。

如果想將debug log貼到別人回報的bug上,可以把apport log存下來,再手動的處理:

apport-bug linux --save=./apport.log

解開的指令:
  mkdir mylog; apport-unpack ./apport.log mylog

之後可自行將有用的log貼在launchpad上,或是直接整個tar之後貼上。

2011年11月8日 星期二

UDS-P 第一天 (Plenary)



* Introduction and Keynote [影片]

- developer.ubuntu.com: Ubuntu的軟體市集
- 剛釋出的Ubuntu One Windows版吸引了25000個從未使用過Ubuntu的新使用者
- lightDM
- Unity Lens: 整合了banshee和ubuntu one
- 新的monospace字型
- openstack, Rackspace。 HP開始使用Ubuntu with Openstack。
- ARM已經點燃戰火,入侵傳統PC的世界。
- ARM on server. 64Bit.
- Vodafone ARM筆電
- 5年LTS支援。在目前Ubuntu中支援的硬體(hardware enablement, certification),也應該在LTS版中支援。
- Dell, Lenovo, Acer, Asus等OEM都有出預安裝的Ubuntu機器
- Juju/charm: language to cloud services
- 重度使用者:Ubuntu除了簡化使用性之外,也該吸引重度使用者
- power management
- 14.04LTS: 未來兩年的趨勢,Ubuntu手機, Tablet和電視版
- Unity,這些大螢幕、小螢幕的設備都能有個統一桌面環境

Ubuntu 12.04開發者大會 (UDS)

Ubuntu 11.10 (Oneiric Ocelet、夢幻的豹貓)才釋出不久,Ubuntu社群和Canonical員工又趕忙開始下一版的開發大會(Ubuntu Developer Summit, UDS)。

Ubuntu 12.04命名為Precise Pangolin(精密的穿山甲)。為長期支援的發行版(LTS),支援期為五年。

這次的地點和一年前的UDS-N一樣都在佛羅里達Orlando的Caribe Rayale飯店。

UDS是有點像個大雜儈的活動,Ubuntu各個team會各自有自己的討論場次(session)。同一個時段的總容量是24個tracks(將Linaro Connect也列入)。

每個session都有live audio streaming,遠端的參加者可以透過freenode的IRC頻道發問。有些重要的場次會有live video streaming。

之後這些bluesprint都再被再整理成詳細的work item,被列入下一版的實作。

開始吧!let's rock!

2010年11月9日 星期二

Ubuntu和mainline kernel的版號關係

Ubuntu kernel會自己maintain ABI number,ABI number會被加入kernel meta-package的版號的一部份,也會用來作為kernel image的package name的一部份。這部份比較複雜,可能要專文討論。

如果只是想查詢Ubuntu kernel某個版號和mainline kernel的對應關係,請見:

http://kernel.ubuntu.com/~kernel-ppa/info/kernel-version-map.html

2010年10月13日 星期三

Ubuntu切換外接video的hotkey作法

首先evdev driver必須從kernel input event得到正確的keycode,在/usr/include/linux/input.h定義為:
#define KEY_SWITCHVIDEOMODE     227


然後在xkb-data套件中定義了kernel keycode到X keycode的mapping:在/usr/share/X11/xkb/keycodes/evdev裡:
<I235> = 235;   // #define KEY_SWITCHVIDEOMODE     227


在/usr/share/X11/xkb/symbols/inet裡:
key <I235>   {      [ XF86Display           ]       };


於是當切換外接video的hotkey按下後,也就是scancode產生時,kernel input event會產生出值為227的keycode,evdev讀到之後,Xserver再依據xkbdata的設定轉換為XF86Display。

接下來gnome-settings-daemon會filter這個X key,如gnome-settings-daemon-2.32.0/plugins/xrandr/gsd-xrandr-manager.c:

if (xev->xany.type == KeyPress) {
if (xev->xkey.keycode == manager->priv->switch_video_mode_keycode)
handle_fn_f7 (manager, xev->xkey.time);
else if (xev->xkey.keycode == manager->priv->rotate_windows_keycode)
handle_rotate_windows (manager, xev->xkey.time);


g-s-d每收到一個XF86Display key時,會呼叫gnome-rr-* 相關的函式(請見libgnomeui/gnome-rr.h),透過RandR API切換螢幕顯示的設定,便會切換到如外接投影機等顯示設備。

參考:http://live.gnome.org/RandR

2010年10月6日 星期三

在live-helper config中加入自訂的套件

將要預設安裝的套件放在config/chroot_local-packages目錄中即可。

參考:Debian Live Manual 6.3.1 Using chroot_local-packages to install custom packages

在live-helper config中加入private PPA

首先確定在config目錄中的bootstrap有這一行:

LH_BOOTSTRAP_INCLUDE="apt-transport-https"


因為private PPA是透過HTTPS。

然後在config/chroot_sources/把PPA的source list加入在myppa.chroot當中。

接下來要加入PPA的public key,將它存在同一個目錄的myppa.chroot.gpg檔案中:

apt-key adv --recv-key <KEYID>
apt-key export <KEYID> > myppa.chroot.gpg


這樣lh build時應該就能加入private PPA。

2010年9月12日 星期日

DKMS和KERNELRELEASE變數

當 Makefile 是從 kernel build system 被呼叫執行時,KERNELRELEASE 變數會被 kbuild 定義。

這是一個常見的 Makefile 小技巧,判斷 KERNELRELEASE 是否定義來執行不同的設定。

如下列是compat-wireless的Makefile,就用到這樣的技巧:

  1. (SKIP)

  2. ifneq ($(KERNELRELEASE),)

  3. NOSTDINC_FLAGS := -I$(M)/include/ \
  4. -include $(M)/include/linux/compat-2.6.h \
  5. $(CFLAGS)

  6. obj-y := compat/

  7. obj-$(CONFIG_COMPAT_RFKILL) += net/rfkill/

  8. ifeq ($(BT),)
  9. obj-$(CONFIG_COMPAT_WIRELESS) += net/wireless/ net/mac80211/
  10. obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += drivers/net/wireless/


  11. endif


  12. else

  13. export PWD := $(shell pwd)
  14. CFLAGS += \
  15. -DCOMPAT_BASE_TREE="\"$(shell cat compat_base_tree)\"" \
  16. -DCOMPAT_BASE_TREE_VERSION="\"$(shell cat compat_base_tree_version)\"" \
  17. -DCOMPAT_PROJECT="\"Compat-wireless\"" \
  18. -DCOMPAT_VERSION="\"$(shell cat compat_version)\""

  19. # These exported as they are used by the scripts
  20. # to check config and compat autoconf
  21. export COMPAT_CONFIG=config.mk
  22. export CONFIG_CHECK=.$(COMPAT_CONFIG)_md5sum.txt
  23. export COMPAT_AUTOCONF=include/linux/compat_autoconf.h
  24. export CREL=$(shell cat $(PWD)/compat_version)
  25. export CREL_PRE:=.compat_autoconf_
  26. export CREL_CHECK:=$(CREL_PRE)$(CREL)

  27. include $(PWD)/$(COMPAT_CONFIG)

  28. all: modules

  29. modules: $(CREL_CHECK)
  30. @./scripts/check_config.sh
  31. $(MAKE) -C $(KLIB_BUILD) M=$(PWD) modules
  32. @touch $@

  33. (SKIP)

  34. endif


當從 shell 執行 make 時,因為 KERNELRELEASE 沒有定義,所以第23行到第39行之間的一些變數和 CFLAGS 會被設定,然後第45行會呼叫 kbuild 的 Makefile:
$(MAKE) -C $(KLIB_BUILD) M=$(PWD) modules

之後 compat-wireless 的 Makefile 又會被呼叫一次,此時 KERNELRELEASE 已經被 kbuild 所定義,所以第5行到第18行會被執行。而做的事情就如同一般的 module Makefile 將 driver 的路徑加入 obj-$CONFIG_* 中,如第15行:
obj-$(CONFIG_COMPAT_WIRELESS_MODULES) += drivers/net/wireless/




不過,DKMS 在 build module 時會自己傳入 KERNELRELEASE 這個參數,如在 /usr/sbin/dkms:function do_build():
local the_make_command=`echo $make_command | sed "s/^make/make KERNELRELEASE=${kernelver_array[0]}/"`


我們可以看到,在 compat-wireless 的 Makefile 中,當 KERNELRELEASE 變數已被設值時,並沒有 target 可以 build,必須是經由 kbuild 的 Makefile 來 make 才可以。

所以一個 workaround 是在 dkms.conf 中將 MAKE[0] 寫成 make -C /lib/modules/`uname -r`/build M=`pwd` modules。但是在這個例子中我們還必須先在 CLFAGS 中加入一些 define。直接呼叫kbuild的話,這些 CFLAGS 都沒設定,這樣並無法正確的 build 出 module。

所以,一個可行的辦法是將 Makefile 拆開,然後在 dkms.conf:MAKE[0] 中自行指定 Makefile,如:
make -f dkms.mk


雖然必須更改原始的 Makefile,但是卻可讓 DKMS 正確運作。