子育てしながらエンジニアしたい

現在 7 歳 女の子の子育て中エンジニアによる、技術系 + 日常系ブログ。

Nexus 5x が再起動し続ける自体に陥った。どうにかして直した。

Nexus 5x が起動しない...

1 年半くらい前から使っている Nexus 5x。
最近なんか調子が悪いなぁとは思っていました。

今日も、電話をかけようとしたらフリーズ。
「あぁ、またか」
と思い、電源ボタンを長押し。

リブート。

Google のロゴが出ます。

さ~て次は Google ロゴが踊って、解除パターンの入力だ。
と思っていたら画面が消えました。

ん?



もう一度、Google のロゴが出ます。
あぁ、見間違いだったか。
次こそ。。。

画面が消えました。

ん?



もう一度 (以下省略



というわけで、Google のロゴが出ては消えるという無限ループに陥ってしまいました。

復帰方法を探す

困ったときは結局 Google 先生ということで、Google 先生に聞いてみました。
"Nexus 5x" "再起動し続ける" とか、日本語キーワードで検索してしまうと、
「電池パックを外して付け直す」
という非常に胡散臭い復帰方法ばかりが出てきます。

いやいや、そうじゃないでしょう...

改めて "Nexus 5x" "boot" などで検索してみたら
"Android boot loop"
なる単語が出てきました。まじか。

いろいろ調べてみると、とにかくリカバリーモードに入るのが良さそう。
リカバリーモードに入るには、ボリューム下ボタンを押しながら電源を入れます。
こうすると Fast boot なる画面が出てきます。

f:id:edosha:20171127142947p:plain

この状態でボリューム下ボタンを 2 回押すと、"Recovery mode" と表示されます。
ここで電源ボタンを押すとリカバリーモードに入れる。

はずなんです。

しかし、ここでもまた問題が。
リカバリーモードに入るはずが、また Boot loop に戻ってしまいました。
これでは手のうちようがありません。

諦めきれずに、しばらく放置・充電して何度もトライしたら、ついに入れました。

以下のような表示とともに。

f:id:edosha:20171127143328j:plain

うんともすんとも言いません。
これは打つ手なしか...



しかし諦めきれずに調べ続けたら、ついに復帰方法にたどり着きました。

復帰方法

基本的にはここに書かれているとおりです。

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-*** は、ダウンロードしたファイル名です。
このコマンドが通れば、進捗状況が表示されるはずです。

100% までいったら、Nexus で "Reboot System now" を選択して完了!

Raspberry pi で SSH ログアウト後もプロセスを残したい

作業の途中で SSH ログアウトしたい...

前回の記事で、Raspberry piRadius サーバーとして活用する方法をご紹介しました。

edosha.hatenablog.jp

こんなふうに大量の作業をするときは、一時中断するために SSH からログアウトすることもあります。
コンフィグファイルなど、ファイルに書き込むような作業はログアウトしても問題ありませんが、たとえば Python スクリプトを走らせっぱなしにしてログアウトすると、Python プロセスが終了してしまいます。

それを避けるために 2 つの方法を試しました。

SSH ログアウト後もプロセスを残す方法

1. screen コマンドを使う

Linux では仮想端末を作成する screen というコマンドがあります。
SSH をログアウトしても仮想端末を残す」ことで、仮想端末上にプロセスを残すことができます。

askubuntu によれば、tmux というコマンドのほうが良いぜ!ということらしいのですが、Raspberry pi 上に入れるのに一苦労しそうだったので、まぁ良いかということで screen にしました。

askubuntu.com

インストール

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

その他、以下のサイトに詳しく紹介してくれています。

qiita.com


2. シリアルを使う

Raspberry pi はシリアル接続でコマンドを投げることもできます。
SSH ログアウト後」という趣旨とはちょっと違いますが、そもそも SSH/ネットワークを使わなければプロセスはそのまま残る、ということで、この方法も紹介しておきます。

なお PC とシリアル接続をするには、USB シリアル変換とジャンパーケーブルが必要です。
自分は以下の製品を使っています。

ジャンパワイヤ(オス?メス) 10本セット

ジャンパワイヤ(オス?メス) 10本セット

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 でやっていますが、他のモデルだと配置が違うと思うのでご注意ください。

f:id:edosha:20171110141446j:plain:w400

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 サーバーにしました。

edosha.hatenablog.jp

ただこのままだと端末を有線でつなぐ必要があるので、Raspberry pi の下にアクセスポイントを置くことにしました。
アクセスポイントのセキュリティ方式にはいくつかありますが、Raspberry pi がネットワークを管理しているような状態なので、Wi-Fi の認証も Raspberry pi にやらせることにしました。
方式は WPA Enterprise で、Raspberry piRADIUS サーバーにします。

ネットワークの完成イメージ

f:id:edosha:20170913144158p:plain

Raspberry pi の配下にアクセスポイントを追加し、Wi-Fi での接続機能を付加します。
この Wi-Fi で接続できる端末認証を Raspberry pi に持たせるようにします。

以下の YouTube 映像が、今回の動作イメージです。
www.youtube.com
なお、この映像のとおりにやると、認証方式が freeradius デフォルトの "MD5" になります。
これは脆弱性が指摘されている方式のため、今回は "PEAP" という方式でセットアップします。

認証方式については以下のサイトが詳しいです。

必要な部品

WPA/WPA2 Enterprise に対応したアクセスポイントが必要です。
自宅では TP-Link を使っています。
(別にこのメーカー、機種でなくても良いですが、一例です)

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

以下の sql 部分のコメントアウトを外します。

# 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 で端末を接続してみると、メッセージが出ていると思います。