2013年5月22日 星期三

查詢修改 Linux maximum open file限制

當某些特殊情況,需大量開啟檔案時(上萬個),往往會被系統阻擋並提示 "Too many files"。此時需要針對系統參數去做修改。

而會限制 maximum open file 的部分有分兩個:一個是 kernel level,另一個為 user level。

Kernel level:限制整個系統所能開啟的最大檔案數量(所有使用者和系統的總和)。


查詢 fs.file-max
$ sysctl fs.file-max
暫時修改 fs.file-max(重開機後失效)
$ sudo sysctl -w fs.file-max=<numbers>
自動修改 fs.file-max(重開機會自動套用)
$ sudo vi /etc/sysctl.conf
在檔尾修改或插入設定。
s.file-max = <numbers>
重新載入設定
$ sudo sysctl -p




User Level,open files:限制單一使用者所能開啟的最大檔案數量。


查詢
$ ulimit -n
修改
$ sudo vi /etc/security/limits.conf
在檔尾加入需要的設定。
Example:* - nofile 65535
Syntax:<domain> <type> <item> <value>
<domain>:欲調整個使用者(可以用 * 表示所有使用者)或群組(在群組名稱前加@)。
<type>:分為 hard 和 soft,或是以 - 表示兩者。
<item>:要設定的參數名稱。
<value>:欲給予的值。

之後重新開機後,便會套用設定。



2013年5月13日 星期一

scan:掃描DVB頻道資訊

scan 是一個用來掃描 DVB channel、並產生 channels.conf 的程式,對許多軟體,像是 MPlayer、tzap,channels.conf 是播放 DVB 節目的必要檔案,其中包含各個 channel 的詳細資訊,如 channel name、frequency、bandwidth...等。

/usr/share/dvb/dvb-t 目錄底下,放有一些各地區的 initial tuning data file,這些檔案內容放有特定 frequency、bandwidth、QAM...等和在 DVB-Tx 設定頻道時,需要給予的頻道參數一樣。但是很多情況,我們可能只知道一個頻道的 frequency 和 bandwidth,其他資訊並不清楚,所以在我自己寫的 initial tuning data file 的內容如下:

# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 647000000 6MHz AUTO NONE AUTO AUTO AUTO NONE
T 653000000 6MHz AUTO NONE AUTO AUTO AUTO NONE
T 659000000 6MHz AUTO NONE AUTO AUTO AUTO NONE
僅給予 frequency、bandwidth 資訊,其他都設定 AUTO 或 NONE。

之後在透過以下指令,讓 scan 根據 initial tuning data file 內容去掃頻道,並產生 channels.conf:
$ scan <initial_tuning_data_file> > channels.conf

2013年4月17日 星期三

Raspberry Pi Set Up For Building External Modules

敘述


由於廠商提供的 IT913x 的 Testkit,編譯時需要使用到 kernel external modules,
而 RPi 預設是沒有將 kernel source 放到 RPi 中,
使用者必須自行下載 kernel source 並放置到 /usr/src/linux-rpi-$(uname -r) 底下。

而在先前的文章 Raspberry Pi Kernel Compilation
由於我的 RPi kernel 和 modules 是在開發機上編譯,
將 modules 複製到 RPi 後,發現到在 RPi 上編譯 IT913x Testkit,執行 Testkit 時顯示 KERNEL_VERSION 為 (3.2.25),而非實際使用的 (3.6.11),
之後才發現到 /lib/modules/$(uname -r)/build 連結到的位置是錯的 (target 為開發機的目錄),
因此也必須修改 /lib/modules/$(uname -r)/build,連結到正確位置,
並在 kernel source 目錄下,執行 make oldconfig、make modules_prepare 等指令,
之後 IT913x testkit 才會取得正確的 kernel external modules 去編譯。


問題


在 RPi 上編譯 IT913x Testkit,執行 Testkit 時顯示 KERNEL_VERSION 為 (3.2.25),而非實際使用的 (3.6.11)。


適用範圍


在 RPi 上編譯程式,需要使用到 kernel external modules 的狀況。


步驟


本篇文章記錄下每一個步驟,供需要的人參考。

以下步驟是在 開發機 上,利用 RPi Toolchain 進行 Cross-compile;
若想在 RPi 上直接編譯 kernel,
則可以省略設定 ARCH 與 CROSS_COMPILE 環境變數。

1. 下載 kernel source 3.6.y (個人 RPi 是指用 3.6.y 版的 kernel)
   請參考 Raspberry Pi Kernel Compilation

2. 為簡化指令長度,將以縮寫方式替代
<kernel source> : /home/bkdragon/rpi/linux-rpi-3.6.y

<RPi toolchain> : /home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi

3. 切換目錄至 <kernel source>
$ cd <kernel source>

4. 清除所有 generated files、config 和 various backup files
$ make mrproper

5. 從正在運行的 RPi 上,取得當前的 kernel configuration
(on RPi) $ zcat /proc/config.gz > .config

6. 從 RPi 上複製 .config 至 kernel source 中
(on RPi) $ scp .config bkdragon@my.ip:<kernel source>

7. 設定環境參數 CCPREFIF
$ export CCPREFIX=<RPi toolchain>/bin/arm-bcm2708hardfp-linux-gnueabi-

8. 更新 configuration
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig

9. Set up for building external modules
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules_prepare

10. (Option) 若使用 git clone 下載 kernel source,刪除 .git 目錄以節省空間
$ rm -rf .git

11. 切換目錄至 /tmp (隨意位置)
$ cd /tmp

12. 將 kernel source 封裝成 TAR.GZ
$ tar -czvf linux-rpi-3.6.y.tar.gz <kernel source>

13. 將 linux-rpi-3.6.y.tar.gz 複製到 RPi
$ scp linux-rpi.3.6.y.tar.gz pi@my.rpi.ip:~

以下步驟是在 RPi 上執行

14. 將 linux-rpi-3.6.y.tar.gz 移動至 /usr/src
$ sudo mv linux-rpi-3.6.y.tar.gz /usr/src

15. 切換目錄至 /usr/src
$ cd /usr/src

16. 解壓縮 linux-rpi-3.6.y.tar.gz
$ sudo tar -xzvf linux-rpi-3.6.y.tar.gz

17. 切換目錄至 /lib/modules/$(uname -r) 底下
$ cd /lib/modules/$(uname -r)

18. 移除 build、source
$ sudo rm build source

19. 建立 symbolic link build 連結至 kernel source 目錄
$ sudo ln -s /usr/src/linux-rpi-3.6.y build

20. 建立 symbolic link source 連結至 kernel source 目錄
$ sudo ln -s /usr/src/linux-rpi-3.6.y source

21. 編譯 IT913x testkit,執行 testkit 檢查顯示的 KERNEL_VERSION 是否正確。
    如果顯示 KERNEL_VERSION(3, 6, 11),即正確無誤!

2013年4月16日 星期二

Raspberry Pi Kernel Compilation (update)

參加的研究專案裡面,需要將 DVB device 的 driver 方式安裝到 Raspberry Pi 中。原本在 Ubuntu 上的安裝方式,不適用於 Raspberry Pi 上;廠商提供的方式為將 driver 製作成 module 的方式,讓 Raspberry Pi 偵測到 device 的時候,再將其 module 掛載起來。

以下步驟是在 開發機 上,利用 RPi Toolchain 進行 Cross-compile;
若想在 RPi 上直接編譯 kernel,
則可以省略設定 ARCH 與 CROSS_COMPILE 環境變數。

請先準備以下檔案:
1. Raspberry Pi' kernel
  此處以 3.6.y 作為範例,請依據需要作選擇。
  下載處:github

  附註:個人喜歡在 linux 用 git 將整個 kernel source Repo. 複製下來,
    未來方便直接用 git pull 將 kernel source 更新到最新;
    需要用 3.2.27 版的 kernel source,
    也可以直接用 git checkout rpi-3.2.27 切換。

2. Driver source code
   此處以 IT913x driver 作為範例。

3. Raspberry Pi tools and toolchain
   此工具包包含三個已編譯好的 x86 toolchains 和其他工具。
   下載處:github


開始將 driver 製作成 module


1. 簡化指令長度,將以縮寫方式替代
<kernel source> : /home/bkdragon/rpi/linux-rpi-3.6.y

<RPi toolchain> : /home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi

<IT913x source> : /home/bkdragon/dvb/rpi/IT913x_SRC

2. 將 DVB IT913x source code 連同資料夾複製到 kernel source 中
$ cp -r <IT913x source> <kernel source>/drivers/media/dvb/dvb-usb

3. 切換目錄
$ cd <kernel source>/drivers/media/dvb/dvb-usb

4. 修改 Makefile,在文件底下的 ccflags-y 上方插入下面這行,儲存離開
obj-$(CONFIG_DVB_USB_IT913x) += IT913x_SRC/
請注意,IT913x_SRC 必須一樣,若存放 driver 的目錄名稱不同,請自行修改


5. 修改 Kconfig,在文件最下方插入以下資訊,儲存離開
config DVB_USB_IT913x
    tristate "ITEtech IT913x Rx USB2.0 support"
    depends on DVB_USB
    help
      Say Y here to support the ITE IT913x based DVB-T USB2.0 Rx

6. 回到 kernel source code 的根目錄
$ cd <kernel source>

7. 清除所有 generated files、config 和 various backup files
$ make mrproper

8. 從正在運行的 RPi 上,取得當前的 kernel configuration
(on RPi) $ zcat /proc/config.gz > .config

9. 從 RPi 上複製 .config 至 kernel source 中
(on RPi) $ scp .config bkdragon@my.ip:<kernel source>

10. 設定環境參數 CCPREFIX
$ export CCPREFIX=<RPi toolchain>/bin/arm-bcm2708hardfp-linux-gnueabi-

11. 更新 configuration 
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
其中會在新加入的 module 停下,若為
ITEtech IT913x Rx USB2.0 support (DVB_USB_IT913x) [N/m/?] (NEW)
按下 m 使之製作成 module。


12. 萬事俱全,開始 build kernel
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX}
若為 multicore 環境,可增加 -jN(N: 自訂數)參數,增加同時編譯的執行序。
假設我的主機為 4 cores,可用 -j4。


13. 建立存放 new_kernel 的目錄
$ mkdir /home/bkdragon/rpi/new_kernel

14. 建立存放 module 的目錄
$ mkdir /home/bkdragon/rpi/new_kernel/modules

15. 設定環境參數
$ export MODULES_TEMP=/home/bkdragon/rpi/new_kernel/modules

16. 將編譯好的 module 安裝到指定目錄
$ make ARCH=arm CROSS_COMPILE=${CCPREFIX} INSTALL_MOD_PATH=${MODULES_TEMP} modules_install

17. 切換目錄至 Image 放置位置
$ cd arch/arm/boot

18. 複製產生出來的 kernel image 到 new_kernel 目錄底下
$ cp Image /home/bkdragon/rpi/new_kernel/

19. 切換目錄
$ cd /home/bkdragon/rpi/new_kernel

20. 更改名稱以區別 kernel image 版本(Option,檔名隨意)
$ mv Image new_kernel_3.6.y.img

21. 以上步驟完成,便將更換 kernel 所需要的檔案備齊。
    在此目錄中,分別有一個 image 檔,和一個 modules 資料夾。


更換 SD 卡中的 kernel


1. 將要更新 kernel 的 SD 卡中兩個磁區掛載起來:
    開機磁區(放有 config.txt 和 kernel.img 等檔案)我以 sec1 代稱、
    一般檔案空間(一般在 linux 根目錄底下能看到的東西)我以 sec2 代稱。
    將 kernel.img 複製到 sec1,並修改 config.txt。
$ cd /mnt/sec1
$ cp /home/bkdragon/rpi/new_kernel/new_kernel_3.6.y.img .
$ vi config.txt
在文件最上方插入:
kernel=new_kernel_3.6.y.img
儲存後離開。


2. 將 modules 資料夾中的 lib 目錄,複製到 sec2 的根目錄底下
$ cd /mnt/sec2
$ sudo cp -r /home/bkdragon/rpi/new_kernel/modules/lib .

3. 更換 kernel 完成。這裡有一個需注意的地方,若原本 RPi 運行的 kernel 版本,
    和你想要更換的 kernel 版本差異太大(如 3.2.27 --> 3.6.11),
    則必須連同 firmware 一起更新。
    更新 firmware 方式請參考官方 wiki

2013年3月4日 星期一

rpi-update : Update Raspberry Pi's firmware and kernel

在編譯某些程式的最新版本時,其編譯環境可能會要求更新到最新版的 kernel。原本這些步驟需要自行從 github 上下載最新版本的 kernel source code 和 firmware 自行更新,不過有人寫了 script,執行後便自動將 kernel 和 firmware 更新到最新版本。

個人執行 rpi-update 後,kernel 版本從 3.2.27 更新到 3.6.x

此為 github 的連結:https://github.com/Hexxeh/rpi-update

Installing

sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update

Updating

sudo rpi-update

需要更新 kernel 和 firmware 的朋友,可以利用這工具更新你的 Raspberry Pi。 但是若之前有使用自行編譯的 kernel 和 module,必須自行再重新編譯一次自定義的 kernel。

2013年2月26日 星期二

ZeroMQ for RaspberryPi

自從在開發機上準備好 toolchain 後,就一直沒有實際找 project 嘗試編譯給 RPi 使用。而最近 Lab 的 Project 也需要使用到 ZeroMQ,因此本次就先以 ZeroMQ 當作練習對象。

在開始之前,請先確定有下列檔案:
1. zeromq-2.2.0.tar.gz(我以 Stable release 2.2 版本為範例)
    下載位置:zeromq
2. util-linux-2.22.2.tar.gz(ZeroMQ 編譯時需要 uuid-dev 相關函式庫)
    下載位置:util-linux
3. toolchain for RPi
(以 Raspberry Pi:Cross-compiler (update) 中所下載的 32 bits 為範例)
    由於 Raspbian 有支援 hardfp,
    因此使用的 toolchain 為官方提供的 toolchain 中的 arm-bcm2708hardfp-linux-gnueabi

首先,先將 toolchain 與環境參數設定好:

我將 toolchain 安裝在
/home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi

1. 登入 root 身分
$ sudo -i
2. 設定 PATH
$ export PATH=$PATH:/home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin
以上便設定好 toolchain。


接著編譯 uuid-dev 相關的函示庫,

編譯 ZeroMQ 時需要用到。


1. 切換目錄至 util-linux-2.22.2.tar.gz 所在位置
$ cd /tools
2. 建立暫時安裝目錄
$ mkdir util-linux-tmp
3. 解壓縮 util-linux-2.22.2.tar.gz
$ tar -xzvf util-linux-2.22.2.tar.gz
4. 進入 util-linux-2.22.2
$ cd util-linux-2.22.2/
5. 執行 configure 進行配置
$ ./configure -without-ncurses -host=arm-bcm2708hardfp-linux-gnueabi -disable-login -disable-su -prefix=/tools/util-linux-tmp
6. 開始編譯
$ make
7. 執行安裝
$ make install
8. 切換到 util-linux-tmp
$ cd /tools/util-linux-tmp
9. 將 lib/ 目錄底下的 libuuid.a libuuid.la libuuid.so libuuid.so.1 libuuid.so.1.3.0 複製到 toolchain 的 lib 中
$ cp lib/libuuid* /home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/lib
10. 將 include/ 目錄底下的 uuid 目錄複製到 toolchain 的 include 中
$ cp -r include/uuid /home/bkdragon/rpi/rpi_cross_compiler_x86/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/arm-bcm2708hardfp-linux-gnueabi/include

以上步驟設置完 uuid-dev 當相關函式庫;


接著開始編譯 ZeroMQ 的函示庫!


1. 切換目錄至 zeromq-2.2.0.tar.gz 所在位置
$ cd /tools
2. 建立暫時安裝目錄
$ mkdir zeromq-2.2.0-rpi
3. 解壓縮 zeromq-2.2.0.tar.gz
$ tar -xzvf zeromq-2.2.0.tar.gz
4. 進入 zeromq-2.2.0
$ cd zeromq-2.2.0/
5. 執行 configure 進行配置
$ ./configure -host=arm-bcm2708hardfp-linux-gnueabi -prefix=/tools/zeromq-2.2.0-rpi
6. 開始編譯
$ make
7. 執行安裝
$ make install
8. 所有 ZeroMQ 的相關檔案會被放置在 /tools/zeromq-2.2.0-rpi 底下,將整個目錄把包
$ cd ..
$ tar -czvf zeromq-2.2.0-rpi.tar.gz zeromq-2.2.0-rpi/
9. 將 zeromq-2.2.0-rpi.tar.gz 複製到 RPi 後,解壓縮到 /usr/local 中,並執行 ldconfig
(on RPi) $ cp -r * /usr/local
(on RPi) $ sudo ldconfig

以上即完成在開發機上的 ZeroMQ for RPi 編譯動作。
之後再 RPi 上編譯 ZeroMQ 的程式測試是否正常運作!

2013年1月22日 星期二

Raspberry Pi:安裝OS、簡易設定 (update)

做此步驟前,請先準備以下工具:
  1. 4 GB以上的SD卡(點選這裡,查看是否相容RPi)
  2. SD card reader

下載並安裝 RPi OS image 進 SD Card

這邊我以 Raspberry Pi 官方推薦初學者使用的 Raspbian “wheezy” 作為範例,並以 Windows 作為安裝 OS 的平台,Linux 和 MAC OS 請參考 官方Wiki

1. 首先至官方網站的 Download 下載 Raspbian “wheezy” 的 ZIP 檔,解壓縮得 ISO。
2. 將 SD 卡先格式化。
3. 下載 Win32DiskImager 並解壓縮。
4. 執行 Win32DiskImager。

5. Image File 選擇欲安裝進 SD 卡的 ISO(Ex:D:/2012-10-28-wheezy-raspbian.iso)。
6. Device 選擇 SD 卡的位置。
7. 按下 Write,喝杯咖啡,回來就安裝好了!

以上步驟沒有難度,之後只需要插上 Raspberry Pi,插上周邊啟動它。

簡易設定

而將 SD 卡插上 Raspberry Pi 後,第一次啟動會跳出 config 畫面,可依照自己的需求調整。
如果你錯過的這個 config 畫面,可在 command line 執行:
$ sudo raspi-config
  • info:顯示該 tool 資訊。
  • expand_rootfs:當你的 SD 卡容量有 4GB 以上時,安裝完成 OS 後你會發現到實際上能使用的空間只有 2GB,選擇此項目可讓可使用的空間擴大到整張 SD 卡的容量。
  • overscan:調整螢幕輸出解析度。
  • configure_keyboard:設定鍵盤配置。
  • change_pass:修改密碼。
  • change_locale:修改地區。
  • change_timezone:修改時區。
  • memory_split:修改記憶體分割。
  • overclock:超頻選項。
  • ssh:如果需要以 ssh 的方式使用 RPi,請選此選項啟動 sshd。
  • boot_behaviour:修改 boot 後的動作,可直接自動執行 X window。
  • update:更新 raspi-config 工具。

預設帳號密碼

Raspberry "wheezy" 這個 OS 的預設帳號:pi,密碼:raspberry。
不是每一套都是此設定,請參考 OS 發布版本的說明。

啟動 X Window

在 command line 執行:
$ startx

針對DVI螢幕調整(option)

hdmi_group=2
hdmi_mode=82
hdmi_force_hotplug=1