Nexus 7(2012)にUbuntu 13.04をインストールしてFTDI社のUSBシリアル通信デバイス(USBオシロ)を使うまでの手順
目的
AndroidタブレットをUbuntuタブレットにしてFTDIなUSBシリアル通信デバイスを接続して気持ちいいことする。
環境
OS: Windows 8.1+MSYS2 Ubuntuマシン: Nexus 7 2012 16GB WiFiモデル
※ GunZip圧縮形式のものが解凍できること
手順
- Nexus7をUbuntu入れれるようにしておく
- Nexus7向けにビルドされたUbuntuイメージをダウンロード/インストール
- Nexus7のUbuntuのLinuxカーネル設定を変更してリビルド
- USB(OTG)ハブに接続したFTDI社のチップを積んだUSBシリアル通信デバイスのドライバモジュールをロード
事前準備(Nexus7をいい感じにする)
- Unlockする
- Root化する
- カスタムリカバリを入れる
※この辺は既に情報沢山あるのでググればすぐ見つかります。
Nexus7用Ubuntuのダウンロード
以下サイトから、ブートローダイメージ、ユーザーデータイメージをダウンロード
http://cdimage.ubuntu.com/ubuntu/releases/13.04/release/
※リンク先はいつまでも残っているとは限りませんが、cdimage.ubuntu.com内のUbuntuリリースを辿って行くと見つかると思います。
必要なもの
- ubuntu-13.04-preinstalled-desktop-armhf+nexus7.bootimg
- ubuntu-13.04-preinstalled-desktop-armhf+nexus7.img.gz
Android SDK内のツールを使用してNexus 7 2012の準備
以下サイトから、Android SDK(Stand-alone)をダウンロード
Download Android Studio and SDK tools | Android Developers
必要なもの
※ 環境に応じて適切なものを選択 ※ ダウンロードしたらインストール(ZIPなら適当な場所に解凍して環境変数PATHにパスを通す) ※ Android SDKの詳しい使い方は、色々な所で紹介されているので、そちらをご参考に…。
Nexus7にUbuntuイメージ書き込み
1. 既存のブート領域を削除
$ fastboot erase boot
※1.152秒くらい
2. 既存のユーザーデータ領域を削除
$ fastboot erase userdata
※5.042秒くらい
3. Nexus7用Ubuntuブートイメージを書き込み
$ fastboot flash boot ubuntu-13.04-preinstalled-desktop-armhf+nexus7.bootimg
※2.442秒くらい
4. Nexus7用Ubuntuユーザーデータイメージを書き込み
$ fastboot flash userdata ubuntu-13.04-preinstalled-desktop-armhf+nexus7.img
※131.222秒くらい
5. Nexus7を再起動
$ fastboot reboot
Googleのロゴが出た後、黒い画面に「Preparing the root filesystem, please wait, this will take a few minutes ...」とメッセージが出て、a few minutes(10分くらいかかった)待つ。
無事起動すると、ユーザ作成、タイムゾーン設定などのウィザードが表示される。(ソフトウェアキーボードも、画面回転も使えるのでご安心を)
6. Ubuntuパッケージリポジトリ参照先を変更
使用するNexus7向けUbuntuのイメージが古すぎて、既にサポートされていないリポジトリ参照先となっているため、aptのソースリストを変更。
$ sudo nano /etc/apt/source.list ports.ubuntu.com/ubuntu-ports を old-releases.ubuntu.com/ubuntu に、置換
参考にした記事
Nexus7上のUbuntuのLinuxカーネルを設定してカーネル再構築
今回使用したUbuntuはNexus7用に既に最適化されたものをポンと入れるだけで、かなり快適な環境に整っているのですが、残念ながらUSBシリアル通信を行うためのデバイスドライバ等は用意されていませんでした。
(/dev/ttyUSB0もしくはそれ相当のものが無くて気付いた)
そこで、Nexus7向けUbuntuのLinuxカーネルを落としてきて、自分でカーネルを再ビルドする必要がありました。
1. Nexus7向けUbuntuのLinuxカーネルをダウンロード
Gitで管理されているため、Gitをインストールし、Linuxカーネルソースを取得
※40分位かかりました
$ sudo apt-get install git $ git clone git://kernel.ubuntu.com/ubuntu-archive/ubuntu-nexus7.git
2. UbuntuのLinuxカーネルビルド環境の用意
$ sudo apt-get install libncurses-dev build-essential fakeroot kernel-package
3. UbuntuのLinuxカーネル設定
取得したNexus7向けLinuxカーネルソースを以下の手順で設定
$ sudo -s # cd /usr/src # mv ubuntu-nexus7(取得したNexus7向けLinuxカーネルソースディレクトリ) ./ # cd ubuntu-nexus7 # make oldconfig # make menuconfig
Linuxカーネルソースディレクトリ上でmake menuconfigを行うと、カーネル設定するための画面が表示されます。
ここで、 Device Drivers --> USB support --> USB Serial Converter support の順にページを進み、次のように設定します。
--- USB Serial Converter support [*] USB Serial Console device support [*] Functions for loading firmware on EZUSB chip ※多分不要 [*] USB Generic Serial Driver ~~~~省略~~~ [M] USB FTDI Single Port Serial Driver ~~~~省略~~~
※カーソルキーで項目を移動、スペースキーで設定変更(""/"M"/"*")できます。
4. UbuntuのLinuxカーネル再構築(ビルド)
普通なら、このままmakeすれば良いのですが、ちょっと待って下さい。
もう少し手順を踏む必要があります。
まず、現在のLinuxカーネルのバージョンを確認してください。
$ uname -r
すると、3.1.10-10-nexus7と表示されるかと思います。
しかし、取得したNexus7向けカーネルソースは、3.1.10というカーネルバージョンで、 そのままmakeすると、/bootの下には、vmlinuz-3.1.10というカーネルイメージが作られます。
Nexus7向けに最適化されたLinuxカーネルということと、Nexus7自体のブートローダを弄るはめになるのも嫌なので、ここではあくまでも3.1.10-10-nexus7という名前のカーネルイメージを作りたいです。
そのため、カーネルソースのMakefileを開き、バージョン名を以下のように修正します。
# nano /usr/src/ubuntu-nexus7/Makefile (修正前) VERSION = 3 PATCHLEVEL = 1 SUBLEVEL = 10 EXTRAVERSION = NAME = "Divemaster Edition" (修正後) VERSION = 3 PATCHLEVEL = 1 SUBLEVEL = 10 EXTRAVERSION = -10-nexus7 NAME = "Divemaster Edition"
はい、これで、3.1.10-10-nexus7という名前のカーネルイメージが作られるようになるように見えます。
が、まだこのままでは出来ません。
このままmakeすると、3.1.10-10-nexus7+という名前のカーネルイメージが作成されます。
"+"が付いてしまうのは、バグではないのかと。
make LOCALVERSION=""とすれば消えるそうなのですが、消えません。
Debianのコミュニティでバグ報告として上がっているようですが。
せめてオプションで"+"付けるかどうか選択出来るようにして欲しいのですが。
とまあ、余計なことはこれくらいにして、"+"が付かないように、script/setlocalversionという シェルスクリプトの内容を修正します。
# nano /usr/src/ubuntu-nexus7/script/setlocalversion ※多分最後の方にある (修正前) # scm version string if not at a tagged commit if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then # full scm version string res="$res$(scm_version)" else # append a plus sign if the repository is not in a clean # annotated or signed tagged state (as git describe only # looks at signed or annotated tags - git tag -a/-s) and # LOCALVERSION= is not specified if test "${LOCALVERSION+set}" != "set"; then scm=$(scm_version --short) res="$res${scm:++}" fi fi (修正後) # scm version string if not at a tagged commit if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then # full scm version string res="$res$(scm_version)" #else # # append a plus sign if the repository is not in a clean # # annotated or signed tagged state (as git describe only # # looks at signed or annotated tags - git tag -a/-s) and # # LOCALVERSION= is not specified # if test "${LOCALVERSION+set}" != "set"; then # scm=$(scm_version --short) # res="$res${scm:++}" # fi fi
はい、ここまで出来たら、ようやくカーネルビルド出来ます。
ビルドは時間かかる(1時間位)ので、流したらしばし放置。
また、Nexus7 2012はデュアルコア(だったはず)なので、-j3オプションでコア2つ使うようにしておきます。
# make -j3 LOCALVERSION="" && make install && make modules_install
ビルドが終わると、/bootディレクトリ内のカーネルイメージなどが更新されているはずです。
カーネルイメージが正しく作成されたら、Nexus7を再起動します。
再起動後、/lib/modules/3.1.10-10-nexus7/kernel/drivers/usb/serialディレクトリ内にftdi_sio.koというモジュールがインストールされていれば成功です。
5. USBシリアル通信デバイスドライバモジュールをロード
前手順で、ftdi_sio.koというモジュールが正常にインストールされていれば、ロード出来るはずです。
$ sudo modprobe usbserial ※これ自体はbuiltinのためmodprobeしなくても良いのかも $ sudo modprobe ftdi_sio
正常にロードされていれば、FTDI社のUSBシリアル通信デバイスを、Nexus7に挿したUSB-OTGハブに接続してみてください。
lsusbコマンドでデバイスの接続状況、lsmodでモジュールの使用状況(正常ならftdi_sioが0以外、ロードされていない/接続していないなら0になるはず)が確認できます。
で、正常に認識されれば、/dev/ttyUSB0が使えるようになります。
ハマったところ
「Nexus 7 2012+Ubuntu」という記事や情報はたくさんあるのだけれど、Nexus 7 2012という端末とNexus7用Ubuntuイメージが古くなってしまっていることから、Nexus7用Ubuntuイメージへのリンクが切れてしまっていたり、「それ、もうずっとメンテナンスされてないから落とせないよ」という情報が多く、中々イメージファイルの場所まで辿り着くのが大変だった。(結局、Ubuntuの公式Imageのサイトからリンクを上の階層に辿り、そこから新しいバージョンから順に一つ一つ「Nexus7…Nexus7どこ…」と探し漁ったら見つかったけど、これもいつ消えるか分からない)
また、Ubuntu自体も今はUbuntu Touchという名前で、スマートフォン/タブレット向けにカスタマイズされたイメージがリリースされていて、Nexus 7向けにカスタマイズされてパッとやってポンだけのUbuntuイメージは13.04のみとなっていた。(13.04が最初で最後?)
ただ、所詮Linuxなので、やろうと思えば、ちょっと頑張れば割りと簡単に出来るようになる。
経緯
なんでこんなことしたか、すごく個人的な理由です。
電子工作するのにオシロスコープを使いたかったのだけど、 持っているオシロスコープはUSB接続タイプのbitscope microというもの。
これは、Windows、OSX、Linux、ラズパイでも動作するというのが売りで、はじめはラズパイ2につないで使おうと企んでいた。
けど、ラズパイ2にしても所詮はラズパイ2の性能で、Linuxデスクトップを動かすには、それでも中々動作は重い。
それに、ラズパイだと液晶ディスプレイ、キーボード、あるいはタッチパネル式液晶ディスプレイが必要になるわけで、オシロスコープ使いたいためだけにわざわざそんなゴテゴテした機器一式部屋に置きたくなかった。
物置を掃除していたら、今時では流石にもっさり過ぎて使わなくなっていたNexus 7 2012が出てきて、「あ、そういうやNexus 7でLinux動かすのって結構報告上がってたよな…これはイケる。」と確信して、ここまで辿り着きましたとさ。
最終的には、Ubuntuを入れたNexus7にホスト機器への充電も可能なUSBハブを繋いで、そこにbitscopeなどを繋いで、あとはbitscope用のオシロ/ロジアナなどのソフトウェアをインストールして使う。
終わりに
いや、Nexus7+Ubuntu、本当に良いよ。
タブレットの向きを変えれば、ディスプレイ設定も自動的に変わってくれたり、最初からタッチパネルがポインタとして使えるし、文字入力が必要な場面ではソフトウェアキーボードを出してくれる。
正直、Ubuntuがここまでタブレット等のデバイスで快適に使えるレベルだとは思いもしなかった。
Ubuntu Touchが実際どういうデバイスに搭載されているのか知らない(というかこれ調べてて初めてUbuntu Touchという存在に気付いた)けど、ようやくデスクトップLinuxがそこそこ使えるレベル(?)になってきたかなという現状、いや、それ以前からUbuntuがここまでタブレットデバイスとして便利なものになってるということを思うと、今後にも期待したい。
ということで、今後電子工作のお供に、オシロ/ロジアナ/計測に使っていきます。
Raspberry Pi向けArch Linux ARMインストールの自動化(一部)
はじめに
用途が少し特殊なため、役に立つ人はごく少数かもしれない。
完全に自分が楽するためだけに作ったものなので、有益な情報になるかどうかわからないけど、役に立ってくれる人がいたら、少し嬉しい。
Arch Linux ARM OSインストール用スクリプト
概要
- Raspberry Pi用のOS(Arch Linux ARM)をセットアップするスクリプト
- SDカードを挿す→スクリプト実行→SDカードをRaspberry Piに挿し変えるだけ
- OSイメージは、カレントディレクトリに無ければarchlinuxarm.orgから最新版をダウンロードしてくれる
- SDカード容量の内、100MBをbootパーティションに、残りの容量全てをrootパーティションに割当て
- rootパーティションフォーマットはF2FSを使用
- ネットワーク設定は、systemd-networkdを使用
事前に必要なもの(スクリプト実行環境がArch Linuxの場合)
- bsdtar
- dosfs-tools
- f2fs-tools
ソースコード
https://github.com/morinezumiiii/ArchLinuxARM-installer-for-raspberrypi
使い方
- SDカードをPCに挿す。
- 以下のようにスクリプトを実行
# cd ArchLinuxARM-installer-for-raspberrypi # ./install.sh [SDデバイスパス] [IPアドレス] [ゲートウェイ] [DNS]
例:
# ./install.sh /dev/sdX 192.168.0.100 192.168.0.1 192.168.0.1
- スクリプトが完了したら、SDカードを抜き、Raspberry Piに挿し、電源を投入。
これで、指定したIPアドレス上のRaspberry PiにSSHでログイン出来る。
経緯
Arch Linux(x86/x86_64)とArch Linux ARMのインストールの違い
両者は、動作するプラットフォームや、パッケージリポジトリの場所が異なったりするが、同じArch Linux。
ARM版はARM系プロセッサを積んだマイコンボード向けに、それぞれのARMアーキテクチャ毎にOSイメージの配布を行っている。
Raspberry Pi向けにおいては、ARMv6向け(Raspberry Pi Model A/B/A+/B+)と、ARMv7向け(Raspberry Pi 2 ModelB)に、配布を行っている。
x86版とRaspberry Pi向けARM版では、OSインストールの手順が異なり、ある程度の環境が作られた状態のものをインストールすることになる。
具体的には、archlinuxarm.orgからOSイメージをダウンロードし、bootパーティション/rootパーティションそれぞれをSDカードにコピーして手持ちのRaspberry Piに挿して電源を入れてあげるだけで、SSHで接続できる状態になる。
細かい設定等は、まずそのOSを立ち上げてからの作業となる。
Arch Linux ARMをRaspberry Piにインストール
ARM版公式サイトに、インストール手順がご親切に記載されている。
http://archlinuxarm.org/platforms/armv6/raspberry-pi
個人的な事情
私は、県内で日本Androidの会の茨城支部として、毎月勉強会を主催しています。
その際に、Raspberry Piを使ったワークショップ/ハンズオンを行う場合は、前日までに(現時点で)10台のRaspberry Piをセットアップしておく必要があります。
上記の公式インストール手順を、Raspberry Pi台数分を手作業で行っていると、かなりの時間がかかり、当日トラブルで再セットアップを行う必要があったりした場合も、大きな時間ロスとなり、参加者の方々に迷惑をかけてしまうので、今回自分用にスクリプト化しました。
その他設定
OSインストール後のセットアップ作業は、出来るだけ自動化させたいために、settings/setup.sh内に、スクリプトを用意し、それをRaspberry PiのSDカードのルートディレクトリ直下に配布し、SSHログイン後それを実行することでひと通りの必要なパッケージ類をインストールしたり、設定したりするようにしてあります。
Arch使いなら、arch-chrootとpacmanを使ってマウントデバイス上のArch Linuxにchrootした後、環境構築も出来るので、全部自動化させれるのだけど、その場合、ホスト側のArch LinuxもARMアーキテクチャのものを使って行う必要があるので、断念しました。
ここらへん、もっと改善できるといいのですが。
あと、複数台のSDカードリーダ/ライタを接続して、パラレルでSDカードを焼くというのも考えましたが、接続されたUSBデバイスがどのデバイスで、どのSDカードがどのIPアドレスなのかわからなくなりそうな恐れがあるので、こちらは敢えてやらないようにしました。
おわり
とりあえず、勉強会の準備が、少し、いや、かなり楽になりました。
Node.jsでconfigモジュールの設定ファイル読み込み先を変える
環境
- ラズパイ
- Arch Linux ARM
- Node.js v0.10.36
- config 1.11.0
環境変数 NODE_CONFIG_DIR を設定
-- 環境変数 NODE_CONFIG_DIR 設定前 $ echo $NODE_CONFIG_DIR $ node > var config = require('config'); WARNING: No configurations found in configuration directory: WARNING: /home/morinezumiiii/tmp/node-config-test/config WARNING: See https://www.npmjs.org/package/config for more information. > config {} > config.util.getEnv('NODE_CONFIG_DIR'); '/home/morinezumiiii/tmp/node-config-test/config' > (^C again to quit) > -- 環境変数 NODE_CONFIG_DIR 設定 $ export NODE_CONFIG_DIR=/opt/conf/node-config -- 環境変数 NODE_CONFIG_DIR 設定後 $ echo $NODE_CONFIG_DIR /opt/conf/node-config $ node > var config = require('config'); > config { hoge: 1, fuga: 2, foo: 'bar' } > config.util.getEnv('NODE_CONFIG_DIR'); '/opt/conf/node-config' >
ただのメモ
Arch Linux ARM(というかSystemd)のresolv.confについて
普段ラズパイでArch Linux ARMを使っていると、たまに(というかしょっちゅう)インターネットに繋がらなくなる。
IPアドレス直接指定では問題なく接続できるが、名前解決が出来ない。
環境
/etc/systemd/network/eth0.network
[Match] Name=eth0 Host=test.morinezumiiii.jp [Network] DHCP=none DNS=('192.168.0.1','8.8.8.8','8.8.4.4') [Address] Address=192.168.0.80/24 [Route] Gateway=192.168.0.1/24
原因
原因はなんとなく分かっている。
Archを再起動すると、resolv.confがどこからか勝手に書き換えられているから。
でもそれがどこから書き換えているのかわからないので、解決方法がわからない。
ググってみると、同様にFedoraでresolv.confが勝手に書き換えられてしまって困っている人たちはちらほら見かけたが、Archとはちょっと原因が異なりそう(同じ?)
resolv.conf(つながるとき)
# This file is managed by systemd-resolved(8). Do not edit. # # Third party programs must not access this file directly, but # only through the symlink at /etc/resolv.conf. To manage # resolv.conf(5) in a different way, replace the symlink by a # static file or a different symlink. nameserver 8.8.4.4 nameserver 8.8.8.8
resolv.conf(つながらないとき)
# This file is managed by systemd-resolved(8). Do not edit. # # Third party programs must not access this file directly, but # only through the symlink at /etc/resolv.conf. To manage # resolv.conf(5) in a different way, replace the symlink by a # static file or a different symlink. nameserver 8.8.4.4 nameserver 2001:4860:4860::8844 <-- なんかできた nameserver 8.8.8.8 # Too many DNS servers configured, the following entries may be ignored. <-- なんかできた nameserver 2001:4860:4860::8888 <-- なんかできた
/etc/resolv.conf(シンボリックリンク)
/etc/resolv.confって、シンボリックリンクだったんですね。知らなかったよ。(白目)
$ ls -la /etc/resolv.conf lrwxrwxrwx 1 root root 32 Feb 8 16:52 /etc/resolv.conf -> /run/systemd/resolve/resolv.conf
解決方法
まだわかってない。もっとsystemd-networkdを勉強してみる。
こふ
けんこふさんをダラダラ紹介するだけの記事
こふ語 Advent Calendar 2014 - Adventar
こふ語Advent Calendar 2014の9日目(ちょい遅くなったけど)です。 はてなブログにしてから技術系ガン無視な記事書くのこれが初めて。
けんこふとは
ちょっと真面目に紹介すると、Arch Linux使いな人。 最近日本国内でもArch Linux使いが多くなってきた気がするけど、 この人は結構長いイメージある。
不真面目に紹介すると、ド変態。ヤバイ。イッちゃってる。
多分、この人のせいで「Gentoo=こわい」みたいに、 「Arch=変態」というイメージが定着した。
もう一回真面目に書くと、初めてけんこふさんを見つけた時は、Arch関係で調べ物してた時だった。
ただその時は、たまたま記事が古かったので「yaourtか、packerで良いじゃん」「糞の役にも立たねぇな…」「何この六角大王で作ったみたいな自作萌えキャラ…」「キモッ」「キモッ」「きっしょ」と、冷ややかな目で見てた。
いつだったか自分のTLにRTされて流れてきた。
「やばい…kenkovだ…。」
そのけんこふさんがTL上で発する言葉の数々、完全に頭がイッちゃってるんじゃないかと思うほどで、キャラ作りでここまで絶対辿りつけない→かわいそうな人→これがけんこふそのものとして、次第に受け入れるようになってきた。
それがだんだん慣れてきて、ついには、けんこふさんの発言が面白い(ウケる)と思うようになってしまった。
あとアイコン可愛い。
こふ語
けんこふさんが発する言葉として、 「アンッ!アンッ!アンッ!アンッ!」 が、代表的かつ印象的。
そして突如現れた、けんこふさんと相乗効果を生み出す、もへ氏。
もへ氏、彼はすごい。すごいとしか言い様がない。
あのけんこふさんのド変態な発言をド変態な発言で返し会話するという、まさに目には目を。 と、思いきや突如サディストっぷりを発揮してけんこふさんに痛烈なツッコミやむちゃぶり。
このAdvent Calendarでも既に取り上げられているが、けんこふさん×もへ氏のやりとりから、けんこふさんの発言には、だいたいパターンがあることが浮き彫りとなった。
先述した「アンッ!アンッ!アンッ!アンッ!」に加え、「アッ…」、「ア^〜〜〜っ」や、 語尾に"っ"を付けるなど。
どんなバリエーションがあるかは、実際に自分の目でけんこふさんのツイートを見てみると良い。
パターンに慣れてくると、以下のように飲んでもらうことが出来るようになる。
※ただしこれは初歩中の初歩
けんこふさんをべた褒めする気はサラサラ無い。
ただ僕は、けんこふさんは技術力も自分なんかに比べて遥かに高く、尊敬しているし、絵も可愛いし、大好きですマル
おわりに
もうちょっとちゃんとネタ練って面白い記事書こうと思ったけど、皆さん高度で面白い記事書いてるので、めんどくさくてやめた。
We Love Kenkov.
Raspberry Pi Model B+(ArchLinux)でカメラモジュールが使えない件
追記(2018/5/23)
ラズパイ2や3では普通に使えて、I2Cも同時に使えています。
ひょっとしたら今のファームウェアならこの問題は解決してるかも?
モデルB+が悪いわけじゃなさそう
モデルB+を入手してからカメラモジュールを接続してraspstillとか使ってもエラーが出て使えなくて、(・3・)アルェーってなってたんだけど、モデルB+だけじゃなくモデルB、モデルAでもうまく行かなくなってた。
使えなくなってたのは、最近Arch Linuxをインストールしたヤツだけだった。
エラーメッセージは以下の通り。
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM) mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1) mmal: Failed to create camera component mmal: main: Failed to create camera component mmal: Camera is not detected. Please check carefully the camera module is installed correctly
このエラーが出る時って、本当にカメラモジュールが物理的につながってない(カメラモジュールのカメラ本体側の正方形のコネクタがしっかりささってない、FPCケーブルが断線してる)が大半なんだけど、今回問題になったのは、ラズパイ向けLinuxカーネル側の仕様かバグかってところっぽい。
ちなみにカーネルは3.12.26-1-ARCH。
以下の情報を探して右往左往してたところ、コレだっていうのが見つかったんだけど、結局のところよく理解してない。
B+ Camera is not detected (workaround available) - Raspberry Pi Forums
どうやら、spi-bcm2708とi2c-bcm2708モジュールがカーネルにロードされてると、カメラモジュールが競合してるのか、使えなくなってしまうっぽい。
Raspberry Pi + Arch Linuxでカメラモジュールを使う(暫定)
とりあえず、偉大なる先人達のお知恵をお借り(ググってただけ)しながら、使えるようにするまでを、まとめておこうかと思う。 (ただ、恐らくLinuxカーネル側の誤りで、後々修正されて必要なくなるのかもしれない…?)
最新ファームウェア/ツールを入れる
Tutorial for updating R-Pi firmware in ARCH LINUX [obsolete] - Raspberry Pi Forums
ここを頼りに、rpi-updateが使えるようにしておく。
# pacman -Syu # pacman -S git wget # wget http://raw.github.com/Hexxeh/rpi-update/master/rpi-update -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update # pacman -S ca-certificates # pacman -S binutils # pacman -Sy raspberrypi-firmware-bootloader linux-raspberrypi # rpi-update # sync # reboot
vcgencmdが使えるようになり、ラズパイにカメラモジュールが接続されてるか確認出来るようになる。
$ vcgencmd get_camera supported=1 detected=0 $ vcgencmd get_mem arm arm=384M $ vcgencmd get_mem gpu gpu=128M
ラズパイのカメラモジュールを使う前提として、ArchARM公式Wikiにある通り、GPUへのメモリ割り当てに、最低でも128MBが必要というのと、おまじないがあるそうなので、それを/boot/config.txtに書き込む。
$ sudo vi /boot/config.txt --- 以下を追記 --- gpu_mem_512=128 gpu_mem_256=128 start_x=1 start_file=start_x.elf fixup_file=fixup_x.dat
modprobeのblacklistを作成し、ブート時にロードするモジュールを制御する。
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf --- ファイルを新規作成し、以下を追記 --- blacklist spi-bcm2708 blacklist i2c-bcm2708
$ sudo chmod 644 /etc/modprobe.d/raspi-blacklist.conf
再起動
$ sudo reboot
再度、vcgencmdで、カメラモジュールの接続状態を確認
$ vcgencmd get_camera supported=1 detected=1
認識するはず。これで認識しないとなると、spi-bcm2708、i2c-bcm2708モジュールがまだ読み込まれている状態か(lsmodで確認)、ケーブルが死んでるなどで、本当にカメラモジュールが接続されていないかのどちらか。
detectedが1になっていれば、カメラモジュールが使えるはずなので、
$ raspistill -d
や
$ raspivid -o -t 3000 hoge.h264
などで、確認してみるといい。
SPIやI2Cは使えなくなる
上記手順で、spi/i2c-bcm12708モジュールをロードしなくしているため、SPI接続やI2C接続の周辺機器等は使えなくなります。 SPI/I2Cといえば、今月の日経Linuxに載っていたような、AdafruitだったりSainSmartだったり、ST7735など液晶ディスプレイは使えなくなります。 この記事を書いている現時点では、両方使用することは出来ません。
(というかDSI接続のディスプレイはいつになったら…)
おわりに
ぶっちゃけ、今回の手順、僕自身まだちゃんと理解してません。なんとなくはわかるんだけど、ca-certificatesがなんなのかとか、その辺り後でちゃんと調べて覚えておく。とりあえず動かしたかったので。
あと、今回、何故ラズパイ向けのLinuxカーネルがこんな状態になってしまったのかが、よくわからない。凡ミスでした、バグでした、となれば、「なんだ、いつものことか。そして相変わらず修正早ぇwwwArch最高やwwww」ってなるんだけど、SPI/I2CとCSIコネクタのカメラモジュールが競合するというのが解せない。カメラモジュール自体がCSIコネクタのSPI接続ってこと?I2CではフルHDサイズで30fpsのデータを転送することは無理だよなぁ…。(この辺まだあまり詳しくないので、分かる方いたら教えて下さい…)
でも、よくよく考えてみると、ST7735をラズパイのディスプレイとして使うためにビルドしたカーネルって、確かカメラモジュール使えなかったような気がするけど、元々そういう仕様で、今回modprobeにblacklistとなるものが入ってなかったから、カメラモジュールが使えない(SPI/I2Cは使える)っていう 状態になったのかなぁ…?(うろ覚え)
まとまりの無い記事で申し訳ないです。
Raspberry Pi Model B+にArch Linux ARM(カーネル3.12.26-1-ARCH)をインストール
Raspberry Pi Type B+買いました
連休に入りました。
連休に入って、こっそりシコシコとアレをナニしてるわけなんですが、進捗ダメですと思われないために、ここらで進捗出しておこうかと…。
Raspberry Pi Type B+買いました。
旧TypeBとの違いは、そこら中で取り上げられているのですが、あまり知られていなく、ものすごく地味にムカつく違いだけ、ちょっと紹介しておきます。
穴
Type Bの場合、M3ネジが通るので、PC自作er御用達なマザボに使うネジ類が使えたわけで、Type B+の場合、何故かM3ネジが通らず、恐らく、M2.6になっている。なんでそんな微妙なサイズにしたのか…。
結局、穴をヤスリで広げてM3ネジ通すようにしたんだけど、M3ネジを止めてみると、microUSBコネクタと干渉したり、チップ抵抗に接触したりと、割と地味にファッキンな仕様になっていました。
まぁそれはさておき、、これを機に、Archをインストールすることになって、Arch ARMを覗くと、またセットアップ方法が変わってたので、自分の防備録として、残しておきたいと思った。
毎回恒例、公式リンク。一番確実なので、以下を参考に。(日本語ページは若干古いので注意)
http://archlinuxarm.org/platforms/armv6/raspberry-pi
https://wiki.archlinux.org/index.php/Raspberry_Pi
前提環境
マシン: Macbook Air 2011 Mid
OS: Arch Linux(3.15.7-1-ARCH)
SDカードの作成(PC側)
作業用ディレクトリ作成
$ mkdir raspberrypi $ cd raspberrypi $ mkdir boot $ mkdir root
最新のArchARMを取得
$ wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
SDカードの場所を確認
$ lsblk
SDカードの準備(以降rootユーザ) bootパーティションは100MBのFAT32形式、rootパーティションは残り容量でLinux File System形式でパーティションを作成。
$ su # fdisk /dev/sdc Welcome to fdisk (util-linux 2.24.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): p Disk /dev/sdc: 29.2 GiB, 31322013696 bytes, 61175808 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x9686be27 Command (m for help): o Created a new DOS disklabel with disk identifier 0x07befaf8. Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): First sector (2048-61175807, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-61175807, default 61175807): +100M Created a new partition 1 of type 'Linux' and of size 100 MiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): c If you have created or modified any DOS 6.x partitions, please see the fdisk documentation for additional information. Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): Using default response p. Partition number (2-4, default 2): First sector (206848-61175807, default 206848): Last sector, +sectors or +size{K,M,G,T,P} (206848-61175807, default 61175807): Created a new partition 2 of type 'Linux' and of size 29.1 GiB. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
SDカードのフォーマット bootパーティションは、FAT形式で、rootパーティションは、F2FSでフォーマットした。 ※ mkfs.f2fsは pacman -S f2fs-toolsでインストールすることで使えるようになる。
# mkfs.vfat /dev/sdc1 # mkfs.f2fs /dev/sdc2
SDカードをマウントし、ダウンロードしたArchARMをマウント先に展開
# mount /dev/sdc1 boot # mount /dev/sdc2 root # tar -xf ArchLinuxARM-rpi-latest.tar.gz -C root # sync # mv root/boot/* boot
rootfstypeをF2FSに変更し、Raspberry Piからrootパーティションを読み込めるようにする
# vi boot/cmdline.txt 変更前 elinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=noop rootwait 変更後 elinux=0 plymouth.enable=0 smsc95xx.turbo_mode=N dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=f2fs elevator=noop rootwait
SDカードをマウント解除
# umount boot root
作成したSDカードをRaspberry Piに挿し、電源を入れ、Raspberry PiにSSHでログイン
$ ssh root@192.168.0.6 password: root
rootパスワードを変更
# passwd
なぜか、デフォルトのGeo-IPのミラーが繋がらなかったので、USミラーを選択した
# vi /etc/pacman.d/mirrorlist
毎回恒例
# rm /etc/localtime # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # echo [hostname] > /etc/hostname # vi /etc/hosts
ネットワーク接続を、有線LANで、静的IPを設定
# cd /etc/netctl # cp examples/ethernet-static my_network
# vi my_network Description='A basic static ethernet connection' Interface=eth0 Connection=ethernet IP=static Address=('192.168.0.11/24'') #Routes=('192.168.0.0/24 via 192.168.1.2') Gateway='192.168.0.1' DNS=('192.168.0.1') ## For IPv6 autoconfiguration #IP6=stateless ## For IPv6 static address configuration #IP6=static #Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96') #Routes6=('abcd::1234') #Gateway6='1234:0:123::abcd'
※後から分かったことで、本バージョンから、デフォルトのDHCP接続が、netctl-ifplud@eth0.serviceではなくなっている様子。どこで設定してあるか後で調べて切っておく。
# systemctl disable netctl-ifplugd@eth0.service # systemctl enable netctl-ifplugd@my_network.service # netctl enable my_network
設定ミスってて、後から繋がらないってなると泣きそうになるので、一旦ここで再起動
# reboot
設定したIPで、再度接続
$ ssh root@192.168.0.11
Raspberry Pi用に、パッケージを最新化し、必要なパッケージをインストール。
※ここは、任意。とりあえずデスクトップな環境であれば、以下の通り。
# pacman -Syu # pacman -S sudo alsa-utils alsa-firmware alsa-lib alsa-plugins xf86-video-fbdev xf86-input-synaptics raspberrypi-firmware raspberrypi-firmware-tools git
ユーザを作成
# useradd -m -g users -G wheel -s /bin/bash morinezumiiii # passwd morinezumiiii # gpasswd -a morinezumiiii audio # gpasswd -a morinezumiiii video # gpasswd -a morinezumiiii uucp # gpasswd -a morinezumiiii tty
sudoerファイルを編集
# visudo
以降、通常ユーザで。
# exit
$ ssh morinezumiiii@192.168.0.11
Raspberry Piなアプリケーション(raspividとか)のPATHを通す
$ vi ~/.bash_profile export PATH=$PATH:/opt/vc/bin $ source ~/.bash_profile $ vcgencmd version Jul 23 2014 21:12:29 Copyright (c) 2012 Broadcom version 174cdd77563b98023955a94cb8d072d9c7095d6f (clean) (release)
ちなみに、ここ2ヶ月くらいで、ラズパイに使ったSDカード3枚くらいぶっとびました。
そもそも書き込み回数1万回程度って書いてあるSDカードにOS入れて動かすって事自体が、「んー…」な感じなんだけど、とりあえず、ファイルシステムをExt4からF2FSに、スワップ領域を無くし、ログ書き込み先をtmpfsにすることで、ほんの少しでも、延命できるかなと、淡い期待を抱いてる。
ゆくゆくは、ちゃんとramfsにするなり、ストレージは別で用意するなりしたいなぁと思う。
以上、お疲れ様でした。
$ exit