Nexus 5x が再起動し続ける自体に陥った。どうにかして直した。
Nexus 5x が起動しない...
1 年半くらい前から使っている Nexus 5x。
最近なんか調子が悪いなぁとは思っていました。
今日も、電話をかけようとしたらフリーズ。
「あぁ、またか」
と思い、電源ボタンを長押し。
リブート。
Google のロゴが出ます。
さ~て次は Google ロゴが踊って、解除パターンの入力だ。
と思っていたら画面が消えました。
ん?
もう一度、Google のロゴが出ます。
あぁ、見間違いだったか。
次こそ。。。
画面が消えました。
ん?
もう一度 (以下省略
というわけで、Google のロゴが出ては消えるという無限ループに陥ってしまいました。
復帰方法を探す
困ったときは結局 Google 先生ということで、Google 先生に聞いてみました。
"Nexus 5x" "再起動し続ける" とか、日本語キーワードで検索してしまうと、
「電池パックを外して付け直す」
という非常に胡散臭い復帰方法ばかりが出てきます。
いやいや、そうじゃないでしょう...
改めて "Nexus 5x" "boot" などで検索してみたら
"Android boot loop"
なる単語が出てきました。まじか。
いろいろ調べてみると、とにかくリカバリーモードに入るのが良さそう。
リカバリーモードに入るには、ボリューム下ボタンを押しながら電源を入れます。
こうすると Fast boot なる画面が出てきます。
この状態でボリューム下ボタンを 2 回押すと、"Recovery mode" と表示されます。
ここで電源ボタンを押すとリカバリーモードに入れる。
はずなんです。
しかし、ここでもまた問題が。
リカバリーモードに入るはずが、また Boot loop に戻ってしまいました。
これでは手のうちようがありません。
諦めきれずに、しばらく放置・充電して何度もトライしたら、ついに入れました。
以下のような表示とともに。
うんともすんとも言いません。
これは打つ手なしか...
しかし諦めきれずに調べ続けたら、ついに復帰方法にたどり着きました。
復帰方法
基本的にはここに書かれているとおりです。
Applying a Rescue OTA to a Nexus 5X.pdf - Google ドライブ
内容は同じことを書くのですが、リンク先は英語なので、日本語訳だけでも価値があるかもしれません。
ということでただの翻訳 + かなり省略しますが、手順を書き残しておきたいと思います。
なおこの手順には PC が必要になります。
私の環境は Windows 10 です。
もし違う OS の場合は、また別の手順が必要かもしれません。
PC に ADB と Fastboot のダウンロード
まず最初に ADB と Fastboot というツールを以下のリンクから落とします。
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
これを適当なディレクトリで展開します。
そこまでできたら、システムの環境変数 PATH に、上記のディレクトリを追加します。
環境変数の追加手順は以下のサイトなどを見ればよいかと
www.wannko.net
正しくできているかどうか確認するには、コマンドプロンプトで以下のコマンドを叩いてみましょう。
>adb version Android Debug Bridge version 1.0.39 Revision 3db08f2c6889-android Installed as C:\tool\adb\adb.exe
このように何らかの返事が返ってくれば OK です。
Nexus 5x をリカバリーモードにする
上記の通り、まずはボリューム下ボタンと電源ボタンを長押しします。
Fastboot が起動したら、ボリューム下ボタンを2回押して、Recovery mode のところで電源を押します。
No command 画面が出たら、以下のようにボタンを押します。
1. 電源ボタンを押した状態で保持する
2. ボリューム上ボタンを押して、離す
3. 電源ボタンを離す
こうすると No command 画面を離れて、リカバリーモードに入れます!
ここで 3 行目に以下のような表示があると思います。
7.1.2/N2G47Z/4045513
この "N2G47Z" の文字を覚えておきましょう。
次の手順で必要になります。
PC に OTA イメージをダウンロードする
以下のリンクから、OTA イメージというものをダウンロードします。
Full OTA Images for Nexus and Pixel Devices | Google APIs for Android | Google Developers
Nexus 5x の項目から、上記の手順で得た "N2G47Z" に対応するリンクをクリックします。
そうすると 1.2 GB くらいのファイルが落ちてくるので、適当なところに置きます。
ADB update の実行
ここまできたら、Nexus 5x と PC を USB で接続します。
次に Nexus で "Apply update from ADB" を選択します。
この時点で PC から Nexus が見えているかどうかは、以下のコマンドで確認できます。
>adb devices List of devices attached 0082*** sideload
sideload の左側には、Nexus 5x のシリアル番号が表示されます。
なので人によって違うはずです。
見えていれば、次のステップに進みましょう。
PC で、先程ダウンロードした OTA イメージがあるディレクトリで、以下のコマンドを叩きます。
>adb sideload bullhead-ota-n2g47z-07a2c0b4.zip
bullhead-*** は、ダウンロードしたファイル名です。
このコマンドが通れば、進捗状況が表示されるはずです。
Raspberry pi で SSH ログアウト後もプロセスを残したい
作業の途中で SSH ログアウトしたい...
前回の記事で、Raspberry pi を Radius サーバーとして活用する方法をご紹介しました。
こんなふうに大量の作業をするときは、一時中断するために SSH からログアウトすることもあります。
コンフィグファイルなど、ファイルに書き込むような作業はログアウトしても問題ありませんが、たとえば Python スクリプトを走らせっぱなしにしてログアウトすると、Python プロセスが終了してしまいます。
それを避けるために 2 つの方法を試しました。
SSH ログアウト後もプロセスを残す方法
1. screen コマンドを使う
Linux では仮想端末を作成する screen というコマンドがあります。
「SSH をログアウトしても仮想端末を残す」ことで、仮想端末上にプロセスを残すことができます。
askubuntu によれば、tmux というコマンドのほうが良いぜ!ということらしいのですが、Raspberry pi 上に入れるのに一苦労しそうだったので、まぁ良いかということで screen にしました。
インストール
apt-get でインストールするだけです。
$ sudo apt-get install screen
プロセスの残し方
基本的には以下の流れがすべてです。
1. screen を起動する
$ screen
2. 所望のプロセスを起動する
3. Ctrl + A、Ctrl + D をタイプする
これで、所望のプロセスが起動したまま、仮想端末から抜ける (デタッチ) ことができます。
抜けた後で SSH ログアウトしても、仮想端末が残っているのでプロセスも残る、というわけです。
ちなみに、またこの仮想端末に入るときは
$ screen -r
とすれば OK です。
その他の screen コマンド
いくつか便利なコマンドを紹介します。
- screen を起動するときに出るメッセージを消す
- screen -q
- 仮想端末のリストを出す
- screen -list
- 該当する仮想端末にアタッチする
- screen -r [プロセス番号]
- 該当する仮想端末を削除する
- screen -X -S [プロセス番号] quit
- コマンドのヘルプを見る
- screen -h
その他、以下のサイトに詳しく紹介してくれています。
2. シリアルを使う
Raspberry pi はシリアル接続でコマンドを投げることもできます。
「SSH ログアウト後」という趣旨とはちょっと違いますが、そもそも SSH/ネットワークを使わなければプロセスはそのまま残る、ということで、この方法も紹介しておきます。
なお PC とシリアル接続をするには、USB シリアル変換とジャンパーケーブルが必要です。
自分は以下の製品を使っています。
[スイッチサイエンス] FTDI USBシリアル変換アダプター Rev.2
- 出版社/メーカー: スイッチサイエンス
- メディア: その他
- この商品を含むブログを見る
- 出版社/メーカー: スイッチサイエンス
- メディア: エレクトロニクス
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
Raspberry pi のシリアルを有効にする
まず最初に、Raspberry pi のシリアルを使えるようにしてあげる必要があります。
なお Raspberry pi のモデルや OS バージョンによって、微妙にやり方が異なるようです。
自分が使っているのは Raspberry pi 3 model B で、OS は Raspbian Jessie 8.0 (2017/07/05) です。
ここは SSH にログインしてやりましょう。
$ sudo raspi-config
5. Interfacing Options を選択します。
P6 Serial を選択し、Yes にします。
そのあとリブートすれば、シリアルが有効になります。
Raspberry pi との接続
以下のように Raspberry pi と USB シリアル変換を接続します。
Raspberry pi 3 model B でやっていますが、他のモデルだと配置が違うと思うのでご注意ください。
Raspberry pi --- USB Serial 6 (GND) - GND 8 (UART TX) - RX 10 (UART RX) - TX
TX と RX を接続することに注意が必要です。
TX 同士、RX 同士をつないでも送受信できません。
また、スイッチサイエンスの USB シリアル変換モジュールは 5V/3.3V の両対応になっており、ジャンパで切り替えられます。
Raspberry pi は 3.3V なので、あらかじめ 3.3V 側にジャンパしておきましょう。
最後に PC と USB シリアル変換モジュールを USB でつなげば完了です。
ドライバは勝手にインストールされる、と思います。
シリアル接続の良いところは、余計なコマンドを叩かなくても良いことですね。
忘れっぽい自分に合ってます。
デメリットはもちろん外部モジュールが必要なことですが...
Raspberry pi を RADIUS サーバーにしたい
Wi-Fi でつなぐ端末も管理したい...
前回の記事で、クローズネットワーク内に Raspberry pi を置いて、NAT ルーター兼 DHCP + DNS サーバーにしました。
ただこのままだと端末を有線でつなぐ必要があるので、Raspberry pi の下にアクセスポイントを置くことにしました。
アクセスポイントのセキュリティ方式にはいくつかありますが、Raspberry pi がネットワークを管理しているような状態なので、Wi-Fi の認証も Raspberry pi にやらせることにしました。
方式は WPA Enterprise で、Raspberry pi を RADIUS サーバーにします。
ネットワークの完成イメージ
Raspberry pi の配下にアクセスポイントを追加し、Wi-Fi での接続機能を付加します。
この Wi-Fi で接続できる端末認証を Raspberry pi に持たせるようにします。
以下の YouTube 映像が、今回の動作イメージです。
www.youtube.com
なお、この映像のとおりにやると、認証方式が freeradius デフォルトの "MD5" になります。
これは脆弱性が指摘されている方式のため、今回は "PEAP" という方式でセットアップします。
認証方式については以下のサイトが詳しいです。
必要な部品
WPA/WPA2 Enterprise に対応したアクセスポイントが必要です。
自宅では TP-Link を使っています。
(別にこのメーカー、機種でなくても良いですが、一例です)
TP-Link 無線LANルーター 11ac/n/a/g/b 866+300Mbps デュアルバンド ギガビット 3年保証 Wi-Fiルーター Archer C55
- 出版社/メーカー: TP-LINK
- 発売日: 2016/11/24
- メディア: Personal Computers
- この商品を含むブログを見る
Raspberry pi の設定
Raspberry pi のモデル、OS
使用しているのは、前回の記事と同じく Raspberry pi 3 model B です。
OS は Raspbian Jessie Lite です。
freeradius のセットアップ
Linux 系で有名な RADIUS サーバーは freeradius のようなので、このライブラリを使うことにします。
インストール
まずは、必要なパッケージをインストールします。
$ sudo apt-get install freeradius freeradius-mysql apache2 php5 libapache2-mod-php5 mysql-server mysql-client php5-mysql php-pear php5-gd php-db
MySQL を使用したユーザー管理
freeradius のユーザーデータベースは、デフォルトではファイルに平文で管理されています。
これを MySQL を用いた管理に変更したいと思います。
まずは /etc/freeradius/radiusd.conf を編集します。
$ sudo emacs /etc/freeradius/radiusd.conf
以下の 2 行がそれぞれコメントアウトされているので、"#" を削除します。
# $INCLUDE sql.conf # $INCLUDE sql/mysql/counter.conf
次に、/etc/freeradius/sql.conf を編集します。
$ sudo emacs /etc/freeradius/sql.conf
以下の部分を、所望の形になるように編集します。
これらは、あとで設定する MySQL のデータベースと同じになるようにします。
server = "localhost" #port = 3306 login = "radiususer" password = "radius_password" # Database table configuration for everything except Oracle radius_db = "radiusdb"
最後に、/etc/freeradius/sites-enabled/default を編集します。
$ sudo emacs /etc/freeradius/sites-enabled/default
以下の "sql" がコメントアウトされているので、"#" を削除します。
# See "Authorization Queries" in sql.conf sql # See "Accounting queries" in sql.conf sql # See "Simultaneous Use Checking Queries" in sql.conf sql # See "Authentication Logging Queries" in sql.conf sql
MySQL データベースの作成
上で sql.conf に設定したものと同じように、MySQL のデータベースを作成します。
$ mysql -u root -p mysql>create database radiusdb; mysql>exit;
データベースの設定の雛形は、freeradius のディレクトリ配下にあります。
これを radiusdb に流し込みます。
読み取り権限がついていないファイルだったので、最初に権限を付加しています。
$ sudo chmod +r /etc/freeradius/sql/mysql/schema.sql $ mysql -u root -p radiusdb < /etc/freeradius/sql/mysql/schema.sql
freeradius ライブラリが使用するユーザーを追加します。
こちらも sql.conf に記載したものと同じようにします。
$ mysql -u root -p mysql>CREATE USER 'radiususer'; mysql>SET PASSWORD FOR 'radiususer' = PASSWORD('radius_password'); mysql>GRANT ALL ON radiusdb.* to 'radiususer'; mysql>exit;
ユーザーの作成
MySQL データベースに、ユーザーを追加します。
ユーザーごとに動作を変えることもできるようなのですが、今回はとりあえず追加だけにしました。
詳しくは公式ページの How Toをご覧ください。
まずは作ったデータベースに接続し、テーブルを確認します。
$ mysql -u root -p mysql> connect radiusdb; mysql> show tables; +--------------------+ | Tables_in_radiusdb | +--------------------+ | radacct | | radcheck | | radgroupcheck | | radgroupreply | | radpostauth | | radreply | | radusergroup | +--------------------+ 7 rows in set (0.00 sec)
このうち、ユーザーは radcheck で管理されます。
テーブルの書式を describe で確認します。
mysql> describe radcheck; +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(64) | NO | MUL | | | | attribute | varchar(64) | NO | | | | | op | char(2) | NO | | == | | | value | varchar(253) | NO | | | | +-----------+------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
たとえば、
- User ID: test_user
- Password: test_pass
と設定したければ、それぞれ以下のように設定するようです。
- id: 任意のユニーク値
- username: test_user
- attribute: Cleartext-Password
- op: :=
- value: test_pass
したがって以下のようにユーザーを追加します。
mysql> insert into radcheck values(1, 'test_user', 'Cleartext-Password', ':=', 'test_pass'); Query OK, 1 row affected (0.02 sec) mysql> select * from radcheck; +----+-----------+--------------------+----+-----------+ | id | username | attribute | op | value | +----+-----------+--------------------+----+-----------+ | 1 | test_user | Cleartext-Password | := | test_pass | +----+-----------+--------------------+----+-----------+ 1 rows in set (0.00 sec)
アクセスポイントとの接続設定
アクセスポイントの IP や、認証の際に使用する secret (パスワード) を設定します。
まず最初に /etc/freeradius/clients.conf を編集します。
$ sudo emacs /etc/freeradius/clients.conf
このファイルの適当なところに、サーバー情報を記載します。
いろいろな書き方があるようで、clients.conf にはいくつか例が記載されています。
ここでは、アクセスポイントは 192.168.0.0/24 配下にあり、secret は somesecret としました。
この secret は、アクセスポイントにも同じキーワードを設定する必要があります。
client 192.168.0.0/24 { secret = somesecret shortname = radius_wlan_guest }
PEAP 認証の設定
デフォルトでは MD5 形式になっている認証を、PEAP に変更します。
まず /etc/freeradius/eap.conf を編集します。
$ sudo emacs /etc/freeradius/eap.conf
このファイル内に default_eap_type というところがあります。
そこを md5 から peap に変更します。
default_eap_type = peap
次に /etc/freeradius/modules/mschap を編集します。
$ sudo emacs /etc/freeradius/modules/mschap
以下の部分を編集します。
use_mppe = yes require_encryption = yes require_strong = yes with_ntdomain_hack = yes
最後に /etc/freeradius/sites-enabled/inner-tunnel を編集します。
$ sudo emacs /etc/freeradius/sites-enabled/inner-tunnel
# See "Authorization Queries" in sql.conf sql # See "Simultaneous Use Checking Queries" in sql.conf sql # See "Authentication Logging Queries" in sql.conf sql
サーバー証明書の作成
PEAP 認証ではサーバー証明書が必要になります。
本当は、信頼できる証明書が取得できれば一番良いのですが、個人レベルでの取得は難しそうなので、自作証明書を作ります。
freeradius では証明書を簡単に作れるサンプルがありますので、それを使います。
必要なファイルは /usr/share/doc/freeradius/examples/certs 以下にあるので、それを freeradius 以下にコピーします。
cd /usr/share/doc/freeradius/examples/certs sudo cp Makefile ca.cnf server.cnf xpextensions /etc/freeradius/certs cd /etc/freeradius/certs
ca.cnf と server.cnf を同じように編集します。
パスワードや国、地域は任意で設定してください。
[ CA_default ] default_days = 1826 # 5 years [ req ] input_password = your_inputoutput_password output_password = your_inputoutput_password [certificate_authority] countryName = JP stateOrProvinceName = somestate localityName = yourtown organizationName = yourorg emailAddress = mail@yourdomain.com commonName = "some cool short desription"
ca.cnf と server.cnf が編集できたら、make します。
sudo make all
最後に、/etc/freeradius/eap.conf を編集します。
$ sudo emacs /etc/freeradius/eap.conf
さきほど証明書のところで設定したパスワードを、eap.conf の private_key_password に設定します。
private_key_password = your_inputoutput_password
freeradius の起動
編集が終わったので、freeradius を再起動します。
普通に再起動するときは
$ sudo service freeradius restart
デバッグモードで起動するときは、
$ sudo service freeradius stop $ sudo freeradius -X
となります。
アクセスポイントの設定
アクセスポイント側では以下の項目を設定します。
機種によって文言は違うかもしれませんが、だいたいこんな感じかと思います。
- セキュリティ: WPA-Enterprise (もしくは WPA2-Enterprise)
- RADIUS サーバー IP: Raspberry pi の IP
- RADIUS サーバーポート: 1812
- RADIUS シークレット (パスワード): /etc/freeradius/clients.conf の secret に設定した値
これで、アクセスポイントとの接続設定ができているはずです。
freeradius をデバッグモードで起動し、Wi-Fi で端末を接続してみると、メッセージが出ていると思います。