2013年9月1日 星期日

jsdx-disk 讓你使用 JavaScript 管理儲存裝置

Standard
Stem OS』是一個 JavaScript 作業系統,內建 Node.js 和許多 JavaScript 的系統 APIs。如果你有在筆者的開發動態,就會發現 Stem OS 是我們 Mandice 團隊目前的開發重點和產品,我們一直期望能讓懂 JavaScript 的人,都可以來開發系統程式、嵌入式系統,此外,也想運用 JavaScript 語言的流行度,讓嵌入式系統開發門檻降低,使其更為簡單、快速。如果你家中有看似沒用的舊電腦,在安裝 Stem OS 之後,便可以立即用 JavaScript 自行寫一些應用程式,賦予這舊電腦全新的用途。還記得,在今年的 OSDC 活動上,小弟上台給了一場 lightening Talk,即是探討如何將舊電腦改造成一個無紙化傳真機,而改造的時間只需要 5 分鐘,包括安裝 Stem OS 和寫幾行 JavaScript 程式。有興趣的人可以參閱當時的投影片『JSDC 2013 簡報釋出!NPK 與 JavaScript OS (Stem) 登場!』。

JavaScript 語言的好處就是用它寫的程式無需編譯,效能也不俗,這意味著,當你在開發 PC 平台之外的嵌入式裝置(如:ARM),你不必再忍受跨平台編譯(cross-compile)的痛苦,可以很快速開發你的應用。此外 Stem OS 已經將系統和硬體的支援都已經為你處理好,也提供許多低階的系統 APIs,且一開機就是跑你的專屬程式,你可以專心的打造自己的嵌入式應用,完全不用再煩腦和花大量時間在系統整合和移植的開發上。

既然 Stem OS 已經將許多系統功能包裝成 APIs,讓 JavaScript 可以透過這些介面從 UI 控制到硬體,代表我們實際上做了很多這方面的準備工作,本文將要提到的 jsdx-disk,便是其中之一。

jsdx-disk 顧名思義是一個控制硬碟的系統 APIs,你可以用他掛載(Mount)、切割磁區(Partition)和格式化(Format)硬碟。更進一步,你可以用他監控系統上的儲存裝置,以及取得這些儲存裝置的硬體資訊,更進一步處理熱插拔(Hotplug)的行為。在 Stem OS 中,我們以 JavaScript 寫了一支常註程式(Daemon),監控熱插拔隨身碟,自動掛載(Automount)的機制,而這功能就是運用了 jsdx-disk。

Git Repository:
https://github.com/cfsghost/jsdx-disk

使用 jsdx-disk 相當簡單,如果不在 Stem OS 上,你也可以透過 NPM 安裝使用:
npm install jsdx-disk

jsdx-disk 的使用方法相當簡單,如果你要掛載一個 Block device:
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        var obj = disk.getStorageObject('Block', 'sdb1');

        obj.mount(function(err, mountPath) {

                if (err) {
                        console.log(err);
                        process.exit();
                        return;
                }

                console.log('It was mounted on ' + mountPath);
                process.exit();
        });
});

如果你要監控儲存裝置的新增、移除等熱插拔機制:
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        disk.on('interfaces_added', function(data) {
                console.log('INTERFACE ADDED: ' + data.objectName);
                console.log(data);
        });

        disk.on('interfaces_removed', function(data) {
                console.log('INTERFACE REMOVED: ' + data.objectName);
                console.log(data);
        });

});

如同開頭所說,jsdx-disk 也有格式化硬碟的 API(注意!請小心執行下面程式,它會格式化 /dev/sdb1):
var Disk = require('jsdx-disk');

var disk = new Disk();

disk.init(function() {

        var obj = disk.getStorageObject('Block', 'sdb1');

        console.log('Formating ...');
        obj.format('ext4', function(err) {

                if (err) {
                        console.log(err);
                        process.exit();
                        return;
                }

                console.log('Done');
                process.exit();
        });
});

更多的功能,可以參考 jsdx-disk 原始程式碼裡的 tests 資料夾,有更多的參考用法。

後記

在台灣創業,開發軟體相較之下比較不易出頭,但我們仍堅持不放棄新創之路,做不一樣的事。我們的團隊雖小,但人人都揮灑著熱情!請支持我們吧!:-)