とあるエンジニアの備忘log
2016年11月18日金曜日
ルーティングテーブル設定 (with DHCP)
ネットワークカード 3枚刺ししてて、そのうち 2つは DHCP。 この状況で所望のルーティングを行わせるにはどうやったらいいものか、 とゴチャゴチャいじくってるうちに、できたっぽい方法をとりあえずメモ。(Ubuntu 16.04) - enp1s0: (DHCP) (192.168.240.x) - enp3s0: (static route) (192.168.11.x) - enp4s0: (DHCP) (10.x.x.x) 指定されたもの以外は全部 enp1s0 にルーティングして欲しい場合。`x` 部分は適宜自分の環境に合わせる。 `/etc/network/interfaces` に以下を追加。 auto enp4s0 iface enp4s0 inet dhcp post-up route del default dev enp4s0 post-up route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.x.x.x metric 1 auto enp3s0 iface enp3s0 inet static address 192.168.11.x netmask 255.255.255.0 gateway 192.168.11.x post-up route del default dev enp3s0 全部 static の時は `/etc/network/if-up.d/static-routes` でうまくいったっぽいが、 DHCP が絡むとうまく行かず。結局、`/etc/network/interfaces` の中で `post-up` の後ろで `route add/del` で足し引きするとなんかうまくいった。 もっとクールなやり方ありそうですが。。
自分的 Ubuntu 16.04 LTS を入れて最初にやること
Ubuntu 16.04 インストールした時の覚え書き。自分用。 #### パッケージのインストール #### `sudo apt-get install` でパッケージインストール。 - synaptic - apt-file - gnome-session-flashback # Unity の代わりに Metacity - gnome-tweak-tool # swap Ctrl and Caps Lock - emacs - emacs-goodies-el # for color-theme - git - gitk - git-email # for git send-email - cvs subversion git-svn # 最近使わないのでいらないか - ccache - fcitx-mozc - emacs-mozc - global - chromium-browser - indent - manpages-ja # 日本語 man 見たいとき LANGUAGE=ja man
- virtualbox - virtualbox-guest-additions-iso - ckermit - coccinelle - flex bison - nkf - libc6-i386 # for 32bit programs - ssh # ssh server - device-tree-compiler # dtc for building U-Boot - gimp - u-boot-tools # for mkimage - texlive-full #### Unityを やめる #### $ sudo apt-get install gnome-session-flashback でインストールした後、いったんログアウトし、 GNOME Flashback (Metacity) でログインし直す。 #### Ctrlキー入れ替えなど #### $ sudo apt-get install gnome-tweak-tool として `System Tools` -> `Preferences` -> `Tweak Tool` を開き、 `Typing` -> `Ctrl key position` で `Swap Ctrl and Caps Lock` を選択。 いったんログアウトする。 #### 日本語入力設定 #### 最初のインストール時に、英語、英語キーボードを選択したとする。 $ sudo apt-get install fcitx-mozc としたあと、`System Tools` -> `System Settings` -> `Language Support` を開き、 `Keyboard input method system` を fcitx に。 `System Tools` -> `Preferences` -> `Fcitx Configuration` を開く。 `Input Method` タブは - Keyboard-English (US) - Mozc にする。 Mozc は `+`ボタンを押して `Only Show Current Language` のチェックを外すと出てくる。 `Global Config` のタブで `Show Advance Option` をチェック。 `Activate input method` と `Inactivate Input Method` に Mozc を ON/OFF するキーを設定。 `Trigger Input Method` に `Ctrl+Space`というのが入っているが、これは消す。(Escapeを押す)。 消しておかないと emacs で `Ctrl+Space` (region選択開始)が使えない。 ### Emacs で Solarized 使う ### $ sudo apt-get install emacs-goodies-el で color theme を使えるようにしておき $ git clone git://github.com/altercation/solarized.git ~/ref/solarized で solarized を取得。 `~/.emacs` に以下を追加。 (load-file "~/ref/solarized/emacs-colors-solarized/color-theme-solarized.el") (when (require 'color-theme-solarized) (color-theme-solarized-light)) #### スペルチェッカー #### aspell はデフォルトで入ってる?っぽい。 `~/.aspell.conf` に以下の一行追加。 lang en_US nano から起動するために、 `~/.nanorc` に以下を追加。Ctrl-t で起動できる。 set speller "aspell -x -c" emacs は `M-x ispell-buffer` で起動できる。 #### ssh X forwading #### X で ssh を乗り越えさせる。 ssh クライアント (Xサーバー)側の設定: `/etc/ssh/ssh_config` を開き ForwardX11 no を ForwardX11 yes に変更。 ssh サーバー (Xクライアント)側の設定 (`sudo apt-get install ssh` でインストール必要): `/etc/ssh/sshd_config` を開き ForwardX11 yes になっていることを確認。(たぶんデフォルトでそうなっている。) #### dot ファイル復元 #### ホームディレクトリの dot ファイルを別 PC から復元する。 - .profile - .bashrc - .bash_aliases - .aspell.en.pws # aspell 辞書 - .aspell.en.prepl # aspell 辞書 - .gitconfig # git - .emacs # emacs - .nanorc # nano - .kermrc # kermit - .buildman # U-Boot buildman - .patman # U-Boot patman - .gnupg # GPG - .ssh # if necessary - .pwclientrc # pwclient - .quiltrc # quilt
2016年3月6日日曜日
GPG key sign 備忘録
この度、わけあって GnuPG というものを使い始めたので、鍵の生成から、Key Sign までやったことを、将来の自分のために書き留めておきます。多分すぐに忘れてしまうので。 ### 背景を理解する ### 「GPG とはなんぞや」とか、「公開鍵暗号とは?」みたいな初歩的な話から、「なんで Key Sign みたいな面倒なことをやるの?」とか 「どうして署名用と暗号化用とで複数のキーペアに分かれているの?」みたいな疑問を解決するには本家のドキュメントがおすすめ。 英語ですが、私は [The GNU Privacy Handbook](https://www.gnupg.org/gph/en/manual.html) はなかなかわかりやすかったと思います。 ### Key の生成 ### $ gpg --gen-key で鍵を生成する。いくつかの質問を聞かれる。 鍵の種類はデフォルトの (1) RSA and RSA (default) を選択。Master (署名用) と Sub (暗号化用) で鍵が2ペアできる。 キーサイズと、有効期限については、その人の Paranoid 具合によってデフォルトのままでよいという人もいるし、変更するという人もいる。とりあえず自分は 4096ビットで 5年 を選択した。あとは、本名とメールアドレスを入力する。パスフレーズは(空にもできるが)必ず設定しておく。乱数を生成するためにいろいろ動かしてと言われた後、鍵を生成してくれる。 忘れないうちに $ gpg --output revcert.asc --gen-revoke
で、失効証明書を作成しておく。(秘密鍵が盗まれたり、パスフレーズを忘れたりしたりした時に、鍵を失効させるのに使う。) `
` の部分は、鍵の生成時に入れた本名やメールアドレスの一部を入れればよい。 `revcert.asc` と `~/.gnupg` 以下を CD-R に焼いて大切に保管しておく。 ### 公開鍵を Key Server に上げる ### キーサーバーに上げる前に、マニュアルとか見ながら触ってみて、gpg の操作に慣れておく。キーサーバーに上げる前ならば、最悪失敗してもキーの生成からやり直せばいいので、いろいろ試してみる。 満足したらキーサーバー(公開鍵の配布を容易にしてくれるサーバー)に上げる。いったんアップロードするとやり直しが効かない(鍵を失効させるしかない)ので、本名やメールアドレスが間違ってないか今一度確認しておく。 $ gpg --keyserver pgp.nic.ad.jp --send-keys
でアップロードする。自分は `pgp.nic.ad.jp` を使ったが、キーサーバーはお互いに同期しているので、どのキーサーバーに上げてもよい。 例えば、 [http://pgp.nic.ad.jp/pgp/pks-commands-e.html](http://pgp.nic.ad.jp/pgp/pks-commands-e.html) みたいなページに行って `Search String` のところに自分のメールアドレスを入れてみれば、自分の公開鍵が出てくる。 ### Signing Party ### PGP(GnuPG) の中で一番アナログな部分が Signing Party という工程です。 その公開鍵が間違いなくその本人のものであることを確認しなくてはなりません (悪意を持った人が、その人の名を語ってなりすましている可能性があるため)。 本人確認は、身分証(パスポートなど)を見せて対面で行い、その際に、fingerprint を渡します。 自分の鍵の fingerprint を $ gpg --fingerprint で表示し、あらかじめ印刷しておくのがよいです。 紙に印刷していない場合は、端末に表示させたものを相手にカメラなどで撮ってもらう。 ### 相手の鍵に署名 ### Signing Party が終わった後は、相手の鍵に対して、自分の鍵で署名します。 相手の鍵をキーサーバーから取ってきて、fingerprint が一致するのを確認し、署名します。 署名後に、相手の鍵を勝手にアップロードするのはマナー違反とのことなので、メールで相手に送ってあげます。 その際、相手にしか復号できないように暗号化し、署名して送信、とこれを毎回手動でやるのは大変だ、というわけで それを手助けする caff というツールがあるようです。 ### postfix のセットアップ ### caff はメールの送信までやってくれますが、それにはローカルに SMTP を立てておく必要があるので、 まずそれをやります。普段は Gmail を使っているので、Gmail にリレーさせる方法をとった。 $ sudo apt-get install postfix sasl2-bin 途中で出てくる質問には `Internet Site` を選ぶ。 `/etc/postfix/main.cf` に以下を記載。 relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_password smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_sasl_mechanism_filter = plain smtp_use_tls = yes `/etc/postfix/sasl_password` に [smtp.gmail.com]:587
@gmail.com:
を記載する。 2段階認証を利用していない場合は `
` の部分は、Gmail に使っているパスワードでよい。 2段階認証を利用している場合は、Google の 「アカウント」、「ログインとセキュリティ」、「アプリ パスワード」とたどり、アプリパスワードというのを生成し、それを `
` の部分に書く。 $ sudo chmod 600 /etc/postfix/sasl_password $ sudo postmap /etc/postfix/sasl_password $ sudo service postfix restart としたあと、以下で動作確認。 $ mail -s
### caff ### $ sudo apt-get install signing-party でインストール。 $ caff を実行すると `~/.caffrc` という設定ファイルができる。 大抵は、うまく設定してくれているが、複数の鍵を持っている場合などは修正が必要かもしれない。 最低でも、以下の3項目は正しくなっていることを確認。 $CONFIG{'owner'} = 'Masahiro Yamada'; $CONFIG{'email'} = 'yamada.masahiro@socionext.com'; $CONFIG{'keyid'} = [ qw{3D8B01079DE0DB06} ]; `owner` と `email` はメールの送信元になる。`keyid` は fingerprint の下16桁。 あとは $ caff
で全部やってくれる。 `
` は相手の fingerPrint の下8桁を入力。 相手の鍵に、複数の User ID が紐付いているときは、 Really sign all user IDs? (y/N) と聞いてくる。全部の User ID に対して署名する場合はそのまま `y` と答える。 一部の User ID にのみ署名したい場合は、いったん `n` と答えて、 `uid 2` みたいに番号を指定してから `sign` と打つ。 Really sign? (y/N) に `y` と答えたあと、`save` と打つ。 最後にメールで送るかどうか聞いてくるので `y` と答える。 ### サインしてもらった key の取り込み ### 相手も caff を使っていると添付ファイルが 2個ついてメールが送られてくる。 $ gpg -o key --decrypt msg.asc $ gpg --import key $ gpg --keyserver pgp.nic.ad.jp --send-key
で OK。
2015年10月19日月曜日
ELCE 2015 in Dublin
今年も [Embedded Linux Conference Europe](http://events.linuxfoundation.org/events/embedded-linux-conference-europe) に行ってきました。 今年の開催地はアイルランドの首都ダブリンでした。 会場の外の景色は、近年の ELCE で一番美しかったと思います。斜めの円筒形に見えるのか会場。 [![Dublin](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGCmTfG0ddMSfzl1akUuYRIKmmdO25nQC8OB5g6DBtR3FCPVrOdzbkVZ4rYKkZtwQuHHS7lbAaX5sWdQsQ8YO3YAWHTZCrsf30azIc5Nak26oSK3ElhvdPvVXpvX3fxXmiW6CgZIRufyU/s320/dublin.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGCmTfG0ddMSfzl1akUuYRIKmmdO25nQC8OB5g6DBtR3FCPVrOdzbkVZ4rYKkZtwQuHHS7lbAaX5sWdQsQ8YO3YAWHTZCrsf30azIc5Nak26oSK3ElhvdPvVXpvX3fxXmiW6CgZIRufyU/s1600/dublin.jpg) 会場の Convention Centre Dublin。ユニークな形です。 [![Convention Centre Dublin](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh0uc4RGw4fRls0n4v_XZjAjDatW6aOq7VCKmPbpBHYTpEICvwqS8sHJv3IT8kmC4cHa2r25EdWg_cJQ4-8q-W-lkwoqkTPMaJYJLHs-UOLv8-iS_G4zcUBOTZ6P7DE2-W0YrU3eBsxgg/s320/ccd.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh0uc4RGw4fRls0n4v_XZjAjDatW6aOq7VCKmPbpBHYTpEICvwqS8sHJv3IT8kmC4cHa2r25EdWg_cJQ4-8q-W-lkwoqkTPMaJYJLHs-UOLv8-iS_G4zcUBOTZ6P7DE2-W0YrU3eBsxgg/s1600/ccd.jpg) [![Welcome Board](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAf7fjtnzu3vbMFTBVr7k_IdU-jKBOzULNXjFFG5nlJfnjcenEzNI1swrLIrjSde0Nk4cpzRJwd-RBEaBVykbWhAiJnUvnqmassVcWUFUieTVEAcZ3INPKGSQRZ7tg6n6p8RS3vf6HXAw/s320/welcome.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAf7fjtnzu3vbMFTBVr7k_IdU-jKBOzULNXjFFG5nlJfnjcenEzNI1swrLIrjSde0Nk4cpzRJwd-RBEaBVykbWhAiJnUvnqmassVcWUFUieTVEAcZ3INPKGSQRZ7tg6n6p8RS3vf6HXAw/s1600/welcome.jpg) アイルランドのシンボルカラーの緑に合わせてか、今年のテーマカラーは緑のようです。 [![Opening](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXxT7X3OHjl3A9bfH4bLjYod0Eqvft9mnoeOg_i-32S6ACtzfPXylqjbsr34PMV5752tep1RmikAyCDWsK9riW_nQavuECSuVZ1KPaG0jkeSRfn0FOl5aBZddm2XWO3pmpuujtjLbAqDs/s320/opening.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXxT7X3OHjl3A9bfH4bLjYod0Eqvft9mnoeOg_i-32S6ACtzfPXylqjbsr34PMV5752tep1RmikAyCDWsK9riW_nQavuECSuVZ1KPaG0jkeSRfn0FOl5aBZddm2XWO3pmpuujtjLbAqDs/s1600/opening.jpg) 今年も [U-boot Mini Summit](http://www.denx.de/wiki/U-Boot/SummitELCE2015) やってました。内容がマニアック過ぎて、 BoF (Birds of a Feather)の様相を呈していましたが。 [![U-boot Mini Summit](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PmMhazteaZSsJUav1IwWVMDkgJdQLMWTUzIXg5paB7XcJYss-XO1UTRpxo7QQTxLLqjxhLRroJGpu27imk_i59Y9O0_Ymh5mYGWeHeXDZXd8GJ5yXKzPuNtLvOU4M9hK8wTJPkgZ-LE/s320/uboot_summit2015.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PmMhazteaZSsJUav1IwWVMDkgJdQLMWTUzIXg5paB7XcJYss-XO1UTRpxo7QQTxLLqjxhLRroJGpu27imk_i59Y9O0_Ymh5mYGWeHeXDZXd8GJ5yXKzPuNtLvOU4M9hK8wTJPkgZ-LE/s1600/uboot_summit2015.jpg) 夜はパブで U-boot メンバーの飲み会。 [![U-boot Guinness Summit](http://3.bp.blogspot.com/-XGCzolTLiZQ/VhLwg7NHcfI/AAAAAAAASsE/FwzmwnoJccs/s320/uboot_guinness_summit2015.jpg)](http://3.bp.blogspot.com/-XGCzolTLiZQ/VhLwg7NHcfI/AAAAAAAASsE/FwzmwnoJccs/s1600/uboot_guinness_summit2015.jpg) アイルランドと言えば、このビール。個人的にはあまり好きな味ではないんですが(黒ビール自体も)。「カァァー」というのどごしがなくて、「へな〜」としてます。アサヒスーパードライの方がはるかに美味しいぞ。 [![Guinness](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEs8pAB6vuaFMyLP5qGN8CN_E0TXjbMuEcBc72yRYrj5GT7S7ODc4PW_XsB-4E9D1TMcoRLzgV3je-OnhxZz_WeB1wBYDrP4_MzZ3g_GG5bTKdX35AP65hGTEc6Gzzh9R1gw8wAqTGmdo/s320/guinness.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEs8pAB6vuaFMyLP5qGN8CN_E0TXjbMuEcBc72yRYrj5GT7S7ODc4PW_XsB-4E9D1TMcoRLzgV3je-OnhxZz_WeB1wBYDrP4_MzZ3g_GG5bTKdX35AP65hGTEc6Gzzh9R1gw8wAqTGmdo/s1600/guinness.jpg) I2C サブシステムのメンテナーによるのプレゼン。これ見て、自分のドライバにも Slave モード実装してみるか。 [![I2C slave](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1tLMEdSdB87_OGLkS92pmPqbQGfbrwrwwP_WNegfoEURv_pIYio28sMeT1BeqKDCshZ3i2aeECDPnMjjDQdzg9IGQOXEQxoQ_udaAGlo8YSaqTqHNBRafhhvYSAS5pgQJZgsIhZRwhs/s320/i2c_slave.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1tLMEdSdB87_OGLkS92pmPqbQGfbrwrwwP_WNegfoEURv_pIYio28sMeT1BeqKDCshZ3i2aeECDPnMjjDQdzg9IGQOXEQxoQ_udaAGlo8YSaqTqHNBRafhhvYSAS5pgQJZgsIhZRwhs/s1600/i2c_slave.jpg) 2日目は Linus も登場。"いつもの" 2人 (スキューバダイビング仲間)によるチャット。 [![Linus Chat](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg49MP5OVP-gK-yBb41sa9BZ_hIyRuaeuIpV3ffcWWLngRk5VVfdKxklIrvd9zuIr9_clNy0il9YcVgUKO68aUniEjq7OW0PjUNS8U2DGmMIF4OTn5t6FXz7I4Elnfz1mlWBbQ3BldNAm8/s320/linus_chat.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg49MP5OVP-gK-yBb41sa9BZ_hIyRuaeuIpV3ffcWWLngRk5VVfdKxklIrvd9zuIr9_clNy0il9YcVgUKO68aUniEjq7OW0PjUNS8U2DGmMIF4OTn5t6FXz7I4Elnfz1mlWBbQ3BldNAm8/s1600/linus_chat.jpg) Closing Game。Rock, Paper, Scissors, Lizard, Spock。勝ったのかどうかわからん。。 [![Close Game](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0kgfOjt0_wGi3f3cK79ZIIC08R8Di8YzQWFowQiMp5N9yW8Xw49s3RpXan3hSPvmrfgZiY9D92HDV04l7irccGFRs8ughK0M0Z4WGExMe_re3nEfTFPyUgaIPlPozqoKxWehLKYqRb38/s320/closing_game.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0kgfOjt0_wGi3f3cK79ZIIC08R8Di8YzQWFowQiMp5N9yW8Xw49s3RpXan3hSPvmrfgZiY9D92HDV04l7irccGFRs8ughK0M0Z4WGExMe_re3nEfTFPyUgaIPlPozqoKxWehLKYqRb38/s1600/closing_game.jpg) Guinness Storehouse というところで、Reception Event。Guinness のできるまでを見学しながら、どんどん上に上がっていきます。 [![Guinness Storehouse](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj41dSeg6fclgVtC9aKCXIzNcQk7-rfD3gnygmf8OvgGpBoIeX7TvCsoGBep_X9b2_xuGmd-kJY7RVAkS3stBJSwnUZ6KXjrh9rKBSfD5rAf9QlPSPgS2YS4pR4E8zzNGQ2vL2w3CDfzUg/s320/guinness_house.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj41dSeg6fclgVtC9aKCXIzNcQk7-rfD3gnygmf8OvgGpBoIeX7TvCsoGBep_X9b2_xuGmd-kJY7RVAkS3stBJSwnUZ6KXjrh9rKBSfD5rAf9QlPSPgS2YS4pR4E8zzNGQ2vL2w3CDfzUg/s1600/guinness_house.jpg) 最上階がバーになっています。 [![Closing Reception](http://4.bp.blogspot.com/-D0nhpTGSzYo/VhWa2lyijNI/AAAAAAAASts/K0EZROK_fOc/s320/closing_reception.jpg)](http://4.bp.blogspot.com/-D0nhpTGSzYo/VhWa2lyijNI/AAAAAAAASts/K0EZROK_fOc/s1600/closing_reception.jpg) 自分で Guinness を注ぎます。 [![Guinness Server](http://1.bp.blogspot.com/-Ghvop4_WhI0/VhWavxO0enI/AAAAAAAAStI/4QOwG2Ykr40/s320/serve_beer.jpg)](http://1.bp.blogspot.com/-Ghvop4_WhI0/VhWavxO0enI/AAAAAAAAStI/4QOwG2Ykr40/s1600/serve_beer.jpg) 今年の T シャツ。 [![T-shirt](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbH7HSHFnoR4slSgeqVc3URfcqX6hdqNv4cBfp3xkyxe8nJszsqpaLwerdwtkV-HMhu_cSvxvS6C679q4dD7tOyaxyW8OANf6IpPSOa5ythRiYqpBjakndvF84xLMSsuBcDSgQKHllLj0/s320/elce_shirt2015.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbH7HSHFnoR4slSgeqVc3URfcqX6hdqNv4cBfp3xkyxe8nJszsqpaLwerdwtkV-HMhu_cSvxvS6C679q4dD7tOyaxyW8OANf6IpPSOa5ythRiYqpBjakndvF84xLMSsuBcDSgQKHllLj0/s1600/elce_shirt2015.jpg)
2015年6月6日土曜日
LinuxCon Japan 2015
6月3-5日に LinuxCon Japan 2015 に行ってきました。 [![Keynote](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLDizobXv6tYTeN_6QNNfiQL89jEmBkxy-i1IUaPWt6QeebLlpioEdG9aIq9200YRpIYh4Q0JVyw5LlxWTjezWHmk-fSVgkUAK-JzMRtxfJqxDCqeI7PJ2jqtAry58w2jMP4vl2ZQLZ4Q/s320/lcj2015_keynote.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLDizobXv6tYTeN_6QNNfiQL89jEmBkxy-i1IUaPWt6QeebLlpioEdG9aIq9200YRpIYh4Q0JVyw5LlxWTjezWHmk-fSVgkUAK-JzMRtxfJqxDCqeI7PJ2jqtAry58w2jMP4vl2ZQLZ4Q/s1600/lcj2015_keynote.jpg) [![Penguin](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk3Hat53x6klA-UCj1EVDM8bdWFPjKOVSkaI_vCW1TuoTVhI3pAnHBRnonvPOjqHoyLFkavsR3KXzYZb0YbfPKAeJ5zz3en-KfBzczyWS2dq3VMgDRwUJj0-_MwBz24ghEcrNDyiwZ29I/s320/lcj2015.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk3Hat53x6klA-UCj1EVDM8bdWFPjKOVSkaI_vCW1TuoTVhI3pAnHBRnonvPOjqHoyLFkavsR3KXzYZb0YbfPKAeJ5zz3en-KfBzczyWS2dq3VMgDRwUJj0-_MwBz24ghEcrNDyiwZ29I/s1600/lcj2015.jpg) 興味深いプレゼンもいろいろと聞けました。 以下は SH2 互換チップをオープンソースな RTL で再実装し、 Xilinx の安い FPGA で動かして、 Linux まで走らせました、というもの。 セガサターンにも使われた SH2 ですが、パテント切れで面白いことができるようになってて、 FPGA にも入る規模です。 個人的には 10年前に出た 1チップ MSX も思い出して、ノスタルジックな気持ちになりました。SuperH を設計したアーキテクトが Hitachi 退職後にやっていて、なかなか楽しそうな内容です。 [![SH2](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFUoo8K2Z7AhqSs_yJWTye0l0wwNLyO-RZUmqWEHUCy1xezHg1RWD7VmzzYdgIKh5qzgge3h6Wm0sBH3V0CmBJvL-9CuueXZj-qq3xrHTB84M6i4R65G2L9MW2PV87vDHRL4jklB-4nxM/s320/sh2.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFUoo8K2Z7AhqSs_yJWTye0l0wwNLyO-RZUmqWEHUCy1xezHg1RWD7VmzzYdgIKh5qzgge3h6Wm0sBH3V0CmBJvL-9CuueXZj-qq3xrHTB84M6i4R65G2L9MW2PV87vDHRL4jklB-4nxM/s1600/sh2.jpg) Linux 以外の話題では git の内部設計についての解説とか。 Junio C Hamano さんの入門本にも書いてたので、だいたい知ってる内容ですが。 [![git](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_-BQgzNX90WQXbaeUPlQIOM76BGn7nL9B8BFPpHtxNzCCRskGxx2YMS2uaresMQ7aff9G2i9Jiac6cXW6NJYJ8t9wMktLfkH7r4H_O5VwjD2vPNOnCTM6XZeUbTCY6SkAMvDx-J5mB_A/s320/git.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_-BQgzNX90WQXbaeUPlQIOM76BGn7nL9B8BFPpHtxNzCCRskGxx2YMS2uaresMQ7aff9G2i9Jiac6cXW6NJYJ8t9wMktLfkH7r4H_O5VwjD2vPNOnCTM6XZeUbTCY6SkAMvDx-J5mB_A/s1600/git.jpg) 夜は当然のごとく飲み。 [![BeerCon 2015](http://4.bp.blogspot.com/-sdapUJsg2CU/VXBvMAS5wFI/AAAAAAAAQlQ/e9lVBhBJI8g/s320/beercon2015.jpg)](http://4.bp.blogspot.com/-sdapUJsg2CU/VXBvMAS5wFI/AAAAAAAAQlQ/e9lVBhBJI8g/s1600/beercon2015.jpg) 今年の Tシャツ。 [![T-shirt](http://2.bp.blogspot.com/-xlLQ4AvQLkU/VW5I80WoU_I/AAAAAAAAQig/71RwMgwxZi0/s320/lcj2015_shirt.jpg)](http://2.bp.blogspot.com/-xlLQ4AvQLkU/VW5I80WoU_I/AAAAAAAAQig/71RwMgwxZi0/s1600/lcj2015_shirt.jpg) さらに Booth Crawl でも Tシャツ貰ったり、プレゼンでいろいろ質問したら Raspberry Pi の Tシャツも貰えた。 Xen (右下) のTシャツは普段使いできそうなデザインです。さすがに Fujitsu のは部屋着にしか使えん。 [![T-shirt](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo3qp8u-mGMJedl6lyAejBwws7gKQzpTqGoYsynpLG-antDhZPNm7fCfdTn7PeWjpt83zNA9MxP8_gASLbUlKuMOMzzUMkSEUydrj-7cicf1Dp9IN7nb7UvVzy0FmuQvBpkqLBinx3reo/s320/lcj2015_shirts3.jpg)](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo3qp8u-mGMJedl6lyAejBwws7gKQzpTqGoYsynpLG-antDhZPNm7fCfdTn7PeWjpt83zNA9MxP8_gASLbUlKuMOMzzUMkSEUydrj-7cicf1Dp9IN7nb7UvVzy0FmuQvBpkqLBinx3reo/s1600/lcj2015_shirts3.jpg) 自分にとっては、プレゼンを聞きに行くだけではなくて、 普段メーリングリストでやり取りしている人とのオフ会としての意味もあるカンファレンスです。 友人と再会したり、新たに友達もできたり、非常に有意義な時間でした。
2015年5月31日日曜日
自分的 Ubuntu 14.04 LTS を入れて最初にやること
先日、PC を新調したので、Ubuntu 14.04 LTS 入れました。 最新のインストールイメージは 14.04.2 になっていました。LTS だと安心感があります。 とりあえず、自分好みの設定を、何かあった時のために、未来の自分のためにメモっておきます。(半年前の自分は、もはや他人ですので。。) #### マシン名を決める #### 設定とは直接関係ないのですが、最初にやらなくてはいけないこと、それは PC に名前をつけることです。 インストーラーが、masahiro-All-Series みたいにデフォルトで名前をつけてくれるが、これは味気ない。 自分の場合は、 Linux デスクトップ、Linux ノート、Windows デスクトップ, 実験用の板コン、VirtualBox 上の仮想PC など、いくつもの PC が稼働しており、PC も数年おきに新調するので、名前を毎回考えなくてもいいように、機械的なネーミングスキームが必要です。 しかも人間(自分)にとって覚えやすいものでなくてはならない。 そこで、 自宅のPC には昔から Sesame Street のキャラクター名をつけることにしている。 歴代愛機には elmo, cookie, bigbird, oscar, ernie, zoe, bert みたいな感じで名前をつけていた。 今回は "grover" と名付けることにした。 まだまだキャラクターがいるので、当面名前に困ることはないだろう。 自宅の LAN で勝手にやっているだけなので、権利関係で怒られることもないでしょう。 ちなみに、会社で自分が管理している PC は beagle, poodle, spitz, pug のように犬種名を付けて行っています。 ちなみにちなみに、Debian の コードネームは Toy Story のキャラクター名を付けて行っていますね。 #### パッケージのインストール #### `sudo apt-get install` でパッケージをインストールしていく - synaptic - apt-file - gnome-session-flashback # 以下 Unity やめる参照 - gnome-tweak-tool # swap Ctrl and Caps Lock - emacs - emacs-goodies-el # for color-theme - git - gitk - git-email # for git send-email - cvs subversion git-svn # 最近使わないのでいらないか - ccache - fcitx-mozc # 以下 「日本語変換設定」参照 - emacs-mozc - global - chromium-browser - indent - manpages-ja # for 日本語 man - libncurses5-dev # for Linux make menuconfig - virtualbox - virtualbox-guest-additions - ckermit - nkf - libc6:i386 libcurses5:i386 libstdc++6:i386 # for 32bit programs - ssh # ssh server - device-tree-compiler # dtc for building U-Boot - gimp - u-boot-tools # for mkimage - texlive-full #### Unityを やめる #### $ sudo apt-get install gnome-session-flashback でインストールした後、いったんログアウトし、 GNOME Flashback (Metacity) でログインし直す。 #### Ctrlキー入れ替えなど #### $ sudo apt-get install gnome-tweak-tool として 「システムツール」 -> 「設定」 -> 「Tweak Tool」 を開き、 「タイピング」 -> 「Ctrl キーの位置」 で 「Ctrl と Caps Lock を入れ替える」 を選択。 いったんログアウトする。 #### 日本語変換設定 #### 13.10 から ibus がクソになっているので fcitx を使います。 自分は昔から IME の ON は Henkan キー、 OFF は Muhenkan キーでやりたい人なのです。 トグル方式だと、今 ON なのか OFFなのかを認識していないといけないので、無意識にできない。 それと初めて買ってもらった PC が Mac だった (まだ 日本語 OS が漢字トークと呼ばれていた時代ですが。。) ので、指がそれに慣れてしまっています。 $ sudo apt-get install fcitx-mozc としたあと、「システムツール」-> 「システム設定」 -> 「言語サポート」 を開き、 「キーボード入力に使うIMシステム」が fcitx になっているのを確認。 「システムツール」-> 「設定」 -> 「Fcitx 設定」を開く。 「入力メソッド」タブは - キーボード-日本語 - Mozc になっているのを確認。(たぶん最初からそうなっている。) 「全体の設定]タブで「拡張オプションの表示」にチェックを入れる。 「入力メソッドをオンに」と「入力メソッドをオフに」という設定が出てくるので、それぞれ 「Henkanmode」, 「Muhenkan」 を設定する。 「入力メソッドのオンオフ」というところにデフォルトに 「Ctrl+Space」というのが入っているが、これは消す。(Escapeを押す)。 消しておかないと emacs で「Ctrl+Space」 (region選択開始)が使えない。 さらに、 iBus のインジケータを消すために、 「システムツール」-> 「システム設定」 -> 「テキスト入力」 を開き、 「メニューバーに現在の入力ソースを表示」のチェックを外す。 anthy は消してしまっていいので $ sudo apt-get remove anthy とする。 ibus を消そうとすると $ sudo apt-get remove ibus 以下のパッケージは「削除」されます: ibus ibus-pinyin ibus-table ubuntu-desktop unity-control-center unity-control-center-signon webaccounts-extension-common xul-ext-webaccounts アップグレード: 0 個、新規インストール: 0 個、削除: 8 個、保留: 13 個。 この操作後に 8,334 kB のディスク容量が解放されます。 続行しますか? [Y/n] と出てきて、依存関係でいろいろ消えてしまいそうだ。例えば、 unity-control-center が消されると、 「システムツール」-> 「システム設定」 のメニューがなくなって、影響が出そうなので、 ibus はとりあえず残しておくこととする。 #### 日本語ディレクトリを英語に #### 「ダウンロード」、「テンプレート」、「デスクトップ」、「ドキュメント」、「ビデオ」、「ピクチャ」、「ミュージック」、「公開」 というディレクトリを英語にする。 $ LANG=C xdg-user-dirs-gtk-update #### リポジトリを clone #### `~/ref` 以下に自分の興味のあるプロジェクトのリポジトリを reference として clone してくる。 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git clone --reference linux --branch stable git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git clone git://git.denx.de/u-boot.git git clone --reference u-boot git://git.pengutronix.de/git/barebox.git git clone git://git.buildroot.net/buildroot git clone git://ozlabs.org/home/jk/git/patchwork #### emacs を目にやさしくする #### エディタはおそらく最も長時間向かうプログラムかもしれません。 しかしながら、 emacs のデフォルトの白のバックグラウンドは眩しすぎる。 そこで solarized にします。 $ sudo apt-get install emacs-goodies-el で color theme を使えるようにしておき $ git clone git://github.com/altercation/solarized.git ~/ref/solarized で solarized を取得。 `~/.emacs` に以下を追加。 (load-file "~/ref/solarized/emacs-colors-solarized/color-theme-solarized.el") (when (require 'color-theme-solarized) (color-theme-solarized-light)) #### スペルチェッカー #### aspell が入っていなければ、以下でインストール。 $ sudo apt-get install aspell `~/.aspell.conf` に以下の一行追加。 lang en_US nano から起動するために、 `~/.nanorc` に以下を追加。Ctrl-t で起動できる。 set speller "aspell -x -c" emacs は `M-x ispell-buffer` で起動できる。 #### ssh X forwading #### X で ssh を乗り越えさせる。 ssh クライアント (Xサーバー)側の設定: `/etc/ssh/ssh_config` を開き ForwardX11 no を ForwardX11 yes に変更。 ssh サーバー (Xクライアント)側の設定 (`sudo apt-get install ssh` でインストール必要): `/etc/ssh/sshd_config` を開き ForwardX11 yes になっていることを確認。(Ubuntuの場合、たぶんデフォルトでそうなっている。) #### postfix #### 自分は2段階認証を使っているので、Gmail 経由で postfix から送信するのはこちらがわかりやすかった。 [http://blog.bgbgbg.net/archives/2834](http://blog.bgbgbg.net/archives/2834) #### dot ファイル復元 #### ホームディレクトリの dot ファイルを別 PC から復元する。 - .profile - .bashrc - .bash_aliases - .aspell.conf # aspell - .aspell.en.pws # aspell 辞書 - .gitconfig # git - .emacs # emacs - .nanorc # nano - .kermrc # kermit - .buildman # U-Boot buildman - .patman # U-Boot patman
2014年12月26日金曜日
Linux の NAND の Bad Block 管理まとめ
Linux の MTD/NAND framework で、Bad Block の管理がどうなっているか、まとめてみた。 ### Bad Block と Bad Block Mark について ### NAND チップは、出荷時にある一定割合まで、不良ブロックを含んでいいことになっている。 ベンダーは、不良ブロックには、そのことがわかるように Bad Block Mark (以下 BBMと略す)というマークを付けて出荷する。 ベンダーによって若干仕様にブレがあるが、だいたい各ブロックの先頭ページの冗長領域 (以下 OOB = out of band と略す)の先頭に `0xFF` ではない値が書かれる。 また、消去と書き込みを繰り返すうちに、正常ブロックが不良化することもある。 その時にも BBM をつける。 当然ながら、BBM がついているブロックは使ってはいけない。 また、消去すると BBM も消えてしまうので、消去もしてはいけない(これ非常に重要)。 そのブロックが不良かどうかを調べるために、OOB の BBM を読みにいくと確実なのだが、かなり効率が悪いので、実際には Bad Block Table (以下 BBT と略す)を作って管理している。 各ブロックが不良かどうかを調べるには、理屈的には 3 つの方法があることになる。 - 各ブロックの OOB にある BBM を読む。もっとも効率が悪い。 - NAND Flash 上に構築される BBT (以下 flash based BBT と記す) を読む。 - Linux のメモリ上に構築される BBT (memory BBT と記す) を読む。 memory BBT が1次キャッシュで、 flash based BBT が2次キャッシュみたいなイメージで捉えてもいいかもしれない。 ### flash based BBT について ### flash based BBT は最初の一回だけ構築すればよく、その後は Bad Block が増えるごとに更新されていく。 BBT がどこに置かれるかについては、何パターンかあって、ドライバから指定できる。 チップの先頭に置くか、最後尾に置くかで 2通りある。 (`NAND_BBT_LASTBLOCK` フラグで決まる) NAND パッケージ上では 1つに見えても、内部的には複数のシリコンダイで構成されている場合があり、その場合には、全ダイ分の BBT を一箇所にまとめて置くか、ダイごとにテーブルを分けるかでも 2 通りある。 (`NAND_BBT_PERCHIP` フラグで決まる) トータル 2 x 2 = 4 通りの配置方法があり(もっと言うと任意のブロック上に BBT を置く `NAND_BBT_ABSPAGE` というフラグもある)、しかも BBT にも、メインとミラーがあるので結構ややこしい。 BBT はダイごとにテーブルを分けて、最後尾に置くのが普通なので、2 ダイ構成の NAND Flash の場合、通常以下の様な感じで BBT が置かれる。 |---------------------| | | | | | | | chip0 Data Area | | | | | |---------------------| | chip0 BBT | |---------------------| | | | | | | | chip1 Data Area | | | | | |---------------------| | chip1 BBT | |---------------------| ### memory BBT について ### memory BBT は Linux の起動時(正確に言うと NAND ドライバが `module_init` されたとき)に毎回作る。 (ただし `NAND_SKIP_BBTSCAN` フラグがセットされていると memory BBT は作成しない。) ややこしいので、フローチャートで説明すると以下のようになる。 |------------------------| | NAND_SKIP_BBTSCAN flag |---(ON)---> 何もしない |------------------------| | (OFF) | |----------------------| | NAND_BBT_NO_OOB flag |---(OFF)---> 全ブロック巡回して BBM を読み出し、 memory BBT を構築 |----------------------| | (ON) | |--------------------------| | flash based BBT exists ? |---(YES)---> flash based BBT を読みだして memory BBT を構築 |--------------------------| | (NO) | 全ブロック巡回して BBM を読み、memory BBT を構築して flash based BBT に書き込む。 実際に、とあるブロックがBad Block かどうかを問い合わせる場合には |---------------------| | memory BBT exists ? |---(YES)---> memory BBT を読み出す |---------------------| | (NO) | そのブロックの OOB の BBM を読む memory BBT は、各ブロックにつき 2bit の情報を持っている。 - `BBT_BLOCK_GOOD` (`0x00`): 正常ブロック - `BBT_BLOCK_WORN` (`0x01`): 使用しているうちに、正常ブロックから不良ブロックに変化したもの - `BBT_BLOCK_RESERVED` (`0x2`): flash based BBT が置かれているブロック - `BBT_BLOCK_FACTORY_BAD` (`0x3`): 最初から不良ブロックだったもの ### 実際の関数実装 (BBT 構築編) ### `nand_scan_tail()` 関数は (`NAND_SKIP_BBTSCAN` フラグがセットされていなければ) `chip->scan_bbt` を呼び出して、 memory BBT を作成する。 以下は関数呼び出しの概略 chip>scan_bbt (= nand_default_bbt: overridable) |-- nand_create_badblock_pattern `-- nand_scan_bbt |-- nand_memory_bbt | `-- create_bbt | |-- scan_block_fast | `-- bbt_mark_entry |-- verify_bbt_descr |-- read_abs_bbts | `-- scan_read |-- search_read_bbts | `-- search_bbt | `-- scan_read |-- check_create | |-- create_bbt | |-- read_abs_bbt | | `-- read_bbt | `-- write_bbt | |-- nand_erase_nand | `-- scan_write_bbt |-- mark_bbt_region `-- nand_update_bbt 各関数の詳細 int nand_default_bbt(struct mtd_info *mtd) `chip->scan_bbt` のデフォルト。 `NAND_BBT_USE_FLASH` フラグが立っていれば、flash based BBT を記述する BBT Descriptor (BBT をどこに置くとか、ID文字列とか、BBT の仕様を記述したもの)を メイン (`chip->bbt_td`) とミラー(`chip->bbt_md`)と 2つ分セットする。 `nand_scan_bbt` を呼び出して、BBT を scan する。 static int nand_create_badblock_pattern(struct nand_chip *this) 各ブロックの OOB の BBM を scan するときの、仕様を記述した BBT Descriptor を `chip->badblock_pattern` にセットする。 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) `chip->bbt_td` がセットされていなければ(`NAND_BBT_USE_FLASH` がオフの時)、 `nand_memory_bbt` を呼び出して、各ブロックの OOB から BBM を読みだす。 セットされていれば、 flash based BBT が存在するか確認し、あればそれを使う。 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) `create_bbt` の Wrapper。 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd, int chip) `chip->badblock_pattern` に基づいて 各ブロックの OOB にアクセスして BBM を読みだし、 memory BBT を作る。 通常は、各ブロックの先頭ページの OOB だけを見るが、 `NAND_BBT_SCAN2NDPAGE` フラグが立っていると、2ページ目も見る。 `NAND_BBT_SCANLASTPAGE` フラグが立っていると、ブロックの最終ページを見る。 OOB に BBM が付いているブロックには、 memory BBT 上では `BBT_BLOCK_FACTORY_BAD` とマークされる。 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, loff_t offs, uint8_t *buf, int numpages) `offs` 位置(ページ先頭を指している)から `numpages` ページ分の OOB を調べ、1 つでも BBM が付いていたら `1` を、 正常ブロックなら `0` を、その他のエラーならば、負の値を返す。 `buf` は temporary buffer で、 OOB を格納するのに十分な長さがないといけない。 static inline void bbt_mark_entry(struct nand_chip *chip, int block, uint8_t mark) memory BBT の先頭から `block` ブロック目のエントリーに対して、 `mark` をつける。 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) BBT descriptor table `bd` の sanity check static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) BBT Descriptor に `NAND_BBT_ABSPAGE` フラグが立っているときのみ呼び出される。 `NAND_BBT_VERSION` フラグが立っているときは、 `td->pages[0]` に BBT 位置が指定されているので、 そのページから BBT のバージョンを読みだして、 `td->version[0]` にセットする。 `md` が存在すれば、ミラーに対しても同じことをする。 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, size_t len, struct nand_bbt_descr *td) BBT マーカーを含む領域を `buf` に読み出す。 `td` に `NAND_BBT_NO_OOB` フラグが立っているときは、 `offs` から マーカーの長さ (4 byte) さらにバージョン情報がある場合は、もう 1 byte 読み出す。 `NAND_BBT_NO_OOB` フラグが立っていない場合は、`offs` 位置の1ページ分(MAIN + OOB)を読み出す。 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) BBT Descriptor に `NAND_BBT_ABSPAGE` フラグが立っていないときのみ呼び出される。 `search_bbt` の wrapper。 `td` (メイン)、および `md` (ミラー)が存在すれば `md` についても `search_bbt` を呼び出す。 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) flash based BBT を探し、見つかると `td->pages[i]` に BBT の先頭のページ番号を格納する。 `NAND_BBT_VERSION` フラグが立っていれば `td->version[i]` にバージョン番号をつめる。 `NAND_BBT_PERCHIP` フラグが立っていれば、チップ単位で BBT を探す。 `NAND_BBT_LASTBLOCK` フラグが立っていれば、最終ブロックから前方に向かって、立っていなければ、先頭ブロックから後方に向かって探す。 int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td) `buf` に BBT の マーカー (通常は `'B'`, `'b'`, `'t'`, `'0'` の4文字, ミラーは `'1'`, `'t'`, `'b'`, `'B'` の 4文字) が含まれているかを調べる。 含まれていれば `0` 含まれていなければ `-1` を返す。 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) flash based BBT の読み出し、更新、新規作成をする。 `td`, `md` ともにまだ存在しない場合は、`create_bbt` を呼び出して、各ブロックの OOB から BBM を読みだして memory BBT を作る。 ただし、 `NAND_BBT_CREATE` フラグが立っていない もしくは `NAND_BBT_CREATE_EMPTY` フラグが立っていない場合は、 memory BBT は全ブロック `BBT_BLOCK_GOOD` になる。 少なくともどちらか存在する場合は、より新しいバージョンを持つ方の flash based BBT を読みだして memory BBT を作る。 int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) flash based BBT を読み出し、memory BBT へ書き込む。 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, struct nand_bbt_descr *td, int offs) NAND の `page` ページ位置の flash based BBT を読み出し、memory BBT の `offs` 位置から `num` エントリー分を書き込む。 `NAND_BBT_NO_OOB` フラグが立っている場合は、 先頭ページの最初は BBTマーカーとバージョン情報なので、その部分はスキップする。 `NAND_BBT_NO_OOB` フラグが立っていない場合は、先頭バイトから読む。 flash based BBT の各エントリーのビット数は td->options で指定される。 All 1 が `BBT_BLOCK_GOOD` に対応。 `td->reserved_block_code` に `0` 以外が指定されているときは、 `BBT_BLOCK_RESERVED` に対応。 All 0 が `BBT_BLOCK_FACTORY_BAD`、 それ以外は `BBT_BLOCK_WORN` に対応する。 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md, int chipsel) memory BBT を flash based BBT へ書き込む。 `NAND_BBT_LASTBLOCK` フラグが立っていない場合は、先頭ブロックから後方に向かって、 立っている場合は、最終ブロックから前方に向かって、bad block ではなく、ミラーでも使われていないブロックを探す。 見つかると、そのブロックを一旦消去し、 `scan_write_bbt` を呼び出して memory BBT の内容を書き込む。 void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) BBT が置かれているブロックに `BBT_BLOCK_RESERVED` マークをつける。 `NAND_BBT_ABSPAGE` フラグが立っていない場合は、 `td->maxblocks` ブロック分、マークをつける。 基本的に memory BBT のみの更新だが、 `td->reserved_block_code` に `0` 以外が指定されていると、 `nand_update_bbt` を呼び出して flash based BBT も更新する。 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) flash based BBT のバージョンをインクリメントし、 `write_bbt` を呼び出して、更新する。 `chip->md` が存在すれば、ミラーに対しても同じことをする。 `NAND_BBT_PERCHIP` フラグが立っている場合は、 `offs` 位置のブロックが属する BBT のみが更新される。 ### 実際の関数実装 (Bad Block 問い合わせ編) ### mtd_block_isbad `-- mtd->_block_isbad (=nand_block_isbad) `-- nand_block_checkbad |-- chip->block_bad (=nand_block_bad:overridable) `-- nand_isbad_bbt 各関数詳細 int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) MTD layer の bad block 判定関数。 オフセット位置 `ofs` のブロックが bad block なら `1`、正常ブロックなら `0`、エラーの場合は負の値を返す。 `mtd->_block_isbad` がなければ 0 を返し、存在すれば呼び出す。 int nand_block_isbad(struct mtd_info *mtd, loff_t offs) `mtd_block_isbad` の NAND layer 実装。`nand_block_checkbad` の wrapper。 int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, int allowbbt) memory BBT があればそれを読み、なければ `chip->block_bad` をコールして、直接 NAND chip の OOB を読む。 static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) OOB に直接アクセスして BBM を読み、 `0xFF` でなければ 1 を返す。 (TODO: `NAND_CMD_READOOB` のような低レベルコマンドだけでなく、 `chip->ecc.read_oob` に対応すべき??) int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) memory BBT にアクセスして Bad Block なら `1` を、正常ブロックなら `0` を返す。 `allowbbt` が `0` でないならば、 `BBT_BLOCK_RESERVED` (BBT を格納しているブロック) は正常ブロックとして扱い、 `allowbbt` が `1` ならば、 `BBT_BLOCK_RESERVED` は不良ブロックとして扱う。 ### 実際の関数実装 (BBMをつけるとき) ### mtd_block_markbad `-- mtd->_block_markbad (=nand_block_markbad) |-- nand_block_isbad `-- nand_block_markbad_lowlevel |-- nand_erase_nand |-- chip->block_markbad (=nand_default_block_markbad) `-- nand_markbad_bbt |-- bbt_mark_entry `-- nand_update_bbt `-- write_bbt 各関数詳細 int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs) MTD layer 関数。`ofs` の位置のブロックに BBM をつける。 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) `mtd_block_markbad` の NAND layer 実装。 `nand_block_isbad` を呼び出して、`ofs` が bad block か調べ、すでに bad block なら何もしない。 bad block でないなら `nand_block_markbad_lowlevel` を呼び出して、マークをつける。 static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs) `NAND_BBT_NO_OOB_BBM` フラグが立っていない場合は、いったんそのブロックを消去し、OOB 領域に BBM をつける。 さらに `chip->bbt` が存在すれば `nand_markbad_bbt` を呼び出して、memory BBT と flash based BBT を更新する。 (`chip->bbt` が存在しなくても flash based BBT は更新すべきでは?バグ??) int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) `ofs` 位置のブロックの先頭ページ の OOB に BBM (0x00) をつける。 `NAND_BBT_SCAN2NDPAGE` フラグが立っていると、2ページ目にも BBM をつける。 ただし、`NAND_BBT_SCANLASTPAGE` フラグが立っている場合は、ブロック内最終ページに BBM をつける。 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) `bbt_mark_entry` を呼び出して memory BBT に `BBT_BLOCK_WORN` マークをつける。 `NAND_BBT_USE_FLASH` フラグが立っている場合には、`nand_update_bbt` を呼び出して、flash based BBT も更新する。
前の投稿
ホーム
登録:
投稿 (Atom)