vboxdrv: Unknown symbol mcount

公司的桌機是用 Ubuntu 12.04 LTS,今天發現 virtualbox 不能執行了,就順道把 Kernel 升級到 trusty (linux-image-generic-lts-trusty),然後重新安裝 virtualbox,發現不行,Ubuntu 附的 virtualbox-ose 會說沒有適合現在 kernel 的 module,改用 oracle virtualbox-4.3 則會出現模組無法驗證的訊息。

模組無法驗證,上網 Google 了一下,發現應該是 Kernel 啟用了 CONFIG_MODULE_SIG 的緣故,參考 Signed kernel module support – Gentoo Wiki ,研判是需要 key 才能編譯出 sign 過的 module,但實在找不到 key,就放棄了。

退到 saucy 的 kernel (linux-image-generic-lts-saucy),一樣用 oracle virtualbox,這次在編譯時有警告 (這可以參考 /var/lib/dkms/vboxhost/ 目錄裡的 make.log ),insmod 時,出現 vboxdrv: Unknown symbol mcount (err 0) 的錯誤。Virtualbox issue tracker 有人回報過此問題:dkms unknow symbol mount (err0) ,結論是 gcc 版本過舊而導致。所以安裝 gcc-4.6 以後,再參考這篇 Choose gcc and g++ version ,把預設的 gcc 改為 gcc-4.6 之後就可以編譯出沒問題的模組了。(備註:文章裡是以 4.3 與 4.4 為例,相信你知道如何改動)

AWK 習作:關於 Android 的 mmssms.db

要把 mmssms.db 裡所有是 vCard 的記錄的檔案都下載到本地端。

主要會用到的資料表格是 part,會應用到的欄位是 ct 跟 _data,所以 SQL select 可以這樣寫:select _data from part where ct=’text/x-vcard’ COLLATE NOCASE

這裡為了不判斷大小寫,加上了 COLLATE NOCASE

為了在 terminal 下直接下指令,所以就變成 sqlite3 mmssms.db “select _data from part where ct=’text/x-vcard’ COLLATE NOCASE”

接著再應用 awk 與 adb:sqlite3 mmssms.db “select _data from part where ct=’text/x-vcard’ COLLATE NOCASE” | awk -F’\n’ ‘{system(“adb pull \”” $1 “\””);}’

這樣就大功告成了,-F’\n’ 是為了要把整行當作一個欄位,system() 函式是執行指令,awk 裡的字串串加,不需要特別加上 ‘+’ 或 ‘.’ ,直接寫,像這樣 “hello” $1 “world” 就可以了。

參考資料:

Grub symbol ‘grub_term_highlight_color’ not found

把筆電的 Ubuntu 13.10 升級到 14.04,想不到卻中了招,重開機時,出現 symbol ‘grub_term_highlight_color’ not found 的錯誤。

網路上一找,果然 launchpad 上已經有人回報了,網路上也有不少人分享解法。大致上有兩類解法:

  1. 設法用 livecd/liveusb 重新 chroot 進去,然後用 grub-install 重新安裝 grub
  2. 用 livecd/liveusb 開機,安裝 boot-repair ,利用 boot-repair 來解。

這兩類解法對我都無效,後來是在 launchpad 的那篇裡,看到 downgrade grub ,就想說來試試看。主要的步驟,還是 boot-repair,所以先用 Ubuntu 14.04 的 liveusb 開機,安裝 boot-repair,執行 boot-repair 。boot-repair 的過程裡,會有一些提示,以及需要手動下指令的部份,第一次會是要移除 grub 以及相關的套件;到了第二次時,會要你重新安裝 grub,這邊的指令要改變一下,先裝指定版本的 grub,再執行 boot-repair 提供的指令:sudo apt-get install grub-common=2.00-19ubuntu2 grub-efi-amd64=2.00-19ubuntu2 grub-efi-amd64-bin=2.00-19ubuntu2 grub-efi-amd64-signed=1.22+2.00-19ubuntu2 grub2-common=2.00-19ubuntu2

接著就是讓 boot-repair 做完就可以了。

備註:

  • 如果你不知道有哪些版本可以用,要找某 package 之前的版本,可以用 apt-cache show package | grep Version 來看。
  • 用 LiveCD/LiveUSB 開進去以後,自行掛載並 chroot 的方法,就是先用 sudo parted -l 或 sudo fdisk -l 確認分割區,接著做掛載的動作,大致是這樣 (分割區請自行替換,不要照抄):
    sudo mount /dev/sda5 /mnt
    sudo mount /dev/sda4 /mnt/boot
    sudo mount /dev/sda7 /mnt/home
    for i in /dev /dev/pts /sys /proc /run; do sudo mount $i /mnt$i; done
    sudo chroot /mnt
    hostname your_host
    export HOME=/root

小試 LXC

開始試試看 LXC,LXC 是輕量級的虛擬環境,沒有摹擬硬體層,硬體層是跟 Host 共用,最大的好處就是建一個 container 的成本遠比用 VirtualBox/VMWare 建 VM 來的低。

Ubuntu 12.04 上預裝好的 LXC 是 0.75 版,現在已經是 1.0 了,要使用最新的版本,可以用這個 PPA:ppa:ubuntu-lxc/stable 。在 0.75 時,只要安裝 lxc 即可;到了 1.0 版,拆成兩包:lxc 跟 lxc-templates ,所以安裝時要用 sudo apt-get install lxc lxc-templates 。

主要的操作,ls /usr/bin/lxc-* 就可以看到,這裡講一下比較入門的指令 (其實是我現在也只有用到這些):

  • 建立 container :sudo lxc-create -n container_name ,加 -t 可以指定要使用的 template,template 可以想作是 distribution,前面提到的 lxc-templates 裡面就是放已經客製好的 template,也可以自己做。所以你可以建 archlinux 的 container 或是 opensuse 的 container 來練習。
  • 刪除 container :sudo lxc-destroy -n container_name
  • 啟動 container :sudo lxc-start -n container_name ,執行完,終端機會馬上被 container 接手,輸入預設的帳號跟密碼 ubuntu/ubuntu 就可以登入。如果不想被 container 接手,可以加上  -d 。
  • 停止 container :sudo lxc-stop -n container_name
  • 列出現有的 container: sudo lxc-ls -f
  • 連上已經啟動的 container :sudo lxc-console -n container_name
  • 連上已經啟動的 container 並執行指定指令:sudo lxc-attach -n container_name command

大致上就這樣,現在還有 docker ,其實它就根植在 LXC 上,主要是簡化自動化操作,大部分都用來測試,晚點再來看看怎麼用。

參考資料:

 

 

loopback device

要掛載一個 image,就得利用到 loopback device,一般來說只要在 mount 時,指定 -o loop 跟 image 檔名就可以了,例如:sudo mount -o loop your_image /mnt

但是,我遇到 image 檔案無法掛載的情況。用 file 指令去看,發現到 image 檔裡有多個 partition 。

precise-desktop.img: x86 boot sector; partition 1: ID=0xc, active, starthead 1, startsector 32, 147424 sectors; partition 2: ID=0x83, starthead 45, startsector 147456, 4864000 sectors, code offset 0x0

後來想起多年前看過的 losetup,就看了一下 losetup 的使用說明,裏面提到 -o 這個參數,這是用來指定 offset 的,也就是說,可以把 image 檔案裡從指定 offset 開始的地方指派到某個 loopback device 去。於是根據 file 的資訊,算出 offset 是 147456*512 = 75497472,然後用 sudo losetup -o 75497472 /dev/loop0 precise-desktop.img 去指定,這樣 /dev/loop0 就對應到 precise-desktop.img 檔案裡的第二個 partition ,最後就可以用 sudo mount /dev/loop0 /mnt 掛載了。

反過來,也可以對一個檔案做 fdisk。這時要先預先用 dd 幫檔案配置空間,例如要配置一個 512M 的檔案:dd if=/dev/zero of=my.img bs=1M count=512 。接著一樣用 losetup 把 image 檔指派到 loopback device:sudo losetup /dev/loop1 my.img ,最後就可以用 fdisk 來分割了。

debian package 的相依性圖形

找了半天找不到適當的指令顯示套件的相依套件,想起之前無意找到的 apt-cache dotty,就想說用圖形來看套件的相依性還是最快的。

產生圖形的方法:

  • apt-cache:apt-cache 本身就有提供 dotty command 可以產生,用法是 apt-cache dotty your_package > out.dot
  • debtree:debtree 需要另外安裝,好處是有提供更多額外的參數來產生圖形,用法是 debtree your_package > out.dot

接著就可以利用 dot 指令來產生圖形了,dot 是 graphviz 套件提供的指令,可以根據 dot 語法來產生圖形,用法是 dot -T png -o out.png out.dot。用 apt-cache dotty 產生的 dot 語法,會讓 dot 產生圖形的速度變得非常慢;而 debtree 所產生出來的 dot 語法,就不會如此。我猜想是 debtree 有預先排除掉 libc6, libstdc++6 與 zlib1g 的關係吧。

systemd

最近 Debian 宣佈以後改用 systemd,Canonical 也隨之跟進,所以之後衍生的 distribution 應該也都會跟進。Arch 是已經改用 systemd 了,CentOS/RHEL 應該是到 7 以後才會可能會用 systemd。

看到這兒就想到目前在用的 Ubuntu 12.04 應該也可以改用 systemd 吧~目前先找到這兩篇:

基本上都是要特定 ppa (上面這兩篇提到的 ppa 還都不同,到時候再來看那邊比較新就用哪個),安裝 systemd 以後,然後改 grub ,大概就這樣。可能遇到的問題是 /etc/mtab 問題以及一些服務可能會無法啟動。從 Ubuntu Wiki 對 systemd 的說明裡 看起來缺的東西不少,我想最好是先拿 VM 的機器來試驗,不要拿工作機來試驗,免得把自己搞得焦頭爛額。

The Debian Administrator’s handbook

這本電子書是免費的,你可以在 The Debian Administrator’s handbook 網站上取得。

之前在 LinuxToy 上看到這本書可以下載,有利用 git 去抓取原始碼,後來就擱在硬碟裡。最近在整理硬碟時,看到這份原始碼,看了一下,居然可以產生 epub ,又看到 publican.cfg,以為是用 Python Pelican 產生的,就想說要找一天來仔細看看。今天再仔細一看,發現這誤會可大了,原來人家是用 publican,不是 pelican。

publican 的安裝很簡單,依照原始碼裡的文件,就用 sudo apt-get install publican 就可以,但在 Ubuntu 12.04 下,並沒有 publican-debian 。執行 publican 時,會有錯誤訊息:”Failed to load brand file”。所以我修改了 publican.cfg 裡的 brand,將其改為 common 就可以順利執行。指令是這樣下的,要產生 PDF:publican build –format=pdf –langs=en-US ;要產生 epub:publican build –format=epub –langs=en-US 。看原始碼裡有簡體中文的翻譯,有試著產生一份,但是發現並沒有翻譯完全,在 gitcafe 有看到 fork 一份出來,但是一樣不全,看來是停止翻譯了。

extundelete

之前一直以為在 Linux 上反刪除是很麻煩的,直到過年前自己誤刪了檔案,去 Google 解法之後,才知道現在有 extundelete 這工具。

根據 extundelete 的網站說明,在反刪除之前,第一要先卸載,如果是系統分割區,那最好就是趕緊重開機,以 LiveCD 開機;第二就是用 extundelete 進行搜索被刪除的檔案。

我自己的情況是不小心移除了系統分割區上的檔案,所以我趕緊重新開機以 Ubuntu 12.04 LiveCD 開機。重開機以後,去系統設定裡的 “Software & Updates” ,把 main, universe, restricted, multiverse 都勾選起來,接著到 terminal 裡執行 sudo apt-get udpate && sudo apt-get install extundelete ,安裝 extundelete。安裝完成後,執行 sudo extundelete –restore-all –restore-directory /home/user –after 1390881600 /dev/sda1 就會開始進行反刪除的動作,反刪除後的檔案會放置在當前目錄下的 RECOVERED_FILES 資料夾下。”–after” 表示只拯救指定日期後的檔案,而其後的數字,是用 date -d “2014-01-28 12:00” +%s 取得,extundelete 不接受日期時間字串,只能透過 date 指令取得數字來使用,這部份可以在 extundelete 的 man page 裡看到。

只是 Ubuntu 12.04 的 extundelete 有問題,我後來再用 Ubuntu 13.10 的 LiveCD,才能正常使用。但最後還是拯救失敗,因為從刪除到重開機,我還是做了太多動作,導致一些檔案已經被覆蓋掉,殘念,只能安慰自己說那些檔案其實不重要。

參考資料:

CentOS OpenSSL

今天看到這篇 Secure Web API ,提到可以用 SSL Server Test 這個網站服務來檢查 SSL 憑證的安全性,所以就來試試看。

我的機器用的是 CentOS 5,因為是從很早以前的版本升級來的,設定幾乎都是照舊,今天重新整理,對照設定檔跟新設定檔以後,才發現 certification 位置已經更換了。

CentOS 5 的 SSL certification 改放在  /etc/pki/tls/certs ,所以要到該目錄下輸入 make your.crt ,依照步驟回答問題後,就可以製作出 your.crt 跟 your.key ,接著把 your.key 複製到 /etc/pki/tls/private 。然後去調整 /etc/httpd/conf.d/ssl.conf ,並且參考 Configuring Apache, Nginx, and OpenSSL for Forward Secrecy 去修改設定檔案,但不要加入這行 SSLCipherSuite 。不加入的原因是因為 CentOS 的 OpenSSL 並沒有加入 EC support ,如果要加入的話,目前看來是要重新編譯 OpenSSL 套件 (Bounty : OpenSSL with EC for Fedora/RH/CentOS : 3.6 BTC),裡面提到的步驟是下載 source RPM,修改 .spec 裡的 configure 該行,改為 enable-cms enable-md2 no-idea no-mdc2 no-rc5 enable-ec enable-ecdh enable-ecdsa 。

最後再重新啟動 Apache 。