3Dプリンタサーバとして使っていたRaspberryPi2が、ある日突然応答しなくなりました。
どうやらSDカードが寿命を迎えたらしい・・・。
2年程前に作ったイメージファイルからのリストアも考えましたが、RASPBIANがメジャーバージョンアップしてJESSIEからSTRETCHになったという事もあり、今回はゼロからのクリーンインストールをすることにしました。
勿論、物ぐさ太郎として、今回もキーボードもモニタも繋がずにセットアップしております。
こういう作業って、たまにやっておかないと忘れてしまうのよね。(^^;)
ということで、今回は自分への備忘録としてセットアップおさらい記事です。
以前のPi ZeroとJESSIE LITEでの記事はコチラ↓
対象環境
対象ハードウェア: RaspberryPi 2/3、GW-450D2
今回はARMv7コアのRaspberry Pi 2/3で試してます。
最近は「日本製」なんてのもあるのね。
尚、ARMv6コアのPi Zeroだと別な手法が必要かもしれません。(いずれ試してみようと思います)【2017/09/18追記】Pi Zeroで試してみました。コチラを参照下さい。
5GHz WiFiな無線LANドングルはお馴染みの11ac対応GW-450D2です。(旧版のGW-450Dでも動きました)
microSDカードは信頼?の東芝製 8GBです。
64GBも当たり前なこのご時世になぜ8GBかというと、環境構築したSDをWin32DiskImagerでイメージごとNASへバックアップしておりまして、SDの容量デカいとその分NASのストレージを圧迫するので環境構築時は出来るだけ小さい容量が望ましい・・・という事情です。
ちなみに、Win32DiskImagerでのイメージ書き込みで復元する際に、SD容量小→大の書き込みは可能。(当然、逆はNG)
なので、後から実用する予定の16GBや32GBのSDに、バックアップしておいた8GBのイメージを書き込んで、RASPBIAN上で容量拡張する手法を取ってます。(容量拡張は raspi-config 内のメニューより実行可能です)
対象RASPBIAN: STRETCH LITE
2017/8月、2年サイクルのメジャーバージョンアップとしてRASPBIAN STRETCHがリリースされています。
ということで、今回は最新のSTRETCHを使う事にします。(9/6時点では、8/16付け版が最新でした)
事前に公式↓からダウンロードしておいてください。
尚、LITE版なのは、個人的にGUIデスクトップ環境は使う予定が無いので、出来るだけ軽くしたいという事情からです。
カーネルは同じでしょうから、RASPBIAN STRETCH WITH DESKTOP版でも同じ手法が使えるとは思います。(試してはないですが。。)
作業概要
当ブログへリンクを下さったコチラ↓の記事内容がきっかけです。
カーネルのフルビルド無しで、モジュールビルドする方法があるんですねぇ。(情報有難うございました)
ただ、日が経ってVerなどの環境が変わったせいか、先の記事通りだと若干躓いた部分もあったので、改めて自分用におさらいとして下記に纏めてみました。
大雑把な流れはこんな感じです。
- microSDカードへRASPBIAN STRETCH LITEを書き込む
- 有線LANでSSH接続して初期設定
- Linuxソースのダウンロードと関連モジュールのビルド
- ドライバソースへのパッチ当てとビルド&インストール
- 無線LANの接続設定
所用時間はPi2で1時間強といったところでした。カーネルフルビルドするより圧倒的に速い。凄い!!
尚、前置きでも書きましたが、物ぐさ太郎の矜持として、RaspberryPiへは何も繋がず、キーボード、モニタレスでセットアップ作業しております。(だって、モニタ繋ぐの面倒なんだもん)
なので、事前にRaspberryPiの有線LANでのIPアドレス、無線LANドングルGW-450D2のIPアドレスは把握しておく必要が有ります。 ルーターなどで、MACアドレスからIPを固定割り当てする様にしておけば問題ないでしょう。
では、作業を始めましょう。
microSDカードへRASPBIAN STRETCH LITEを書き込む
イメージファイルの書き込み
公式からダウンロードしたRASPBIANをmicroSDカードへ書き込みます。
私は、イメージ書き込みには「Win32DiskImager」というアプリを使っておりますが、使用方法が分からない場合は、コチラ↓を参考に。
SSH接続の為の事前準備
最近のRASPBIANでは、そのままだとSSH接続が使えない状態になっています。(セキュリティ対策の一環??)
コチラによると、microSDカードの/boot/直下にsshという名前で拡張子無しの空ファイルを作っておけば、RaspberryPiで起動させた際に自動的にSSH接続が有効になるみたいなので、PCから外す前にファイルを作っておきましょう。
有線LANでSSH接続して初期設定
有線LANを繋いで起動させ、PCからSSH接続する
先程イメージファイルを書き込んだmicroSDカードを対象のRaspberryPiへセットし、有線LANを繋いだ状態で起動させます。
(写真では気が早くGW-450D2も繋いでおりますが、繋いだまま作業しても問題なしです)
ちなみに、左の木製(MDF)ケースと右の3Dプリンタ製ケースは、当ブログで公開しているオリジナルのPiケースです。
コチラ↓の記事で紹介しておりますので、ご興味あれば是非見て行ってください。(共にデータ公開中です)
閑話休題、作業を続行しましょう。
事前に判明している有線LANのIPアドレスに対し、PCからTera TermなどのターミナルソフトでSSH接続します。(正しいIPアドレスで、先のSSH有効化処置を行ってあれば、ちゃんと繋がる筈です)
ターミナルソフトが分からない方は、コチラ↓を参考に。
初期設定を行う
SSH接続で初期ユーザー「pi」でログインしているものとします。
下記コマンドで初期設定を行います。
$ sudo raspi-config
下記の項目を修正してください。
[Change User Password]
「pi」ユーザーのパスワードをデフォルトのまま使うのは、セキュリティリスクとなります。
後ほど、ユーザー名を「pi」から変更する作業なども行いますが、初期工程は「pi」ユーザーで進めますので、最初にデフォルトパスワードを変更しておきましょう。
[Localisation Options] ->[Change Locale]
「en_us.UTF-8」「ja_jp.UTF8」「ja_jp.EUC-JP」を追加して、
default system localを「ja_ja.UTF8」に変更します。
[Localisation Options] ->[Change Timezone]
「Asia」→「Tokyo」を選択。
[Localisation Options] ->[Change WiFi Country]
「JP Japan」を選択。
以上の項目を修正したら、Finishを選んで再起動しましょう。
一通りアップデートを掛ける
再起動後、もう一度「pi」ユーザーでSSH接続します。(パスワード変更した場合は新しいパスワードを入れて下さい)
まずは、下記コマンドで一通りアップデートをしておきます。
$ sudo apt-get update $ sudo apt-get -y dist-upgrade $ sudo rpi-update
【2018/2/25追記】 rpi-updateでカーネルバージョンを上げると後半で上手く行かなくなることが分かりました。(詳しくはコメント欄参照)
以前は問題なかったのですが、最近のカーネルバージョンだと問題が出る様です。
取り敢えず使いたい方は、3行目のrpi-updateを掛けないで実行してみてください。
rebootを促されるので、一応再起動しておきましょう。
$ sudo reboot
もう一度「pi」ユーザーでSSH接続し、下記コマンドで必要なプログラムをインストールします。
$ sudo apt-get install gcc make bc screen ncurses-dev git
Lunixソースのダウンロードと関連モジュールのビルド
カーネルバージョンを確認する
下記コマンドでカーネルのバージョンを確認します。
$ uname -r
2017/09/06時点では、「4.9.47-v7+」と返ってきました。
カーネルソースと関連モジュールを用意する
作業フォルダへ移動します。
$ cd /usr/src
カーネルソースを取得します。もし先に「uname -r」で確認したカーネルバージョンが4.9系列じゃなければ、赤字部分をバージョンに合う様に修正しましょう。
$ sudo wget https://github.com/raspberrypi/linux/archive/rpi-4.9.y.tar.gz
一緒に、モジュールチェックファイルも取得します。
$ sudo wget https://github.com/raspberrypi/firmware/raw/master/extra/Module.symvers
先程取得したカーネルソースを展開します。(赤字部分は先程のバージョンに合う様に修正しましょう)
$ sudo tar xvfz rpi-4.9.y.tar.gz
シンボリックリンクを作成します。(赤字部分は先程のバージョンに合う様に修正しましょう)
$ sudo ln -s /usr/src/linux-rpi-4.9.y/ /lib/modules/`uname -r`/build
モジュールビルド用フォルダに移動します。
$ cd /lib/modules/`uname -r`/build
makeコンフィギュレーションを初期化します。
$ sudo make mrproper
暫し待たされます・・・。
ちなみに、コチラによると、このコマンド中のmrproperというのは、欧州で知られてるMr.Properというクリーニング製品の名前にちなんだものだそうです。「cleanより綺麗になる」という意味合いなのかな?(笑)
config.gzを準備します。
$ sudo modprobe configs
コンフィギュレーションを作成します。
$ sudo sh -c 'gzip -dc /proc/config.gz > .config'
バージョンチェックで刎ねられない様に、作成したコンフィギュレーションを修正する。(赤字部分は先程のカーネルバージョンに合う様に修正しましょう)
$ sudo sed -i 's/CONFIG_LOCALVERSION="-v7"/CONFIG_LOCALVERSION="-v7+"/' /lib/modules/`uname -r`/build/.config
ちなみに、参考にさせて頂いた記事にはこの作業はありませんでしたが、私の環境では後半のismodの工程でERRORが返ってきましたので、コチラ↓を参考にこの対策を追加しました。
尚、この対策でバージョンを合わせるだけでは不十分らしく、モジュールチェックファイルを入手してから、コンフィギュレーションの作成をする様も手順変更してあります。(本記事は修正後の手順になってます)
関連ファイルをmakeします。
$ sudo make modules_prepare
暫し待たされます・・・。
ドライバソースへのパッチ当てとビルド&インストール
Planex公式ドライバを入手する
コチラ↓から、GW-450DのPlanex公式Linux用ドライバをダウンロードします。
取得したzipファイル中の「mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2」を、RaspberryPiへscpコマンドなどで転送します。 (Tera Termの場合は、対象のzipファイルをターミナルウィンドウへドラッグアンドドロップするとダイアログが出ますので、SCPボタンをクリックすればファイルが転送されます)
デフォルトだと、/home/pi/に転送されますので、確認します。
$ cd /home/pi $ ls
「mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2」がちゃんと存在するか確認した後、解凍します。
$ sudo tar xvjf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
Planex公式ドライバのソースにパッチをあてる
このPlanexドライバはそのままでは使えず、ソースファイルの修正が必要なのですが、修正用パッチを公開されてる方がいらっしゃいますので、有り難く使わせて頂く事にします。ありがたや~
ドライバ修正パッチを取得します。
$ git clone https://gist.github.com/moutend/cb35a37297910c99d3e2 gist
そのままだと、何故か$HOMEパスが通らないので、パッチを一部修正します。
$ vi ./gist/patch.sh
下記1行を追加して上書き保存します。
HOME=/home/pi
ドライバ修正パッチを実行します。
$ sudo ./gist/patch.sh
gcc-4.8を準備する
ドライバのコンパイルにはgcc-4.8あるいは4.9が必要です。
ただ、gcc-4.9だとエラーチェックが厳しくてコンパイルが通らない模様。参考にさせて頂いた記事では、4.9でも通る様にソース修正されてる様です。凄い!!
「なんだか負けたような気がする」という拘りは凄く共感出来るのですが、私は物ぐさな気持ちの方が勝ってしまいまして・・・gcc-4.8でも通るなら良いか・・・ということで、本記事では4.8のままとしています。 悪しからずご了承下さい。m(__)m
ということで、gcc-4.8を取得します。
$ sudo apt-get -y install gcc-4.8
続いて、gcc-4.8の優先度を変更します。
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60
ちゃんと、gcc-4.8が優先になったかを確認します。
$ gcc --version | head -n 1
2017/09/06時点では、「gcc (Raspbian 4.8.5-4) 4.8.5」と返ってきました。
ドライバをビルドし、ロードする
ドライバのファイルがあるディレクトリへ移動します。
$ cd ./mt7610u_wifi_sta_v3002_dpo_20130916/
続いて、make。
$ sudo make
ちょっと待たされます。 Pi3だと4分程度、Pi2だと10分程度待たされました。
インストールします。
$ sudo make install
モジュールをロードします。
$ sudo insmod /lib/modules/`uname -r`/kernel/drivers/net/wireless/mt7650u_sta.ko
カーネルの依存関係情報の更新。
$ sudo depmod -a
エディタで、/etc/modulesに追記します。
$ sudo vi /etc/modules
mt7650u_sta
無線LANの接続設定
ネットワーク設定を行う
$ sudo sh -c 'wpa_passphrase SSID パスフレーズ >> /etc/wpa_supplicant/wpa_supplicant.conf'
尚、このwpa_passphraseコマンドは、パスフレーズを暗号化してくれるのは良いのですが、何故か暗号化されてない平文のパスフレーズをそのまま併記してくれるとても親切且つ危険なコマンドなので、作成された「wpa_supplicant.conf」ファイルの平文部分を削除しておいた方が良いです。
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
$ sudo vi /etc/network/interfaces
auto ra0 allow-hotplug ra0 iface ra0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
$ sudo shutdown -h now
おまけ:セキュリティ対策とスピードテスト
rootパスワード設定
$ sudo passwd root
ユーザー名「pi」をオリジナルのユーザー名へ変更
$ sudo vi /etc/ssh/sshd_config
PermitRootLogin yes
$ sudo service ssh restart
$ exit
# usermod -l newuser pi # usermod -d /home/newuser -m newuser # groupmod -n newuser pi
# vi /etc/ssh/sshd_config
PermitRootLogin yes
# service ssh restart
# exit
スピードテスト
折角、5GHz WiFiに接続したんですから、どれくらい速度出てるのか確認したいのが人情というもの。
コチラ↓の過去記事でその辺触れてますので、ご参考に。
【2017/09/19追記】
Pi2、Pi3それぞれで試してみました。
<Pi2&GW-450D2の場合>
Download: 81.95 Mbit/s
Upload: 85.33 Mbit/s
<Pi3&GW-450D2の場合>
Download: 94.75 Mbit/s
Upload: 87.12 Mbit/s
Pi2でもPi3でもそんなに値は変わりませんね。
謝辞
参考にさせて頂いた諸々のサイトリンクです。
カーネルのフルビルド無しでモジュールビルドする方法を参考にさせて頂きました。
初期にSSH接続出来ない際の対応方法として、参考にさせて頂きました。
insmodで「insmod: ERROR: could not insert module ・・・:Invalid module format」のエラーが出て困り果てた際に、参考にさせて頂きました。
Planexドライバのパッチを公開されている方、有り難く活用させて頂きました。
セキュリティ対策について、参考にさせて頂きました。
有難うございました。m(__)m
Raspberry Pi 3
microSD 8GB 東芝製
GW-450D2
コメント
こちらの記事を参考にGW-450D2のインストールを試みていますがうまくいきません。
具体的には、
$sudo insmod /lib/modules/`uname -r`/kernel/drivers/net/wireless/mt7650u_sta.ko
で
insmod: ERROR: could not insert module /lib/modules/4.14.18-v7+/kernel/drivers/net/wireless/mt7650u_sta.ko: Unknown symbol in module
というエラーが出ます。
Raspberry Pi3B
gccは4.8.5-4
カーネルは4.14.18
です。
GW-450D2はさした状態で、有線LAN接続しています。
Pi内蔵のwifiはONでもOFFでもうまくいきません。
/lib/modules/4.14.18-v7+/kernel/drivers/net/wireless/mt7650u_sta.koが存在していることは確認しています。
特定するのに他に必要な情報があればわかる範囲でお答えします。
何か心当たりのある点があれば教えていただけないでしょうか。よろしくお願いします。
箱作さん コメント有難う御座います。
私もinsmodの工程でERRORが返ってきて困ったことがありました。
記事中盤の「カーネルソースと関連モジュールを用意する」の後半に、
その時行った対応を書いております。
参考になれば幸いです。
レスをいただきありがとうございます。
紹介していただいたサイトを参考に uname -r と ドライバ(?)の vermagic を確認しましたが、どちらも4.14.18-v7+。
最後の+まで一致していました。
もう少しあがいてみて、ダメだったらカーネルのビルドからしてみることを検討しようと思います。
コンフィギュレーションの修正も行われたということですよね?
当時色々悩んだ挙句にこのプロセスに辿り着いたのですが、現状だと違うんですかね
むう・・・
おはようございます。
色々調べたところ、カーネル4.14.18にはなぜか__vfs_read()という関数が登録されておらず、そのせいでモジュールのロードに失敗したようです。
カーネルをアップデートする前の、4.9.59のイメージでこちらのページの通りにしたところ無事、インストールができました。
ただ、インストール後、カーネルをアップデートするとモジュールのロードに失敗するようで、当面はカーネルのアップデートはできなさそうです。
ドライバのソースをgrepしてもvfs_readがヒットしないのでどこで使われているのかはよく分かりませんでした・・・
箱作さん 追加検証有難う御座いますm(__)m
本日、私も改めてPi2で試してみましたが、
同じ様に「insmod: ERROR: could not insert module」が返ってきました。
私が試した時は、rpi-updateでカーネルが4.14.21-v7+になりましたので、
やや箱作さん検証時よりver進んでますが、恐らく同じ状況なのだと思います。
謎ですね・・・Linux難しい・・・(T_T)
今後、何か分かれば改めてコメントしますね。
取り敢えず、記事中には
「rpi-updateでカーネル更新すると上手く行かなくなる」
旨を追記しておきます。
コチラ↓によると、どうやらカーネル4.14以降で「__vfs_read」が使えなくなってるみたいですね。
https://github.com/zebulon2/rtl8812au-driver-5.2.9/commit/700398c2d50096a358b3968de7dcc6dc31244728
ドライバ修正パッチの1ファイル「rt_linux.c.patch」の中にて「__vfs_read」となってる箇所を「kernel_read」に変更すればOKな模様。(あるいは、os/linux/rt_linux.cの該当箇所を直接修正する)
一応、試してみましたが、insmodも無事に出来てGW-450Dでネットワークに繋がりました!!
申し訳ありませんが、
本日時間切れの為、また時間ある時に追証して、記事に対応方法を追記する予定です。
取り急ぎご一報まで。
こんばんは。
原因が分かりました。
エラーが”Unknown symbol in module”だったので、関数がないのでは?と思い、ログを確認したところ、
unknown symbol __vfs_read
とありました。
こちらのブログ(https://www.masm11.ddo.jp/~masm/tdiary/?date=20171207)でみると4.14ではなぜかシンボルが消えていると指摘しています。別の相談サイト(url失念)ではvfs_readは古いので使用は推奨されないと回答者が述べていました。
このせいかもしれませんが、4.14.xではモジュールの組み込みができないようです。
2017-11-29のイメージはカーネルが4.9.59なのでこちらを利用したところ正常にインストールできました。
もっともrpi-updateでカーネルのバージョンを上げるとモジュールが組み込まれなくなってwifiが機能しなくなるので、シンボルが復活するまで待つか、vfs_readの代わりの関数に書き換えて再コンパイルが必要そうです。
ただ、ドライバのソースをgrepしてもvsf_readが見つからなかったような・・・
2/23のこの箱作さんのコメントが自動スパム判定されて撥ねられておりました。
申し訳ありません。m(__)m
続きで頂いたコメントと表示の時系列がズレてしまいますが、一応このまま掲載しておきます。
現時点では、2/25の私のコメントが最終のモノになります。
恐らくこの時書いた方法で4.14以降へのカーネルアップデート後でも大丈夫だと思いますが、
もう少し追証出来たところで、記事へ反映させる予定です。
無線lanの接続設定のところでお聞きしたいのですが、自分の環境では暗号化方式にWEPを使用しているせいか、うまく動作しません。
もしWEPにも対応できる方法を知っていれば教えていただきたいです。
よろしくお願いします。
kuroさん コメント有難う御座います。
当方の環境がWEPでは無いので試してないですが、
「RaspberryPi WEP」で検索すると色々情報出て来ますので、探してみてください。
例えばコチラ↓とか
https://qiita.com/MII-CHANG/items/2b6c7fcb45364fabeca4
上手く接続出来ることをお祈りします。
(2.4GHzならまだしも、5GHz WiFi環境でWEPを使うのか疑問が残りますが・・・)