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

星期四, 2月 03, 2011

Updating Seagate Harddisk Firmware under Linux

Actually this is not really about Linux. It's just about when you have no windows and want to update the firmware of the HDD with the official utility.

This article is actually about using the loopback support from grub2 to load the official iso, and the memdisk tool from syslinux to load the disk image inside the iso.

Follow these steps below:

  1. download the official Seagate firmware update ISO image (for example, MomentusXT-ALL-SD24.iso)
  2. put the iso image under /boot (or anywhere else that grub2 can access)
  3. get syslinux, we actually only need the memdisk tool. put that in /boot/memdisk (or somewhere else that grub2 can access)
  4. reboot into grub2 shell
    • upon reboot, keep clicking ESC like crazy, this should bring up the boot entry selection screen
    • when you see that screen, hit 'c' to enter the grub shell (the command prompt)
  5. inside the grub shell, run these commands:
    • loopback loop /MomentusXL-ALL-SD24.iso
      • (change this to the path of the iso image)
    • linux16 /memdisk
      • (change this to the path of the memdisk)
    • initrd16 (loop)/AN-SD24.ima
      • (this may vary, just look for the file with a suffix .ima)
      • (if you don't know the filename, `ls (loop)/` to get a list)
    • boot
  6. now you're inside the official firmware update tool, follow the on-screen instructions.

Enjoy!

星期日, 12月 06, 2009

Cross-Compiling Made Easy - with Gentoo Linux

用 Gentoo 最開心的地方,就是它非常的 developer friendly。

交叉工具鍊 - Cross-Toolchain

個人認為這個翻譯很糟糕... 不過要在 Gentoo 下要生出一個可用的 cross-compiler,只需要兩行指令:

$ sudo emerge crossdev
$ sudo crossdev -t ARCH-VENDOR-OS-LIBC

請將 ARCH-VENDOR-OS-LIBC 取代成對應的軟硬體設置,具體請參考 `crossdev -t help`。

不過在這之前,最好先有個本機上的 PORTDIR_OVERLAY. 不然 crossdev 會建立一些檔案根目錄在 PORTDIR_OVERLAY 裡面找到的第一個目錄下。您可以用以下指令直接修改 /etc/make.conf(注意單引號跟雙引號):

$ sudo bash -c 'echo PORTDIR_OVERLAY=\"/path/to/overlay \${PORTDIR_OVERLAY}\" >> /etc/make.conf'

雖然要等一段時間,不過過程可是全自動的!

做完以後,就會得到一整排的工具了。例如 ARCH-VENDOR-OS-LIBC-{gcc,g++,as,ld,strip,...} 等等。

目標檔案系統 - Target Filesystem

基本上也是三個指令,不過要等更久...

$ sudo emerge crossdev-wrappers
$ sudo emerge-wrapper --init
emerge-ARCH-VENDOR-OS-LIBC system -v

然後系統就會出現在 /usr/ARCH-VENDOR-OS-LIBC 目錄下了。注意喔,千萬別把它移走!即使移走也要作個 symlink 回來,不然 cross-emerge 會找不到路徑。

星期四, 11月 26, 2009

rtc-davinci-evm for dm6446 on linux-davinci.git

中文版

從 2.6.27-davinci1 開始,由於引進了新的 i2c framework,導致 dm6446evm 上許多走 msp430 的週邊都不能用了,例如 rtc-davinci-evm 與 IR receiver 等等。到今天 2.6.32 都快 release 了,還是沒有人把 driver port 過去...

沒辦法,公司產品需要,所以咧... 只好自己動手啦!(這也是 Open Source 社群最有趣的地方!)

悲慘的是,寫好 driver、測試成功以後,居然 linux-davinci 的 mailing-list 不給我寄 @@ 所以只好先放在公司的 git repository 上啦。不過這個網址只是暫時的,也許過一陣子會改...

English Version

Start from 2.6.27-davinci1, linux introduced the new i2c framework, which causes many peripherals of the msp430 chip on dm6446evm stop working, such as rtc-davinci-evm and the IR receiver. As for today, although the 2.6.32 is about to get released, but the driver is still stays unusable...

Too bad, my company just uses dm6446 in our product, which I just have to port them by my own! (Which is the major fun for an Open Source community!)

But what bothers me is that, after I successfully wrote the driver, and verified it's working great, I cannot submit it on the linux-davinci mailing-list due to some unknown error (used to be able to send a mail there...) @@ so i just have to put the files on my company's local git server. However this is a temporary domain name, it may or may not be changed later, anyway.

星期一, 8月 31, 2009

救災順利!成功救活四名專題做不出來的學弟!

我大學時代的專題老師,今年叫學弟們做 ARM Linux + RFID 相關的專題,主要是用來管理冰箱裡面的東西的保存期限的。

可是呢,這群學弟...

「ARM 是什麼?可以吃嗎?」
「Linux 我們不太會耶!」
「RFID Reader 只有 Windows driver (還是 VB.Net 寫的) 耶,可以拿去 Linux 上編嗎?」

所以,不知道他們從哪裡找到我,突然來問我要怎麼辦。

我想說,既然是以前的專題老師,要是這組學弟做不出來或做的不好,他也很丟臉... 而且順便也想看看 RFID 在 Linux 上到底會不會動,所以就決定下去台中一趟幫他們看看。

不看還好,一看之下才發現,他們使用的 ARM 是 s3c2410 配上一套有夠舊的 Linux(kernel 是 2.4.x......),可是使用的 SUMMIT U-Reader 在我的機器上倒是抓的到也有 driver,只是沒有 user-space tool 去 access 它而已。所以我乾脆就叫他們說,先在 PC Linux 上做,然後把移植到 arm 上當成一個「願景」。盡量使用嵌入式系統上容易找到的軟體(如 boa),如果真的要移植的話也比較方便。

SUMMIT U-Reader 其實是一個 pc210x 的 USB-to-RS232 晶片,加上他們自己家的 HF 讀卡模組(使用 RS232 介面,Windows 的 VB.Net 程式也是使用 Serial subsystem 去 access)。既然如此,事情就簡單啦!我只要弄個 serial 程式去操作它就可以了!

我目前幫他們寫到可以抓到卡號,讀取以及寫入 RFID Block 就要靠他們自己了。以下是 example code(BSD License!):

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

#include <iostream>

#define TTYDEVICE "/dev/ttyUSB0"
#define BAUD  B19200

int open_port(void)
{
 int fd = open(TTYDEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
 if (fd == -1)
 {
  perror("open_port: Unable to open " TTYDEVICE);
  return fd;
 }
 fcntl(fd, F_SETFL, 0);

 // port settings
 struct termios options;
 tcgetattr(fd, &options);
 cfsetispeed(&options, BAUD);
 cfsetospeed(&options, BAUD);
 options.c_cflag  |= (CLOCAL | CREAD);
 options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);
 options.c_oflag  &= ~OPOST;
 options.c_iflag  |= (INPCK | ISTRIP) & ~(IXON | IXOFF | IXANY);
 options.c_cc[VMIN] = 0;
 options.c_cc[VTIME] = 10;
 tcsetattr(fd, TCSANOW, &options);

 // clear I/O buffer
 tcflush(fd, TCIOFLUSH);

 return fd;
}

int main()
{
 // get the file descriptor from open_port()
 int fd = open_port();

 // I/O buffer, let it be the 'I' command initially
 char buf[256] = { 0x1b, 'I', '\r', 0 };

 int n;

 // write() the 'I' command
 if ((n = write(fd, buf, 3)) < 3)
  std::cerr << "write() of 3 bytes failed!\n";
 else
 {
  std::cout << "write() " << n << " bytes: ";
  for (int i = 0;i < n;++i)
  {
   std::cout << "0x";
   std::cout.width(2);
   std::cout.fill('0');
   std::cout << std::hex << static_cast<int>(buf[i]) << ' ';
  }
  std::cout << std::endl;
 }

 // read the result  n = read(fd, buf, 255);
 if (n < 0)
  fputs("read() failed!\n", stderr);
 else
 {
  std::cout << "read() " << n << " bytes: ";
  for (int i = 0;i < n;++i)
  {
   std::cout << "0x";
   std::cout.width(2);
   std::cout.fill('0');
   std::cout << std::hex << static_cast<int>(buf[i]) << ' ';
  }
  std::cout << std::endl;
 }

 close(fd);

 return 0;
}

星期一, 3月 30, 2009

Bug wranglers know this bug by heart now

之前更新 gcc-4.3.3-r1 之後,編 mplayer 會吐 ICE 出來。今天 emerge world -ua 的時候看到 gcc-4.3.3-r2,在裝之前想說看一下 ChangeLog 有沒有修好這個 bug:

27 Mar 2009; Peter Alfredsen -gcc-4.3.3-r1.ebuild, +gcc-4.3.3-r2.ebuild: Revbump with broken patch disabled to stop duplicates of bug 262567 from flowing in. Bug wranglers know this bug by heart now.

這個 #262567 file 的就是這個 bug。點進去看一下... 挖咧!二十幾個 duplicates = = 難怪 Bug wranglers 會 know this bug by heart 了 XD~

底下是一段 Quote:

At last, rev-bumped.

Btw, maybe all those duplicates are not the user's inability to search, but their ability to tell you "please *always* rev-bump fixes that are not build-related to the package itself" :P

- Nikos Chantziaras

星期二, 10月 21, 2008

VirtualBox 與 tuntap interface

從純 User 的角度來看,比起 VMWareVirtualBox 的好處是,不必載入一堆有的沒有的核心模組(只有一個 vboxdrv),而且少了一堆 init script。付出的代價是... 某些方面的設定多了一些,不過這些設定並不複雜,只是麻煩些罷了。

如果您也跟我一樣不想讓 VirtualBox 用內部的 NAT,而是透過 Host Interface 直接上網,可以這麼作。首先假設網路拓樸長這樣:

  1. 增加一個 bridge 介面
    這個根據系統,會有不同的設定。在 Gentoo(baselayout-2)下,請安裝 usermode-utilities 與 bridge-utils,並修改 /etc/conf.d/net 這個檔案:
    config_eth0="null" # eth0 設為 null,並且把其他跟 eth0 有關的設定都拿掉
    bridge_br0="eth0" # 讓 bridge 由 eth0 組成
    config_br0=( "192.168.1.254/24" ) # 改成您的 IP
    #config_br0=( "dhcp" ) # 如果您要讓這台機器走 dhcp
    brctl_br0=(
        "setfd 0"
        "sethello 0"
        "stp off"
    )
    routes_br0=( 'default via 192.168.1.1' ) # 如果用 dhcp,請註解掉。
    fallback_br0=( "apipa" ) # 可有可無...

    ...

    link_ppp0="br0" # 如果有 adsl 撥接,請改成透過 br0。

    ...
  2. 增加相應的 init script
    $ sudo ln -s /etc/init.d/net.{lo,br0}
  3. 修改 /etc/sudoers
    加入以下這行:
    %vboxusers ALL=(ALL) NOPASSWD: /usr/bin/VBoxAddIF, /usr/bin/VBoxDeleteIF
  4. 加入一個 helper script
    放在哪裡都可以。為了讓所有的 User 都可以用,我放在 /usr/bin/VBoxIFManager.sh,別忘了 chmod +x 喔!
    #!/bin/bash

    IF="${1}"
    ACTION="${2}"
    BRIDGE="br0"

    case "${ACTION}" in
    up)
        sudo VBoxAddIF "${IF}" "${LOGNAME}" "${BRIDGE}" > /dev/null 2>&1
        ;;
    down)
        sudo VBoxDeleteIF "${IF}" > /dev/null 2>&1
        ;;
    esac

    echo "${IF}"
  5. VirtualBox 內的設定
    在 Virtual Machine Settings 裡的 Networking 下...
    • Attached to 選 Host Interface
    • Interface name 留空白
    • Setup Application 填入「/path/to/VBoxIFManager.sh vbox0 up」
    • Terminate Application 填入「/path/to/VBoxIFManager.sh vbox0 down」
    其中 vbox0 可以改成任意字串,如 winxp、fbsd、palatis_is_very_handsome 之類的。

星期三, 8月 20, 2008

不值錢的硬碟、不值錢的記憶體、難喬的滑鼠

我媽是幫人家作美容的,所以時常需要儲存大量的膚質檢測的照片、化妝過程的影片、資料、與一些課程的錄音。可想而之,這些都是動輒數百 MB、甚至數 GB 大傢伙。而她那台 120GB 硬碟的 ASUS A8Je(這台機器又大又重又沒有比較快,在我看來一無可取,還有一些哩哩叩叩的問題,不過那些又是另一個故事了!)根本放不下這麼多東西。

再來就是我妹的 Acer TravelMate3000,有點古早的機器,只有 512MB 的 RAM。配上一顆 4200rpm 的 60G 硬碟,跑起來跟烏龜有的拼。玩 ANNO 1503 都氣喘吁吁,所以決定幫她升級個 RAM。

總之呢,就殺去光華買了以下東西...

  • Maxtor Basic 1TB:本來打算隨便挑個最便宜的 500GB 的,但是找來找去都要三千台票上下。後來看到這個只要 $4990,繞來繞去還是決定買這個。個人覺得相當划算!一開始老闆報 $4990 給我們的時候還猶豫要不要買,後來回去的時候老闆剛好離開,店員因為單子上印的是 $5390 不敢賣。老闆回來以後才知道說本來今天要調整售價,但是代理商說明天才調整,但是單子已經印了,所以今天還是 $4990。我就開玩笑的說「哇!明天就漲價了,那趕快多買一顆!」結果老闆跟店員都急忙說「要用再買啦!不要急著買。」阻止我買。哈!
  • Transcend So-DIMM DDR2-667 2GB x 2:JetRam 的,一條 999。這兩條換給我媽,把我媽的一條舊 1G 加上新買 1G 給我妹。
  • Transcend So-DIMM DDR2-667 1GB:也是 JetRam 的,一條 550。配上我媽換下來的 1G,湊成 2G 給我妹。
  • Logitech V470:順便買給自己的藍牙鼠~ $1180 新台票。

硬碟拿回家當然是先 benchmark 一下。用 h2benchw 跑了 read test,速度很神奇的從頭到尾都在 34.5 ~ 35.5 MB/s 之間晃盪,看來這顆硬碟的速度超過 USB 的極限,沒辦法更快了... 跑完以後我就懶得跑 write test 了,因為 1TB/35MBps = 460min,我懶得再等他跑一遍 = =

RAM 的部份,A8Je 這個爛東西,BIOS 不支援 memory remapping(已經更新到最新版了),所以只能讀到 2944MB。是的,意思是說有 500 元的 RAM 沒有用到。但是至少雙通道沒問題,就將就用吧!該死的 A8Je。

剩下 1GB x 2 就塞給我妹電腦(什麼?你問我幹嘛不按槓下來?其實我也很想啊~可是我的是 DDR 不能插 QQ)。可是根據我妹的證詞指出,升級 RAM 以後機器變熱了!?奇怪,難道 1GB 模組比 256MB 模組熱嗎?

藍牙滑鼠很不錯,羅技新的雷射光學鼠,在什麼鬼地方用都感應的到。只是 BlueZ 3.36 的 Service Framework 怪怪的,bluez-gnome 也怪怪的,所以加起來就有時候連的上有時候連不上。如果您使用 bluez-gnome 或 kdebluetooth 卻沒有辦法連上藍牙鼠,又試過一般步驟(`hcitool cc <bdaddr>' 一類的)也不會動,可以試試以下的步驟...

先用以下的 python script 試試看...

import dbus
bus = dbus.SystemBus()

# service activation
bmgr = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = bmgr.ActivateService('input')
imgr = dbus.Interface(bus.get_object(bus_id, '/org/bluez/input'), 'org.bluez.input.Manager')

# devices
devices = imgr.ListDevices()
for path in devices:
    idev = dbus.Interface(bus.get_object(bus_id, path), 'org.bluez.input.Device')
    if idev.IsConnected():
        print 'Path: ' + path + ' [connected]'
    else:
        print 'Path: ' + path + ' [not connected]'
    print ' bdaddr: ' + idev.GetAddress()
    print ' Name: ' + idev.GetName() + ' [' + str(idev.GetVendorId()) + ':' + str(idev.GetProductId()) + ']'
    # try connect unconnected devices
    if not idev.IsConnected():
        print 'trying to connect...'
        idev.Connect()

如果還是不行,再跑這個 python script,別忘了把 "XX:XX:XX:XX:XX:XX" 換成您的 bdaddr:

import dbus
bus = dbus.SystemBus()

# service activation
bmgr = dbus.Interface(bus.get_object('org.bluez', '/org/bluez'), 'org.bluez.Manager')
bus_id = bmgr.ActivateService('input')
imgr = dbus.Interface(bus.get_object(bus_id, '/org/bluez/input'), 'org.bluez.input.Manager')

# create and connect to device
path = imgr.CreateDevice('XX:XX:XX:XX:XX:XX')
idev = dbus.Interface(bus.get_object(bus_id, path), 'org.bluez.input.Device')
idev.Connect()

如果還是不行...... 就沒轍啦!把 /etc/init.d/dbus 跟 /etc/init.d/bluetooth 都 restart 一次再試試看!

星期六, 8月 09, 2008

壓榨您的記憶體 - CompCache

您可能沒有辦法在 1 公升的茶壺裡裝下 1.5 公升的水,但是現在您有機會在 1GB 的記憶體裡面塞進 1.5GB 的資料!與 Windows VistaReadyBoost 不同,LinuxCompCache 試圖在不須外加任何硬體下,把更多資料塞進記憶體裡面。

與許多先進的作業系統一樣,Linux 以分頁(page)來管理記憶體。Linux 的分頁大致上可分為:

  1. 核心分頁(kernel pages):核心分頁永遠不會被放到虛擬記憶體中,不管是不是在拉屎,反正總是在實體記憶體中佔一個茅坑。某些 Unix 系統可以把核心分頁放到虛擬記憶體,但是 Linux 的開發者們覺得這太囉唆了,會大幅增加 VMM 的複雜度,所以沒有這麼做。
  2. 程式內容(program texts):程式內容就是一個程式實際會被執行的東西,例如 /bin/bash 或 /lib/libc.so.6 裡面的東西。這些是唯讀的資料,亦即,這些資料從被載入到卸除之間,內容都不會改變。呃,您不會希望 ls 執行到一半突然變成 rm 吧 @@ 想當然 kernel developers 不可能讓這種事情發生!
  3. 檔案分頁(file-backed pages):這種分頁也是從某個實際的檔案讀進來,但是它們的內容並不是唯讀的。如果在記憶體中的內容改變了的話,則必須找機會寫回檔案裡面。
  4. 匿名分頁(anonymous pages):由於這些分頁沒有對應到實際的檔案,所以被叫做「匿名」的分頁,stack 跟 heap 就是屬於這種類型。如果您的程式使用 malloc() 或 new,那麼配置的記憶體就屬於這種。
  5. 快取分頁(cached page):Linux 並沒有專門的 disk cache,取而代之 Linux 會將最近用到的磁碟資料放在快取分頁(cached page)中。Linux 通常不會直接讀寫磁碟,而是先在記憶體中操作,再找機會沖(flush)回磁碟中。
  6. 未使用記憶體池(free pool):目前沒有被使用,裡面沒什麼重要資料的記憶體。這種記憶體可以直接分配給需要的程式。

如果某個記憶體分頁中的資料與磁碟上的一樣,我們叫這種分頁乾淨的分頁(clean pages),即使挪作他用也不必擔心等下找不回來,再從磁碟上讀取就好了。但是如果分頁中的資料跟磁碟上的不一樣,就是髒的分頁(dirty pages)。髒分頁要變成乾淨的分頁很簡單,把資料寫進磁碟就好了,這個動作被稱為「收回(eviction)」。

回到主題,在程式配置記憶體的時候,核心會先嘗試在 free pool 中找看看有沒有合適的空間。若 free pool 中剩下的記憶體太少,核心就必須釋放一些 clean page 出來。如果沒有 clean page,則必須找一些 dirty page,把它們弄乾淨,再釋放回 free pool 中。file-backed pages 即使是 dirty 的,在寫回磁碟變成 clean 以後就可以直接釋放。但是 anonymous pages 就沒那麼好運,因為在定義中,anonymous pages 就是不屬於實際檔案的記憶體。這些記憶體,想當然就會被寫進置換記憶體(swap memory)中。由於寫回 swap memory 比寫進檔案輕鬆(不必穿越整個 VFS 系統、更新 mtime、atime 一類的雜事),所以釋放的順序通常是:

  1. clean anonymous pages:直接釋放
  2. clean file-backed pages:直接釋放
  3. dirty anonymous pages:寫回磁碟後釋放
  4. dirty file-backed pages:寫回磁碟後釋放

由於磁碟跟記憶體的速度簡直是烏龜比火箭,當您需要使用大於電腦實體記憶體的儲存空間的時候,就會發生 thrashing。亦即,核心好不容易把資料 A 寫進硬碟,騰出空間給資料 B,但是您馬上又要使用資料 A,只好又把資料 B 寫進硬碟,讀取資料 A,可是過一會兒又要用到資料 B... 於是硬碟怒吼、滑鼠呆滯、機殼好像瘋了一樣隨硬碟起舞...

CompCache 就是解救這個狀況的救星!它的基本概念很簡單,擠不出多餘空間的時候,把 dirty 的 anonymous pages 壓縮起來 swap 回 ram,再把節省下來的空間分配給需要的程式使用。在大部分的電腦配置下,即使壓縮、解壓縮再怎麼慢,通常也比磁碟存取快的多。

此圖直接從 CompCache 官網偷來...

如果您知道如何編譯核心,那麼安裝 CompCache 並不困難。首先,您必須有一套支援 CompCache 的核心(例如 zen-sources 2.6.25+),然後打開 CONFIG_BLK_DEV_COMPCACHE 即可,我是編譯成模組(m)。使用新的核心開機,然後執行 # modprobe compcache
# swapon -p 9999 /dev/ramzswap0
即可。CompCache 預設會將佔用的記憶體上限設為實體記憶體的 25%,如果要調整,可以在 modprobe 的時候指定 compcache_size_kbytes 參數,例如 modprobe compcache compcache_size_kbytes=524288 即使用 512MB 作為上限。

我的機器上的實測,這台機器目前是 A-Data DDR SDRam 512MB 兩條。

// 寫入 ram(事實上是寫入 tmpfs,速度很接近直接記憶體讀取)
# dd if=/dev/zero of=/dev/shm/bigfile bs=32768 count=16384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 1.18726 s, 452 MB/s
// 再把它讀出來
# dd if=/dev/shm/bigfile of=/dev/null bs=32768 count=16384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 0.452667 s, 1.2 GB/s
// 寫入 compcache
# dd if=/dev/zero of=/dev/ramzswap0 bs=32768 count=15384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 2.53538 s, 212 MB/s
// 從 compcache 讀取
# dd if=/dev/ramzswap0 of=/dev/null bs=32768 count=15384
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 2.82894 s, 190 MB/s
// 寫入硬碟的 swap 分區
# dd if=/dev/zero of=/dev/sda1
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 22.4473 s, 23.9 MB/s
// 從硬碟 swap 分區讀取
# dd if=/dev/sda1 of=/dev/null
16384+0 records in
16384+0 records out
536870912 bytes (537 MB) copied, 21.3317 s, 25.2 MB/s

由此可見,在我的機器上,直接存取記憶體最高有 1.2GB/s,但是硬碟卻只有 25 MB/s。使用 CompCache 則有 200MB/s 以上的速度,記憶體的 1/6、但是硬碟的 8 倍。

星期一, 6月 30, 2008

3 CPUs (7 cores), 11GB of RAM, 900GB of Storage, Shitty GPU...

最近心情不是很好,主要的原因是大學要延畢... 為了振奮精神,決定添購新的電腦設備。嗯?你說「為什麼心情不好要買新電腦」嗎?哎唷,就像有人心情不好去飆車,有的人去大吃大喝,添購新電腦應該是不傷身體(嗯... 傷荷包 XD~)、健康、又可以刺激經濟發展的方法... 再說,目前桌機也舊的該換了,不但效能已經不敷使用,耗電量也較高,每瓦效能就更難看了...

前桌機:

    • CPU:AMD AthlonXP (Barton) 2600+ @ 1933Mhz
    • Ram:DDR-333 256MB x 1、DDR-400 512MB x 1(total 768MB)
    • MB:Gigabyte 7VT600P-RZ
    • GPU:GeForce 7300GT 256MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2
    • PWS:EQUAL ISO-400D (300W)
    • OS:Gentoo Linux 2007.0
    • CPU:AMD AthlonXP 1800+ @ 1150Mhz(因為板子不支援 133Mhz 的 FSB,只好跑 100Mhz)
    • Ram:256MB PC-133 SDRam x 3
    • MB:Gigabyte GA-7ZX
    • GPU:GeForce FX 5200 128MB
    • Storage:Seagate Barracuda 7200.8 200GB
    • NIC:Realtek RTL8139B
    • PWS:Delta GPS-300AB-100E (300W)
    • OS:Ubuntu 8.04

比較快的那台桌機,編譯 glibc 要花一個多小時,根據 AthlonXP 的 TDP 68.3w 來計算,68.3w * 1.25hr = 85.375w-hr,如果 glibc 改版個 12 次,我就要排放 0.638kg 的 CO2,而這些還不包括 MB、RAM 等週邊消耗的電。

比較慢的那台機器雖然比較少編譯東西,但是設備老舊到我不知道該拿他來幹什麼(因為幹什麼都慢...),所以除了偶爾玩玩 Chromium BSU、開 Firefox 上上網以外,大部分時間只是浪費能源...

而且兩台都是超過五年的機器,當時的設備比較不注重能源管理,所以都沒有省電功能,搞得我不開冷氣電費還要兩千多塊...

今桌機:

    • CPU:AMD Phenom X4 9550 @ 1.1Ghz ~ 2.2Ghz
    • Ram:Transcend DDR2-800 2GB x 4
    • MB:ASUS M3A
    • GPU:GeForce 8500GT 256MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2(原來的)
    • PWS:Seasonic SS-380GB (380W)
    • OS:Gentoo Linux 2007.0
    • CPU:AMD Athlon64 X2 4600+ @ 1.0Ghz ~ 2.4Ghz
    • Ram:Transcend DDR2-800 1GB x 2
    • MB:Gigabyte GA-M56S-S3
    • GPU:GeForce 8400GS 512MB
    • Storage:Seagate Barracuda 7200.10 320GB x 2(用舊的)
    • PWS:EQUAL ISO-400D (300W)(用舊的)
    • OS:Hack1nt0sh(預定)

Phenom 的 TDP 有 89w,Idle 時的 power consumption 約 21w,但是現在 glibc 十四分鐘可以編完,換算起來是 89w x 0.25hr + 21w x 1.0hr = 43.25w-hr,大約省了一半左右的碳,而 DDR2 也比 DDR 省約 50% 的電,新 Power 也號稱有 85% 以上的能源轉換效率。

而且換了新電腦,現在從開機到進入圖形介面,大約只要 30~40 秒,若再配合一些加速開機的 tuning,應該可以降低到 20 秒以內。這讓我想要再弄一台更省電的機器養動物,最好是插個像手機充電器那樣的變壓器就可以跑,桌機不用時就可以關機了。

再加上筆電(後來被我升級成 1GB RAM)的話,共有...

  • 三顆 CPU
  • 七個運算核心
  • 11GB 的記憶體
  • 980GB 的硬碟空間
  • 不怎麼樣的顯示卡兩張(不過 GDDR2 加一加也有 768MB = =)

話說 GeForce 8400GS 這張卡跑起 3D 真的不怎麼樣... 如果預算充足,多花個 500~1000 買到 8600GT,Quake4 engine 可以多跑 4 倍的 FPS。8400GS:8500GT:8600GT 效能約 1:2:4,但是價格是 1:1.3:1.9。

星期四, 6月 19, 2008

NVRM: pmd not present for addr %x

如果您使用 nVidia 的顯示卡與官方驅動程式,dmesg 中又一直出現這個訊息的話,表示您忘記載入 cpufreq 驅動程式了。可是... 為什麼明明就是顯示卡的 module,可是卻使用 cpufreq 的東西咧?

真是令人不解!

無論如何,只要載入 cpufreq 的 module,dmesg 中就不會再一直出這個訊息了。

// 我的是 powernow-k8,請自己改成適當的 driver:
# modprobe powernow-k8

星期三, 4月 30, 2008

戰鬥即將結束,抬頭仰望星空~

耗時兩年,做得不怎麼樣的畢業專題 - Chrasis,終於在昨天展完。剩下的只有把程式碼燒進光碟(應該燒成 Blue-ray Disk,充分浪費儲存空間!),跟成果報告書一起塞進圖書館陰暗角落的書櫃中。

$ du chrasis/ -hs
35924 chrasis/

程式碼有 36MB 呢!真是佩服我自己,花了兩年居然只能寫這麼點東西,都不知道在混什麼... = =

不過我在展的時候... 好像都沒有被老師ㄉㄧㄤ到咧?據說別組被ㄉㄧㄤ的很慘...

--- Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 ---

據說有更屌的... 某組別的同學在評分老師(下稱 TeacherQ)質詢的時候,該組的指導老師(下稱 TeacherM,同時也是敝系主任)剛好在旁邊。結果 TeacherQ 問的問題全都是 TeacherM 在回答。哇咧!?這是怎樣?那我找指導老師來顧攤就好了嘛,絕對問不倒的!

還有就是,這次專題展系上每組僅提供一台電腦,而且這台電腦是於 90 年 11 月 22 日以 $50000 採購,使用年限四年的機器。意思是說,這個東西已經過了線性折舊期,可以拿去報銷了。那我如果不小心把它弄壞的話,只要賠 $0 囉?

另外,因為我們的展覽有分兩個梯次,下一組展覽的同學把我們借的設備也拿去用了(奇怪,我們需要三台電腦要自己出兩台,他們只要出一台就好,是怎麼回事?)。可是因為專題需要,我把那台電腦灌成 Ubuntu 了耶!!!

--- Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 ---

還有一件想起來的時候已經來不及的事情... 本來想說要利用專題展的時候偷偷蒐集 stroke data 的,可是展覽結束我居然忘記把他們複製出來 = = 白忙一場了...

Gentoo 下的 DNS 設定(Modular Network)

Gentoo 下,設定網路是那麼容易也那麼的不容易。不經大腦的把 /etc/conf.d/net 砍掉的話,一切就使用美好的預設設定。但是若要更改一點點東西,就很令人 OOXX。

最近想把 dns server 換成 OpenDNS,但是每次 dhcp 跟 ppp 都把我的 resolv.conf 亂改成自己想要的內容(如 192.168.1.1 或 hinet dns),真是令人火大。

好在有 openresolv 這個好東西,裝了以後就沒煩惱了!雖說這個主要是給 vpn 用的...

首先安裝:

# emerge openresolv

然後設定:

# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a $INTERFACE

請把 $INTERFACE 換成您的 interface,如 eth0 或 ppp0:

# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a eth0
# echo -e 'nameserver 208.67.222.222\nnameserver 208.67.220.220' | resolvconf -a ppp0

然後讓他更新:

# resolvconf -u

這麼一來,就可以用 OpenDNS 查 domain name 了!

# host -v palatis.iiiii.info
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55262
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN A

;; ANSWER SECTION:
palatis.iiiii.info. 28 IN A 220.141.34.251

Received 52 bytes from 208.67.222.222#53 in 157 ms
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14133
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN AAAA

Received 36 bytes from 208.67.222.222#53 in 156 ms
Trying "palatis.iiiii.info"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16198
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;palatis.iiiii.info. IN MX

Received 36 bytes from 208.67.222.222#53 in 168 ms

星期一, 6月 04, 2007

喂喂,別盜用我的無線網路!

在 oftc 的 #dot,pnt 兄分享了一篇文章

喂喂!這也太狠了吧?XD~

看吧,只要稍微學會 Linux,你就可以做這種事惡整盜用你家 wlan 的鄰居!

星期五, 6月 01, 2007

換湯不換藥

ㄟ... 這會不會太扯?

課程名稱一個樣,課程內容另一個樣...

不知道什麼時候可以改好一點 = = 網址在這裡

星期二, 5月 08, 2007

讓 Firefox 開快點 - 關掉啟動時的自動更新

即使我已經無所不用其極的想辦法讓程式載入的速度快點,但是碰上 Firefox 這頭怪獸,把他從磁碟裡拖到螢幕上裡還是得花個兩三秒。

後來,我發現 Firefox 會嘗試在啟動的時候(程式已經啟動、但是視窗跳出之前)更新附加元件與搜尋引擎。這麼一來,若有更新,可以不必在你已經開了一堆視窗以後,跳個對話方塊出來要求你重新啟動 Firefox。

但是,由於網路的 latency,檢查更新的速度快則半秒,慢則一兩秒,可以說在我 Firefox 的啟動過程中,佔掉了 20~50% 的等待時間。於是,我決定將它關掉,並安裝另一個 extension 來檢查更新。(反正又不是一天到晚有更新檔要裝,但是我可是一天到晚都會關閉、開啟 Firefox 啊!)

怎麼關呢?請至「編輯 => 偏好設定 => 進階 => 更新」下,將「自動檢查是否有更新」下的所有東西(應該有三個,分別是「Firefox」、「以安裝的附加元件」、「搜尋引擎」)取消選取。如下圖所示:

可是這樣 Firefox 不就不會幫我更新這些東西了嗎?沒關係,讓我們裝上「Update Notifier」來負責這件苦差事:

  • 首先按下「Install Now」來安裝
  • 可憐的你必須重開 Firefox 了!
  • 重開以後,右上角會多出一個小圖示,請你點他一下
  • 按一下「選項」進入設定頁面
  • 於「一般」頁面,將「當 Firefox 啟動時,檢查有無更新檔可用。」取消選取
  • 在「通知」頁面,將「設定 Firefox 多久檢查一次更新。」選取,並依照您雞皮的程度設定每次檢查的間隔時間。
  • 按下「確定」!

這麼一來,每次啟動 Firefox 至少又可以快個 0.5 秒啦!

星期日, 3月 25, 2007

netconsole & syslog-ng

最近我的筆電動不動就 kernel panic,也不知道到底出了什麼問題。想看 backtrace 也不行,因為總是在 X 底下死掉,沒有 console 讓我看 log。而 kernel panic 的時候 print 出來那些東西,也不會跑進 syslog 裡。所以啦,只好讓他 log 到 remote 了...

其實,在 Gentoo 要用 netconsole 是很簡單的。因為是 "NET"console,所以當然會有一台 client 一台 server。首先假設我們的環境看起來像這樣:

  • Server:192.168.1.1:6667
  • Client:192.168.1.99:6665

Client 端(Kernel module 與 cancd)

首先在 client 上,編譯核心的時候,選擇 netconsole 模組(記得選 M 唷!):

  Device Drivers  --->
    Network device support  --->
      <M>   Network console logging support (EXPERIMENTAL)
      [*] Netpoll support for trapping incoming packets
      [*] Netpoll traffic trapping

好啦,雖然我不知道最下面兩個是幹嘛的,不過還是把他們打開吧(反正打開也不用錢...)!順便打開 Magic SysRq:

    Kernel hacking  --->
      [*] Magic SysRq key

編譯並安裝,請把 {N} 替換為您的 cpu core 數量 +1:

# make modules -j{N} && make modules_install

然後,裝上 cancd(CA NetConsole Daemon)...

# emerge cancd -va

設定 /etc/conf.d/netconsole:

# 填入 Server 的 IP,這裡以 192.168.1.1 為例:
TGT_IP='192.168.1.1'

# 與該 IP 對應的 device
DEVICE=eth0

# 如果沒寫的話,會用該 device 的第一個 IP 位置。
# 如果該設備在開機時不會拿到 IP 位置,則您必須在這裡輸入它。
SRC_IP=''

# Client 要使用的 Port,可以隨便給。以下為預設值!
SRC_PORT=6665

# Server 端的 Port,當然要與 Server 上設定的相同
TGT_PORT=6667

# 如果要使用廣播,則輸入 'broadcast'。但是要注意安全性!
# 我們不用,所以就不輸入了...
TGT_MAC=''

# 紀錄的等級,從 [0..7] 分為:
# EMERG, ALERT, CRIT, ERR, WARNING, NOTICE, INFO, DEBUG
# 恩... 我選了 7 (DEBUG)
LOGLEVEL='7'

將 netconsole 加入 default runlevel 並啟動它...

# rc-update add netconsole default
# /etc/init.d/netconsole start

「咦~」您也許會問,「就這樣丟 log 出去不會連線失敗嗎?那 Server 咧?」。別急別急,反正也不會直接有訊息丟出來(唔,如果您很倒楣的,Client 在此時 Kernel Panic 了,那我只能說很抱歉 = =),馬上接著來設定 Server!

Server 端(Syslog-ng)

編輯 /etc/syslog-ng/syslog-ng.conf,「加入」以下設定(別把上面之前的東西刪掉喔,不然本來系統的 log 就不知道要記到哪裡去了 = =):

# 首先是 ip 與 port,如果不知道要改哪裡,
# 請把 Linux 分區 format 掉,去買套 Windows Vista
source net_src { udp(ip(192.168.1.1) port(6667)); };

# 在這裡設定紀錄檔,此以 /var/log/net_msgs 為例。
destination net_msgs { file("/var/log/net_msgs"); };

# 接著是要從哪裡紀錄到哪裡...
log { source(net_src); destination(net_msgs); };

# 如果要順便寫到 tty12,就加入以下這行:
# (一般來說都是 tty12 吧?要看之前上面的設定。)
log { source(net_src); destination(console_all); };

好啦,重新啟動 syslog-ng 吧!用 reload 他就會重新讀取設定檔了,不必用 restart。

# /etc/init.d/syslog-ng reload

測試一下!

恩... 我想,您剛才應該有把 Magic SysRq 打開吧?如果有的話,請在 Client 按下 Alt-SysRq-m,然後去 Server 看一下 /var/log/net_msgs 從 Client 傳來的訊息!

星期六, 3月 17, 2007

如果你想知道磁碟 I/O 到底會拖慢多少啟動程式的速度

那就這麼作吧!

// 首先當然是關掉你要測的那個程式, 別忘了先把重要資料存檔
# killall -9 firefox-bin
// 呼叫 sync 把重要資料寫入硬碟
# sync
// 然後清掉 buffer/cache
# echo 3 > /proc/sys/vm/drop_caches
// 重新啟動(Enjoy the waiting :P )!
$ firefox

星期日, 3月 04, 2007

令我日思夜想的檔案系統

奇怪,怎麼都沒人想到呢?

先前提到說,適當的將檔案系統壓縮,可以提高磁碟的存取效率 - 尤其是 CPU 速度與 IO 速度差很多的時候。雖然沒有完整的數據顯示到底快多少,不過 RANMA K 兄有初步測試過不壓縮與壓縮時的寫入、讀取速度。況且還有個良好的副作用 - 同樣大的硬碟空間裡,可以裝的東西更多了,而且完全不會變重

根據用屁股思考就可以領悟的常識,我們知道:

  1. CPU 的 IO 速度非常快(相對於硬碟)
  2. Disk 的 IO 速度非常慢(相對於 CPU)
  3. 大部分人的 Desktop PC,CPU 使用率並不會常保 100%...
  4. 越大的檔案越有機會產生 Fragmentation,而 Fragmentation 會增加 Seek Time。
  5. 若資料已經壓縮過了,再壓一次只是浪費時間。(呃... 廢話! = =)

所以,希望有一種檔案系統的,會根據檔案的狀態來選擇性的壓縮檔案,大概像這樣:

  1. 首先有個選項來針對檔案設定是否壓縮,例如 compress_attribute:
    • Always:總是壓縮
    • Automatic:根據下述規則決定是否壓縮
    • Never:絕對不要壓縮
  2. 如果檔案太小,就不壓縮。
  3. 如果檔案已經被壓縮過,就不壓縮。例如:
    • 一般壓縮檔:ace, bz2, gz, rar, tbz2, tgz, zip... etc.
    • 壓縮過的多媒體檔案:avi, mpg, mpeg, mp3, wma, wmv... etc.
    • 壓縮過的圖片檔:gif, jpg, mng, png... etc.
  4. 其他還沒想到的規則...

當然,這個檔案系統要有現代檔案系統該有的功能,例如:

  • Journaling
  • Online Repacker
  • POSIX ACL
  • Online resizing (grow and shrink)
  • 其他還沒想到的功能...

如果有相關的資料或論文,還請不吝留個言... 多謝!

星期三, 12月 27, 2006

擠壓你的檔案系統

/***********************************
大肥警告!
Big Fat Warning!

這篇文章裡提到的技術可能讓您的資料爆炸,請斟酌使用!
The techniques introduced in this article may blow your data, use them at your own risk!
***********************************/

最近總覺得硬碟很慢... 應該說,作一些需要磁碟 I/O 的動作的時候,感覺硬碟一直嘎啦嘎啦的上氣不接下氣。所以有了這樣的想法:

  1. 現在 CPU 速度呈指數成長
  2. 磁碟傳輸速度呈線性成長(大部分的瓶頸在磁頭讀寫動作)

既然如此,何不適當的要求 CPU 作多一點計算,減少磁碟 I/O 呢?於是就想到要壓縮檔案系統。

可是... 要怎麼壓縮呢?可以從兩個地方著手:

  1. Loop Device Level:使用如 cloopcompFUSEd 等辦法,在 regular filesystem 的 regular file 上再多加一層間接層來壓縮。
  2. Block Device Level:在 Device Driver 加上一層間接層來壓縮,例如使用 dm-cryptcryptsetup-luks
  3. Filesystem Level:讓 Filesystem Driver 來負責處理壓縮,例如使用 jffs2、ext2compr 或 Reiser4experimental cryptcompress plugin

我的想法是,我是要來增進磁碟效能的,所以不應該搞一大堆間接層來拖慢系統速度,所以 cloop 那種東西就根本不考慮了。後來又想從 Block Device Level 來做的,可是 dm-crypt 與 cryptsetup-luks 非常悲慘,還真的只能作 CRYPTographic,沒辦法做 COMPRESSion。我嘗試用 cryptsetup -c lzf luksFormat 來建立 lzf compressed block device,可是殘念的失敗了 XD~

於是,只好讓 Filesystem 來壓啦!可是 jffs2 的間接更多,必須先有個 loopfile map 到 mtd(Memory Technology Device)上,再 mount mtdblock 來用。處理起來速度比沒壓縮的 ext3 還慢,所以... 還是算了吧!而 ext2compr 這個東西實在太老了,只有在 google 搜尋的時候隱約發現他的蹤跡,可是真的想要找 howto 的時候卻什麼也找不到。所以... 這個也算了吧 = =

最後的救星是 Reiser4 的 Cryptcompress plugin,也是要 patch kernel source,也要升級 reiser4progs。

安裝的方法比想像中簡單的多。首先,你需要一個支援 Reiser4 與 cryptcomress 的 kernel,再來就是支援 cryptcompress 的 {mkfs,fsck,debugfs,measurefs}.reiser4。讓我們從 kernel 開始:

// 如果您已經有裝 app-portage/layman,可以省略這個步驟:
# emerge app-portage/layman
// 如果您已經有加入該 custom-kernels overlay,可以省略這個步驟:
# layman -a custom-kernels
// 最後,這是支援 reiser4 與 cryptcompress 的 kernel:
# emerge sys-kernel/beyond-sources

然後,在 make *config 的時候,把 reiser4 support 打開(廢話!),編譯您的新 kernel,然後用它開機。

再來是 userspace tools - 新版的 reiser4progs。這個我沒有找到任何 overlay 裡面有(其實它也還沒有正式 release),所以先貼在這吧!

# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/reiser4progs/reiser4progs-1.0.5.ebuild,v 1.5 2006/08/20 21:23:43 vapier Exp $

inherit toolchain-funcs

MY_P=${PN}-${PV/_p/-}
DESCRIPTION="reiser4progs: mkfs, fsck, etc..."
HOMEPAGE="http://www.namesys.com/v4/v4.html"
#SRC_URI="ftp://ftp.namesys.com/pub/reiser4progs/${MY_P}.tar.gz"
SRC_URI="ftp://ftp.namesys.com/pub/tmp/cryptcompress/2.6.19-rc4-mm1/${MY_P}.tar.gz"

LICENSE="GPL-2"
SLOT="0"
#KEYWORDS="amd64 ppc ppc64 -sparc x86"
KEYWORDS="~amd64"
IUSE="static debug readline"

DEPEND=">=sys-libs/libaal-1.0.5
       readline? ( sys-libs/readline )"

S=${WORKDIR}/${MY_P}

src_unpack() {
    unpack ${A}
    cd "${S}"
    # bundled libtool sucks, so rebuild autotools #74817
    aclocal && libtoolize -c -f && autoconf && automake || die "autotools failed"
    cat <<-EOF > run-ldconfig
        #!/bin/sh
        true
    EOF
}

src_compile() {
    econf \
        $(use_enable static full-static) \
        $(use_enable static mkfs-static) \
        $(use_enable static fsck-static) \
        $(use_enable static debugfs-static) \
        $(use_enable static measurefs-static) \
        $(use_enable static cpfs-static) \
        $(use_enable static resizefs-static) \
        $(use_enable debug) \
        $(use_with readline) \
        --enable-libminimal \
        --sbindir=/sbin \
        || die "configure failed"
    emake || die "make failed"
}

src_install() {
    make DESTDIR="${D}" install || die
    dodoc AUTHORS BUGS CREDITS ChangeLog NEWS README THANKS TODO
    #resizefs binary doesnt exist in this release
    rm -f "${D}"/usr/share/man/man8/resizefs*

    # move shared libs to /
    dodir /$(get_libdir)
    mv "${D}"/usr/$(get_libdir)/lib*.so* "${D}"/$(get_libdir)/ || die
    gen_usr_ldscript libreiser4-minimal.so libreiser4.so librepair.so
}

把這個檔案放到 /usr/local/portage/sys-fs/reiser4progs/reiser4progs-1.0.6.ebuild,然後...

# cd /usr/local/portage/sys-fs/reiser4progs
# ebuild reiser4progs-1.0.6.ebuild digest
# emerge reiser4progs -va

編完以後,就可以來作新的分割區了!別忘了將各參數改成您的設定。

// 先將檔案備份起來
# cd /
# tar cp /path/to/mounted_dir > /path/to/backup_file.tar
// 卸載檔案系統
# umount /dev/hdXY
// 建立檔案系統(使用 lzo 壓縮演算法)
# mkfs.reiser4 -o create=ccreg40 /dev/hdXY
// 建立檔案系統(使用 gzip 壓縮演算法,較耗費 CPU)
# mkfs.reiser4 -o create=ccreg40,compress=gzip1 /dev/hdXY
// 掛載檔案系統
# mount /dev/hdXY
// 還原備份檔
# cd /
# tar xf /path/to/backup_file.tar
# sync

在 umount 之前可以先 df 紀錄用掉的空間,跟改用 cryptcompress 以後比較看看。我的狀況是 855M 變成 524M,省了 331M 的空間。