使用 qemu (or KVM) 建立 debian VM

有很多工具可以用來建立 Virtual Machine ,例如 VirtualBox, VMware, LXC, Qemu, Qemu with KVM, Xen 等等。

QEMU - Debian Wiki 簡單的介紹了如何使用 Qemu 來運行虛擬環境

使用現有 Image

Debian developer Aurelien Jarno 提供了數個預先建立的 Image https://people.debian.org/~aurel32/qemu/,這邊我使用 amd64 的架構做示範幾種啟動虛擬環境的方式:

  • 開啟 QEMU,預設使用 SDL 顯示 guest OS 的畫面

    qemu-system-x86_64 -hda debian_wheezy_amd64_standard.qcow2 -m 256
    
  • 開啟 QEMU,使用 terminal 操作虛擬環境 (一般PC上開機約180秒)

    qemu-system-x86_64 -hda debian_wheezy_amd64_standard.qcow2 -m 256 -curses
    
  • 開啟QEMU,並將 host OS port 5555 的封包轉送給 Guest OS 的 port 80

    qemu-system-x86_64 -hda debian_wheezy_amd64_standard.qcow2 -m 256 -curses -redir tcp:5555::80
    
  • 開啟QEMU,並且開啟 kvm full virtualization support。如果 kernel,processor 有支援,將大大提昇虛擬環境運行速度。這項操作需 root 權限。 (一般PC上開機約30秒,可大大看出 -enable-kvm 的差異)

    qemu-system-x86_64 -hda debian_wheezy_amd64_standard.qcow2 -m 256 -curses -enable-kvm
    

特別注意的是我這邊沒有特別對網路做設定,根據 Documentation ,TCP, UDP可以運作,但ICMP 不會。我實際測試的結果確實是如此。(Note - if you are using the (default) SLiRP user networking, then ping (ICMP) will not work, though TCP and UDP will. Don't try to use ping to test your QEMU network configuration!)

自已建立 qemu image

  1. 建立虛擬硬碟
    dd if=/dev/zero of=rootfs.img bs=1G count=2
    
  2. 格式化虛擬硬碟為 ext4
    mkfs.ext4 rootfs.img
    
  3. mount 虛擬硬碟 (需要 root 權限)
    mount -o loop rootfs.img /mnt
    
  4. 執行 debootstrap (需要 root 權限)
    debootstrap --no-check-gpg --arch=amd64 wheezy /mnt/ http://debian.nctu.edu.tw/debian/
    
  5. 查詢虛擬硬碟的 UUID,我這邊是"4cc6834a-df20-4cb3-ad55-79433346e000"
    blkid rootfs.img
    

rootfs.img: UUID="4cc6834a-df20-4cb3-ad55-79433346e000" TYPE="ext4"

  1. 填寫 /etc/fstab,讓虛擬機開機時就會 mount 虛擬硬碟
    echo "UUID=4cc6834a-df20-4cb3-ad55-79433346e000 / ext4 0 1" >> /mnt/etc/fstab
    
  2. chroot 進 /mnt,安裝 linux kernel,安裝並設定 grub bootloader。結束後退出 chroot 環境。(需root權限)
    chroot /mnt
    apt-get update
    apt-get install -y linux-image-amd64
    apt-get install -y grub-pc
    grub-install /dev/hda
    update-grub
    exit
    
  3. umount 虛擬硬碟 (需 root 權限)
    umount /mnt
    

至此,rootfs.img裡面就是一個完整的 debian OS 了。可以用前面所說的方法,以 qemu 開啟。也可以將這個虛擬硬碟轉換為 qcow2 格式,可以佔用較小空間(但虛擬作業系統跑起來的時候則需多花一些計算效能)。

qemu-img convert -f raw -O qcow2 rootfs.img mydebian.qcow2

Ref:

Update:
Linaro 有提供 Debian Jessie 8.0 的 image: http://images.validation.linaro.org/kvm/jessie.img.gz

在 Archlinux 上啟動Avahi-daemon

這篇回覆介紹了如何在 Archlinux 上使用 systemd 來開啟 avahi-daemon,使得區域網路內的電腦可以用 .local 來連線到其它電腦。

  1. pacman -S avahi nss-mdns Installs the Avahi services daemon and the Multicast DNS resolver. nano /etc/nsswitch.conf This file tells the C library how to obtain name-service information.
  2. Change the line hosts: files dns myhostname to hosts: files mdns_minimal [NOTFOUND=return] dns myhostname, save and exit.
  3. systemctl start avahi-daemon Starts the Avahi service manually since we're already booted.look for errors)
  4. systemctl enable avahi-daemon Enables the Avahi service on boot.

How do I get to use .local hostnames with Arch Linux?

用python fcntl 取得 file lock

在 Stack Overflow 上看到的問答。稍微修改了一下為可執行的版本,下面的Python程式碼可以對一個檔案做lock。同時執行2個這樣的 python script,先取得 file lock 的 process 可以順利印出 "No error",沒取得 file lock 的 process 則會得到 IOError, 印出 "can't immediately lock the file" 後結束程式。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import fcntl
import time
f = open('/tmp/locktest', 'r')
try:
    fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    print("can't immediately lock the file")
else:
    print("No error")
    time.sleep(10)
f.close()

先取得 file lock 的 process:

# python test.py

No error

沒取得 file lock 的 process:

# python test.py

can't immediately lock the file

離 Python System Programming 更近一步了!

Ref: Python fcntl does not lock as expected

Setup Domain Controller on Ubuntu 14.04

在ubuntu 14.04 上架設 Samba Domain Controller 的步驟:

  1. 安裝 samba libpam-smbpass

    sudo apt-get install samba libpam-smbpass
    

    samba 版本目前是4.1.6 (4.0以上的 Samba 才有提供 Domain Controller 的功能)

    samba -V
    Version 4.1.6-Ubuntu
    
  2. 使用 samba-tool 一步一步設定,這裡我規劃 samba domain 的網域為 mysamba.test.io

    samba-tool domain provision --use-rfc2307 --interactive
    

設定成功,過程的設定記錄如下:

vagrant@vagrant-ubuntu-trusty-64:~$ sudo samba-tool domain provision --use-rfc2307 --interactive                                                   
Realm: mysamba.test.io
 Domain [mysamba]: 
 Server Role (dc, member, standalone) [dc]: 
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: 
 DNS forwarder IP address (write 'none' to disable forwarding) [192.168.1.253]: 192.168.1.253
Administrator password: 
Retype password: 
Looking up IPv4 addresses
More than one IPv4 address found. Using 192.168.1.2
Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=mysamba,DC=test,DC=io
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=mysamba,DC=test,DC=io
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role:           active directory domain controller
Hostname:              vagrant-ubuntu-trusty-64
NetBIOS Domain:        MYSAMBA
DNS Domain:            mysamba.test.io
DOMAIN SID:            S-1-5-21-711469164-2329730621-2401598146

附註:在使用 samba-tool 的過程式如果有設定錯誤,想再進行一行 samba-tool 操作,會出現錯誤訊息,提示你必須把 /var/lib/samba/private/sam.ldb /etc/samba/smb.conf 刪除,讓 samba-tool 來重新建立

sudo rm /var/lib/samba/private/sam.ldb
sudo rm /etc/samba/smb.conf

Ref: Samba AD DC HOWTO

編譯 Upstart 1.13.2

編譯 Upstart 1.13.2:

sudo apt-get install libnih-dbus-dev libjson-c-dev
cd upstart 1.13.2/
./configure
make

編譯完成後,會得到以下的執行檔,這樣就得到一組 userspace 上開關機所需要的 utility 了

init/init
util/initctl
util/reboot
util/runlevel
shutdown
telinit
upstart-event-bridge
upstart--bridge
upstart-dbus-bridge
upstart-socket-bridge
upstart-local-bridge

GNU Autotools自動編譯

在開發 Open Source 項目時,經常會遇到 Autotools。翻了一下網路文章,覺得這張圖給出不錯的表示。
瘋狂駭客的技術隨筆 - 使用GNU Autotools自動編譯項目

圖中橢圓形狀的就是gnu autotools里的主要工具了,包括1autoscan2aclocal3autoheader4automake5autoconf等.而方形形狀只有Makefile.am和configure.ac是需要我們寫的,别的方框里除了Makefile是最終的配置文件,其它都是中間文件。(Makefile文件是由6configure生成的)

Ref: http://en.wikipedia.org/wiki/Autoconf

資助維基百科

以前捐過一次,那時捐贈金額只能以美金計價,用VISA金融卡捐了 $35 美元,換算台幣是1033元,手續費15元(約1.45%)。現在在 wikipedia 上的捐贈可以用台幣計價了,上周在Wikipedia 上一樣用VISA金融卡捐了台幣1000元,手續費是13元 (換算起來是1.3%)。

本來以為用台幣計價是不是可以省去一些手續費,不過看起來是差不多的。但平常 Wikipedia 惠我良多,這些錢付出的很值得。刷完卡以後會收到一封信,感謝捐贈者的付出(其實我才要好好感謝Wikimedia foundation的貢獻)。

您好 辰翰,

感谢您将自己无价的学识在这里贡献给了全世界的每一个人。

我的名字是里拉•特雷梯科夫,现任维基百科基金会的执行董事。在过去的一年里,全靠捐赠者作出的贡献帮助我们将百科全书增加了287种语言,让全世界更容易使用。我们致力于让那些没有机会接受教育的人们得到我们的帮助。我们将知识带给像来自印度Solapur的阿克沙雅•里颜加。她自小成长在一个纺织业小镇,并以维基百科作为主要的学习工具。在这些处于书本资源匮乏却拥有手机因特网服务区域的学生们,维基百科不可少的。在阿克沙雅毕业于一个印度大学后,就来到了美国任职软件工程师。她十分感激维基百科,她认为自己有一半的知识都来自于此。

像这样的故事并不少见,我们团队任重道远,前途曲折,充满挑战。很多使用维基的人们在得知它是由非盈利组织和捐款下运作后,都十分震惊。每年,都会有恰好人数的捐款者帮助我们把知识得以带给全世界任何人。我再次感谢你们,让我们能完成这个任务。

我再次代表近五亿阅读维基百科的人们,上千维基编辑者和基金会的成员们,感谢你让我们得以使维基百科今年依旧上线而无广告。

感谢您,
里拉

里拉·特雷梯科夫
执行董事
维基媒体基金会
donate.wikimedia.org

特此证明:你于2014-08-06日做出NT$ 1000.00的捐款,捐款号CNTCT-6788186。

这封邮件可以证明您的捐款金额记录。对此捐款没有提供任何商品和服务。维基基金会符合美国501 (c)(3)规定的非盈利的慈善机构,我们的地址是美国加州旧金山新蒙哥马利大厦149号3层。免税号:20-0049703

台灣天氣雲圖 cwb-radarmap

最近做了一款簡單的 Web App cwb-radarmap

其實我想做這個是因為看到這篇文章 其實我覺得中央氣象局的資料不輸日本
只差在資料的開放性跟呈現程度 https://www.facebook.com/chihchun/posts/10152654161372915

點開 cwb-radarmap ,可以幫你定出自己的位置,並顯示15分鐘內的雷達回波圖。在快出門的時候點開看一下,可以簡單的判斷即時天氣。

附注:雖然雷達回波僅約略呈現空中雲雨系統含水量〈包括三態之水〉的分布情形,不能直接換算成地面降水量的多寡。但還是有一定的參考程度。

(夏天就不一定了,因為午後雷陣雨常是長出雷雨胞所降下的大雨。但冬天來說,藉由觀察雲帶的走向,還滿能夠推測降雨的可能性。)