星期四, 1月 29, 2015

SIP

SIP (Session Initiation Protocol,會話發起協定) 讓兩個或以上用戶間建立各種形式的通話,稱為會話,包括多方會議、視訊、多媒體播放等等,主要的規格寫在 RFC 3261

會話 (session) 由 SIP 協定的 INVITE 方法建立,內容包含可用的媒體描述,讓各方協調出可互通的媒體類型。SIP 使用一些代理伺服器 (proxy) 協助轉送請求到用戶目前的位置、服務存取認證、服務提供者轉送政策等。SIP 也提供機制讓用戶註冊目前位置,給 proxy server 使用。

發話端知道受話端的電話號碼,但不知道目前的位置,所以 INVITE 請求會先在 SIP 的代理伺服器間轉送,直到受話端目前的位置,這個動作叫 routing。當請求到達受話端,受話端會回 response 給發話端。response 裡面包含受話端的 Contact,也就是受話端目前的位置。一開始的請求也包含了發話端的 Contact,這樣雙方就知道彼此的目前位置,接下來的訊息就可以直送對方,沒必要經過 SIP 代理伺服器轉送,增進整體效能,也減少處理延遲。


SIP 網路元件 (SIP elements)

SIP Methods

一些名詞
  • Transaction (交易):包括一個請求及其所有回應,採用類似 HTTP request/response transaction 模型。
    • 回應包括選擇性的 provisional 回應,到其最後回應。失敗的 INVITE 之後的 ACK 也算在同一 transaction。
    • regular transaction:INVITE、ACK、CANCEL 以外的 transaction
      • REGISTER
    • SIP transaction:
      • INVITE/2xx:接受 INVITE 並建立 session。
      • ACK:
      • INVITE/non-2xx/ACK:這是個特例,包含 ACK 也算在同一個 transaction,沿用 Via branch。
      • CANCEL:沿用 Via branch,取消 pending transaction。
    • stateful:會紀錄 transcation 狀態,當請求或回應進來會看是否屬於已存在的 transaction,方式是看 Via header 的 branch 參數。以前 RFC 2543 的舊方式比較複雜,需要去 hash To, From, Request-URI 及 CSeq。
    • stateless UAS:不送 1xx 回應、不重送回應、忽略 ACK 請求、忽略 CANCEL 請求、To tag
  • Call 或 Session (會話):由 dialog 建立及維護,包含所有參與的 dialog 及影音,可能有多個 dialog 的多方通話。

SIP Header 欄位 (UAC 送出的 SIP 請求至少要有 To、From、CSeq、Call-ID、Max-Forwards、及 Via)
DTMF relay
BLF
軟體

參考

  1. 相關 RFC
  2. http://www.iptel.org/sip/intro
Header 欄位格式

host = hostname / IPv4address / IPv6reference
  • 以 To header 為例,都會有 addr-spec 這部份,且必須是某個 scheme 加「:」開頭,常見的有 sip:、sips:、或 tel:
  • 不管是 sip: 或 sips:,以「@」結尾的 userinfo 是選項,hostport 是必須的,可有「;」開頭的 uri-parameters,「?」開頭的 headers 也是選項。

星期一, 1月 26, 2015

busybox halt, poweroff, reboot

指令 halt、poweroff、跟 reboot 的動作過程類似,都是 kill 1 號行程,一般是 init,在 OpenWrt 是 procd。1 號行程會去執行 inittab 的 shutdown 動作後,呼叫函式庫函式 reboot()。reboot() 再執行系統呼叫進到 kernel 執行 sys_reboot() ,去做相關動作。

signal to kill initreboot() 參數kernel動作
haltSIGUSR1RB_HALT_SYSTEM (0xcdef0123)kernel_halt()停止所有程式
poweroffSIGUSR2RB_POWER_OFF (0x4321fedc)kernel_power_off()停止所有程式後關電 (關電未必有實作)
rebootSIGTERMRB_AUTOBOOT (0x01234567)kernel_restart()停止所有程式後再開機

如果下這些指令加 -f 參數的話,就直接執行 reboot(),不做 inittab 的 shutdown 動作。

參考來源:busybox init/halt.c 及 Linux kernel 原始碼

延伸閱讀

星期日, 1月 25, 2015

ext4

ext2:限制 2 TB, 1018files
ext3 +日誌
ext4 相容 ext3, 2.6.28 開始, 支援大檔案系統及文件,效率,支援無日誌
-o noatime => 不存 access time 到 inode
-o discard

logical block:為了減少 bookkeeping,並以較大的傳送單位來增進速度,切成 logical block,通常為 4 KiB,跟 page size 一樣 (LBA block = 1024?)

block group:8x logic block byte 數的 logic block,所以通常有 32768 個 logic block = 128 MiB

block group 數目:全部大小/128 MiB

https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout

簡歷
  • 1991 Linus Torvalds 以 MINIX 作業系統發展原始 Linux kernel,初期沿用 MINIX 的檔案系統,檔名最多 14 字母,最大容量 64MB。1991 年典型的硬碟已經 40-140MB。
  • 1992 ext 檔案系統,使用 Linux kernel 新的 virtual filesystem (VFS) abstraction layer,檔名可有 255 字母,容量達 2GB。主要問題是每個檔案只有一個 timestamping,而不是目前常見的有 inode 建立、檔案存取、和檔案修改三個 stamp。
  • 1993 ext2 檔案系統改善並以商業等級來設計,容量達 TB 等級、檔案大小達 GB 等級,廣泛用在 Linux,移植回 MINIX,也可在 MacOS 和 Windows 使用。當時大多檔案系統當寫入時當機或斷電容易有檔案系統損壞的問題,以及用久後由於檔案儲存位置碎片分散化而造成效能變很差。
ext3
  • 2001 加到 Linux 2.4.15。類似其它檔案系統,使用日誌 (journaling) 解決斷電損壞問題。寫入以 transaction 形式儲存,有完成才送交到檔案系統。沒完成,重啟發現 transaction 沒完成則恢復原狀。這樣只會損失一個檔案,不會造成整個檔案系統毀損。ext3 有三種日誌等級:journal、ordered、和 writeback。
  • 使用 32-bit 定址,一般使用 4 KiB blocksize 時檔案大小達 2 TiB、容量達 16 TiB
ext4
  • 2008 加到 Linux 2.6.28,和 ext3 很類似,支援更大檔案系統、改善 resistance to fragmentation、效能更好、改進 timestamps.
  • 向後相容,可直接吃 ext3 檔案系統
  • 使用 48-bit 定址,理論上檔案大小達 16 TiB、容量達 1,000,000 TiB (1 EiB)。
參考
  1. http://e2fsprogs.sourceforge.net/ext2.html
  2. https://opensource.com/article/18/4/ext4-filesystem
  3. 典型用法是直接用在一個 block device 分割,或使用 loopback block device 連到一個檔案。

星期二, 1月 06, 2015

Linux Container

Linux Container (LXC、Linux 容器系統) 是 Linux 下一種虛擬 Linux 環境的虛擬機器 (虛擬 Linux 作業系統),有各自的 rootfs 可安裝各自的 Linux 應用程式,但共用 host 的 Linux kernel 及函式庫來直接使用實體電腦的軟硬體資源,減少虛擬的損耗。但也由於是共用 Linux kernel,所以只能虛擬 Linux,而且並不是所有 Linux 系統都可以虛擬。Linux Container 一開始由 IBM 開發,Linux 2.6.29 開始支援 Linux Container。

安裝
sudo apt-get install lxc
ls /usr/share/lxc/templates/ 可看到範本

建立 LXC 虛擬電腦
sudo lxc-create -t busybox -n test
sudo ls /var/lib/lxc/test 可看到建立的 rootfs 及設定

啟動 LXC 虛擬電腦
sudo lxc-start -n test

結束 LXC 虛擬電腦 (lxc-stop 或 ...)

複製、刪除 LXC 虛擬電腦 (lxc-clone、lxc-destroy)

參考來源:
  1. http://tobala.net/download/lxc/ch01.pdf
  2. http://fourdollars.github.io/lxc-intro
  3. wikipedia: LXC
延伸閱讀
  • 其它虛擬作業系統:OpenVZ、Linux-VServer、FreeBSD jails、AIX Workload Partitions、Solaris Containers。
  • Virtual Machine