LinuxでThinkPad X220のBIOSをアップデートする

概要

Linuxを使ってThinkPad X220のBIOSをアップデートできたので方法を説明します。

ThinkPadBIOSをアップデートしようと調べると、Windows用の説明が多く、非Windowsな環境での方法についての説明が少なかったので、参考資料として記録します。

ThinkPad X220 + Arch Linuxでの説明になりますが、他のThinkPadや他のLinuxディストリビューションBSD系でも同様の方法でできると思います。

大まかな流れは次のようになります。

  1. 起動CD用BIOSアップデートユーティリティを入手する
  2. CD用イメージからUSBメモリー用イメージに変換する
  3. USBメモリーで起動してBIOSをアップデートする

1. 起動CD用BIOSアップデートユーティリティを入手する

アップデートしたいBIOSをダウンロードします。このとき必ず「起動CD用」と書かれているものを選んでください。現時点でのThinkPad X220用最新BIOSBIOS アップデート ユーティリティ (起動CD用) (Windows 8 32bit, 64bit/ 7 32bit, 64bit/ Vista 32bit, 64bit/ XP) - ThinkPad X220, X220i, X220 Tablet になります。

2. CD用イメージからUSBメモリー用イメージに変換する

入手したイメージはCD用なので、これをUSBメモリーから起動できるイメージに変換します (CDに書き込んで使う場合はこのままで構いません)。

2-1. 変換する

ここでは変換するためのツールとして geteltrorito.pl を使います。Arch Linuxの場合は次のコマンドでインストールできます。

yaourt -S geteltorito

ダウンロードしたBIOSアップデートユーティリティのファイルが 8duj28jp.iso だとします。これを bios.img というUSB用イメージに変換するには次のように指定します。

geteltorito.pl -o bios.img 8duj28jp.iso

すると次のように表示され、bios.img が作成されます。

Booting catalog starts at sector: 20 
Manufacturer of CD: NERO BURNING ROM
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 63488 sector(s) of 512 Bytes

Image has been written to file "bios.img".

2-2. USBメモリーのデバイス名を調べる

USBメモリーを差し込みます。もし自動マウント(中身が表示できる状態)になったらマウントを解除してください。

USBメモリーのデバイス名を調べます。たとえばUSBメモリーを差し込んだすぐ後にシェルから次のように入力すると表示されていることがあります。

dmesg | tail

結果

[  314.012890] scsi host6: usb-storage 2-1:1.0
[  314.013209] usbcore: registered new interface driver usb-storage
[  314.022851] usbcore: registered new interface driver uas
[  315.016847] scsi 6:0:0:0: Direct-Access     Generic  Flash Disk       8.07 PQ: 0 ANSI: 4
[  315.019114] sd 6:0:0:0: [sdb] 62566400 512-byte logical blocks: (32.0 GB/29.8 GiB)
[  315.019789] sd 6:0:0:0: [sdb] Write Protect is off
[  315.019796] sd 6:0:0:0: [sdb] Mode Sense: 23 00 00 00
[  315.020531] sd 6:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[  315.024735]  sdb: sdb1
[  315.026904] sd 6:0:0:0: [sdb] Attached SCSI removable disk

この場合、デバイス名は sdb です。

バイス名を間違えると使用中の HDD の内容を壊したりしてしまいますので十分に注意してください。

2-3. USBメモリーに書き込む

dd コマンドで先ほど作成した bios.img をUSBメモリーに書き込みます。管理者権限で以下を実行します。

dd if=bios.img of=/dev/デバイス名 bs=512k

私の環境ではデバイス名は sdb だったので以下のように実行しました。

dd if=bios.img of=/dev/sdb bs=512k

結果

62+0 レコード入力
62+0 レコード出力
32505856 bytes (33 MB, 31 MiB) copied, 4.40096 s, 7.4 MB/s

3. USBメモリーで起動してBIOSをアップデートする

USBメモリーを挿入したままで再起動します。

ThinkPadの初期画面でF1キーを押してBIOS設定画面に入ります。Startupタブで以下を設定します。

  • UEFI/Legacy Boot: Both
  • UEFI/Legacy Boot Priority: Legacy First

F10キーを押して保存して再起動します。

再びThinkPadの初期画面が表示されるのでF12キーを押してBoot Menuを表示させます。USBメモリーを選んで起動します。USBメモリーは、たとえば「USB HDD: Generic Flash Disk」のように表示されます。

無事にUSBメモリーから起動できるとメニューが表示されますので「システム・プログラムの更新」を選択します。電源ケーブルをつないでいるかなどいくつかの質問がありますので確認しながら進めるとBIOSアップデートが開始されます。

以上でBIOSをアップデートできるはずです。

Puppy Linuxでnmblookupを使う

nmblookupとは

Puppy LinuxからLAN上のWindowsマシンにアクセスしようとする時、IPアドレスが必要になります。
Windowsのマシン名からIPアドレスを探すコマンドがnmblookupです。
しかし、単純にnmblookupを実行しても "name query failed to find name " と表示されてうまく探すことができません。

Puppy Linuxでnmblookupを使うためには、次の2つを実行する必要があります。

  1. ファイアウォールのポートを開く
  2. nmblookupに-rオプションをつけて実行する

1. ファイアウォールのポートを開く

UDPポート137を開きます。

※以下の手順はPuppy LinuxでSambaなどのサービスを提供していない場合の設定です。サービスを提供している場合には、それに応じた設定にする必要があります。なお、現在の設定は/etc/rc.d/rc.firewallの先頭近くに「PERMIT="22/tcp"」のような形で入っています。

1. メニュー → ネットワーク → Linux-Firewall ファイアウォール をクリックします。

2. 「custom」を選び、OKをクリックします。

3. 「other」に "*" マークをつけ、OKをクリックします。

4. テキストボックスに「137/udp」と入力し、OKをクリックします。

5. 「ANY」を選び、OKをクリックします。

6. NOをクリックします。(Puppy Linuxをインターネット接続ルーターにしている場合はYesにします。)

7. テキストボックスを空欄にしたままOKをクリックします。

8. Yesをクリックします。設定がテストされます。「[PASSED]」と表示されればOKです。

9. Yesをクリックします。設定がインストールされます。


2. nmblookupに-rオプションをつけて実行する

端末ウィンドウから「nmblookup -r 」のように実行します。「-r」はポート137を使う指定です。たとえばHOGEという名前のマシンを探す場合には「nmblookup -r HOGE」を実行します。

Puppy LinuxをUSBメモリーにインストールした

Puppy LinuxUSBメモリーにインストールして使い始めました。

USBメモリーにインストールする利点・欠点

  1. 利点
    1. 既存のOS環境を壊さないため気軽に使える
    2. 出先のPCでいつもの環境が使える
  2. 欠点
    1. 一般的に内蔵HDD/SSDに比べてUSBメモリーは読み書きが遅い
    2. 一般的に内蔵HDD/SSDに比べて容量が少ない

Puppy Linuxでは起動時にファイルをUSBからメモリー上に読み込んで動作するため、動作中にUSBメモリーを読み込むことはほとんどなく、読み書き速度はそれほど問題になりません。

また、Puppy Linuxのシステムファイル(ISOファイル)は5.7.1日本語版で134MBなので、2〜4GBのUSBメモリーがあれば余裕で動きます。

インストール方法

USBメモリーへのインストール方法は主に2つあります。

  1. CD-Rなどのメディアでブートし、USBメモリーにインストールする
  2. Windows上からUSBメモリーにインストールする

どちらの方法でインストールしても、ほとんど同じです。(違いがありますが、後述します。)

2の方法はCD-Rなどを作成する手間が必要なく、自分も2の方法でインストールしたため、ここでは2の方法を説明します。

Windows上からUSBメモリーにインストールする

1. ISOファイルを取り寄せる

はじめにインストーラのISOファイルを取り寄せます。私はPuppy Linux 日本語版のページからprecise-571JP.isoをダウンロードしました。

2. UNetbootinを取り寄せる

次に、ISOファイルを書き込むツールであるUNetbootinをダウンロードします。UNetbootin, Universal Netboot Installer プロジェクト日本語トップページ - OSDN

3. UNetbootinを実行し、USBメモリーに書き込む

「ディスクイメージ」欄にISOファイルをドラッグ&ドロップするか、ファイルの場所を指定します。

タイプを「USB ドライブ」、ドライブに実際のUSBドライブ名を指定し、OKをクリックします。

4. USBメモリーから起動する

いちどPCの電源を切り、USBメモリーから起動します。もし内蔵HDDから普段使っているOSが起動してしまった場合には、BIOSの起動ドライブ設定で内蔵HDDよりUSBメモリーの起動順を先にします。

CD-Rなどからインストールした場合との違い

UNetbootinでインストールすると、ファイルがUSBメモリーの直下に展開されます。

CD-Rなどの起動メディアからインストールすると、USBメモリーの中に任意のディレクトリを作り、その中にインストールすることができます。こちらの方法では、複数のバージョンのPuppy Linuxをインストールすることができます。


(UNetbootinでインストールしたときのUSBメモリーの状態。USBメモリーの直下にファイルが展開されている。)

「棒を切る」をErlangで

最強最速アルゴリズマー養成講座:トップクラスだけが知る「このアルゴリズムがすごい」――「探索」基礎最速マスター に出てきた 棒を切る問題 が自力で解けたので、記念にアップします。

毎日お風呂に入りながら考えて2週間くらいかかりました (遅すぎ (^^;))

自分で後で見てコードの意味がわかるように解説:

  • 与えられた最大切断数以下の回数で棒を切る関数cutと、cutを呼び出しながら最適な切断長さを探す関数findでできています。
  • findは長さの上限(H)と下限(L)を持ち、その中央の値(M)でcutを呼び出します。
  • cutの結果、中央の値(M)以上の長さを持つ棒がK本以上あったら、もっと長く取れると判断して下限(L)を中央の値(M)に引き上げます。
  • 反対にK本以上なかったら、もっと短くする必要があると判断して上限(H)を中央の値(M)に引き下げます。

今回の問題で、上限と下限の範囲を狭めて探索していく方法を学びました。あと、Erlangでは変数名を1文字にするとすっきり書けることがわかりました。頭がだいぶ関数型に慣れてきたようです。

分散バージョン管理システムにバイナリファイルを格納した時のリポジトリ増加量

バイナリファイルを格納・修正した時の分散バージョン管理システム(DVCS)のリポジトリ増加量について調べてみました。

使ったDVCSのバージョンは次の通りです。すべてWindows 32bit版です。

  • Bazaar … TortoiseBazaar 0.6.6 (Bazaar 2.5.1)
  • Git … Git 1.7.11-preview20120710
  • Mercurial … TortoiseHG 2.7.1 (Mercurial 2.5.2)

これらのDVCSを使って以下の操作を実行しました。

  1. リポジトリの作成
  2. バイナリファイルの追加
  3. バイナリファイルの一部を修正してコミット
  4. バイナリファイルの一部を修正してコミット
  5. git gcをかける

バイナリファイルとしてExcelのドキュメント(.xls)を使用しています。ファイルの初期容量は7,806,976バイトです。

それぞれの操作をしたときのDVCSの管理ディレクトリの容量は次のようになりました。(単位は Bytes)

操作 Bazaar (.bzr) Git (.git) Mercurial (.hg)
1 リポジトリの作成 36,864 61,440 8,192
2 バイナリファイルの追加 7,151,616 7,217,152 7,143,424
3 バイナリファイルを修正 14,262,272 14,352,384 7,262,208
4 バイナリファイルを修正 21,375,488 21,490,176 7,378,766
5 git gc 21,375,488 7,297,536 7,378,766

この結果から、バイナリファイルの場合の動作は次のようになっていると推察されます。

  • Bazaar … 各コミットの差分を取らずに丸々格納します。
  • Git … 通常は各コミットの差分を取らずに丸々格納し、git gcを実行することで差分に変換します。参考: Git - パックファイル
  • Mercurial … 各コミットの差分を格納します。

「ビットあみだくじ」をErlangで

趣味と勉強を兼ねて「ビットあみだくじ」(http://nabetani.sakura.ne.jp/hena/ord11bitamida/)をErlangでやってみました。

以下のソースをba.erlというファイルに保存し、Erlangのコンソールから「c(ba).」「ba:tests().」で実行できます。


1> c(ba).
{ok,ba}
2> ba:tests().
d6-7b-e1-9e -> 740631825, true
6f-dd-ff-ff -> 230685147, true
ok

「逆FizzBuzz」をErlangで

趣味と勉強を兼ねて「逆FizzBuzz」(d:id:matarillo:20120515)をErlangでやってみました。

以下のソースをifb.erlというファイルに保存し、Erlangのコンソールから「c(ifb).」「ifb:sample().」で実行できます。


1> c(ifb).
{ok,ifb}
2> ifb:sample().
[fizz] -> [3]
[buzz] -> [5]
[fizz,buzz] -> [9,10]
[buzz,fizz] -> [5,6]
[fizz,buzz,fizz] -> [3,4,5,6]
[fizz,fizz] -> [6,7,8,9]
[fizz,fizz,buzz] -> [6,7,8,9,10]
[fizz,fizzbuzz,fizz,buzz] -> [12,13,14,15,16,17,18,19,20]
[buzz,fizz,buzz] -> error
ok