Raspberry Pi 2設定メモ

(注)この記事は2015年5月4日に旧ブログに投稿したものです。今でも有効な内容かは不明・・・

先日ストレス発散に(笑)Raspberry Pi2をしました。

改めて1から環境構築しましたので、その内容を備忘録がてらメモしておきます。
(なお、このページは随時更新する予定です)

入れたソフト&設定

jfbterm

素のままですとコンソール画面日本語を表示させると■表示になってしまいます。
そこでこのソフトを導入して日本語も表示できるようにします。

sudo aptitude install jfbterm

vim

Raspberry Piにはnanoって言うエディタが標準で入っていますが、 やはり使い慣れているエディタの方が捗りますからね。
ちなみに、私はvim派です。

sudo aptitude install vim

hostapd
isc-dhcp-server

新ラズパイは旅行でホテル行ったときに無線APとして使うことを企んでいます。

xyzplus.hatenablog.com

tightvncserver
xinetd

スマホからラズパイのGUI操作するときに使用します。

xyzplus.hatenablog.com

SofEther VPN Bridge

ラズパイとVPNサーバを拠点間接続させます。
詳細は作成中

iptables

サーバとして使う予定は無いですが不要なアクセスは蹴ってもらうようにします。
あとNAPTの設定も。

xyzplus.hatenablog.com

JavaScriptで文字コード変換

(注)この記事は2015年3月18日に旧ブログに投稿したものです。今でも有効な内容かは不明・・・

とあるWebアプリっぽいもの?を今作っています。
その中でブラウザからサーバへテキストを送信する際、Shift_JIS文字コードで送る必要があったんですが、JavaScriptの内部文字コードUnicode(UTF-16)なので、変換が必要になりました。
参考:JavaScript中での文字列の扱い

(本来ならサーバ側で文字コード変換したかったんですけどねー・・・)

というわけで、JavaScriptでどうやってUnicodeからShift_JISに変換するのかなーと思って探ってみたんですが、単純には出来ないっぽいです。

その代わり、ステキなJavaScript文字コード変換ライブラリを見つけたので、これを使ってみることにします。
https://github.com/polygonplanet/encoding.js

参考にしたページはこちら。
http://qiita.com/weal/items/3b3ddfb8157047119554

280KBの超大作…!変換テーブル保持してたら、まぁそれくらいのサイズは行ってしまいますよね。

まず、入力した文字列()を文字コードの配列に変更します。

var unicodeText = "ほげぴよ"
var unicodeArray = str2Array(unicodeText);
function str2Array(str) {
    var array = [],i,il=str.length;
    for(i=0;i<il;i++) array.push(str.charCodeAt(i));
    return array;
}

encoding.jsのEncoding.convert();メソッドを使って変換。

var sjisArray = Encoding.convert(unicodeArray, 'SJIS', 'UNICODE');

sjisArrayにShift_JIS文字コードの配列が格納されました。
あとはURLエンコーディングをして、サーバに送ればOKです。

Encoding.urlEncode(sjisText)

Raspberry Piで電子工作はじめました。

(注)この記事は2015年1月12日に旧ブログに投稿したものです。今でも有効な内容かは不明・・・

これまでラズベリーパイは、VPNルータや無線APをつくったりと、ソフトウェア部分で色々いじっていましたが、折角GPIOついてるんだし、電子工作でもやってみようと思います。
ちなみに、電子工作は大学の授業で習ったきりですので…10年ぶりくらい?完全に素人レベル。


というわけで、Amazonでお買い物。
Raspberry Pi model B+ 用 GPIOキット GPIOポート、ブレッドボード、40pinケーブル、LED、抵抗、プッシュボタン、ジャンパーワイヤー付き

 

今見たら品切れになってますね。。。タイミングが良かったー


Raspberry Piとブレッドボードを繋げてみます。
若干ケースに干渉してしている気がしなくもないですが…まぁつながりました。

f:id:xyzplus:20161210005348j:plain

では、さっそく配線。
電子工作の”Hello World” 的な事と言えば、Lチカですよね。

さっそく配線してみました。

f:id:xyzplus:20161210005404j:plain

(写真だけではわかりにくいので、LEDと抵抗の線は青で追記しました。緑はブレッドボード内部の配線です)

LEDは足が長いほうがアソード(+側)。逆だと繋がりません。
抵抗は、購入時についていた1kΩを使用します。
カラーコードはさすがに読み方を覚えていないので、Webサイトで調べつつ。。
http://www.azusa-st.com/resistor/

では、Raspberry Piから制御してみます。
今回はGPIOの25番に繋いだので、こんな感じ。

echo 25 > /sys/class/gpio/export
cd /sys/class/gpio/gpio25
echo out > direction

では、LEDを点灯させてみます。

echo 1 > value

f:id:xyzplus:20161210005431j:plain

無事つきました。ちなみに消灯する場合は、

echo 0 > value

です。

最後に、GPIO25番の制御を終了します。

echo 25 > /sys/class/gpio/unexport

とりあえず最初なのでコマンドラインからLチカしましたが、いちいちコマンド叩かなくても『WebIOPi』ってツールを使えばWebから操作できます。
http://code.google.com/p/webiopi/

 

サイトからtar.gzをDL→解凍して、

sudo ./setup.sh

サービスの起動は

sudo service webiopi start

です。
設定ファイルは、/etc/webiopi/configにあります。今回は特に触りません。

ブラウザで、http://ラズパイのIPアドレス:8000/ へアクセスすると、認証ダイアログが出てくるので、
ユーザー名:webipoi
パスワード:raspberry
でログインします。

f:id:xyzplus:20161210005450g:plain

GPIO Listをクリックするとこんな感じの画面が出てきます。

f:id:xyzplus:20161210005504g:plain

左列のINとOUTは入力・出力、
右列の黒と色付きは、OFFとONを表しています。

f:id:xyzplus:20161210005518j:plain

上からGPIOの22, 23, 24, 25とLEDをつないでみました。
24はOFFになっているのでLEDがついていませんね。

Raspberry PIで無線AP+ルーターを作ってみた

(注)この記事は2015年1月1日に旧ブログに投稿したものです。今でも有効な内容かは不明・・・

2015年1発目の記事は「Raspberry PIで無線AP+ルーターを作ってみた」です。
訳あって毎年恒例の年越し新年会にラズパイを持って行くことになり、じゃあ折角なんで無線LANからでも使えるようにしておこうと思ったわけです。

というわけで大晦日にお買い物。
IEEE802.11n/g/b準拠 150Mbps(規格値)無線LANアダプター(超小型モデル)WN-G150UMシリーズ

ラズベリーパイに挿したら自動認識してくれました。

f:id:xyzplus:20161210004719j:plain

ネットワークの設定

WPAによる暗号化通信の設定をします。

wpa_passphrase [SSID] [Key]

コマンド実行結果

network={
        ssid="[SSID]"
        #psk="[Key]"
        psk=*******************************
}

出力された文字列を基にして足りない項目を補完し、/etc/wpa_supplicant/wpa_supplicant.conf ファイルに追記します。
追記後のファイルはこんな感じ。

/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="****"
        psk=*************
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        auth_alg=OPEN
}

ちなみに、/etc/network/interfaces ファイルの内容は以下の通り。
自動認識したときに勝手に追記してくれたようです。
X画面で色々いじったりしてからの内容なので、挿した直後とは違うかも。。。

/etc/network/interfaces

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

最後に、ネットワークを再起動すれば、無線LANでアクセスができるようになりました。

sudo service networking restart

ちなみに、X画面上からも設定できます。
そっちのほうがはるかに楽。

f:id:xyzplus:20161210004755j:plain

無線APの作成

では、いよいよ無線APを作ります。

まず、hostapdをインストール

sudo apt-get install hostapd

設定ファイルのサンプルをコピーして、編集します。

sudo zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz > /etc/hostapd/hostapd.conf

色々と沢山設定があるみたいですが、コメントがしっかり書いてあるので読めば何とかなりそうです。
とりあえず、自分は以下の行を編集(&アンコメント)しました。

/etc/hostapd/hostapd.conf

ssid=RaspberryPi
wpa=2
wpa_passphrase=**********
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

デーモン起動時に設定ファイルを読み込むように、/etc/default/hostapd ファイルを編集します。
変更した行は以下の通り。

/etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

まずは手動でhostapdを起動してみます。

sudo hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
nl80211: 'nl80211' generic netlink not found
Failed to initialize driver 'nl80211'
rmdir[ctrl_interface]: No such file or directory

うまく動きませんorz

困った時のネットで調べてみたら、どうやらドライバーが対応していないそうで。。。

“nl80211 not found”
という出力が出た場合、”driver=nl80211″は使えません。”driver=rtl871xdrv”を使いましょう。

Raspberry Piのアクセスポイント化 & ルータ化がうまくいかない時はこの通りにやればおk

というわけで、バイナリを差し替えます。

wget http://www.adafruit.com/downloads/adafruit_hostapd.zip 
unzip adafruit_hostapd.zip 
sudo mv /usr/sbin/hostapd /usr/sbin/hostapd.ORIG 
sudo mv hostapd /usr/sbin
sudo chmod 755 /usr/sbin/hostapd

/etc/hostapd/hostapd.conf ファイルも修正します。

/etc/hostapd/hostapd.conf

driver=rtl871xdrv

もう一度起動。

sudo hostapd /etc/hostapd/hostapd.conf

無事に起動できました。
アンドロイド端末からもAP名がちゃんと表示されます。

f:id:xyzplus:20161210004828j:plain

DHCPサーバの作成

続いて、DHCPサーバーを作成します。

sudo apt-get install isc-dhcp-server

そしたら…

[FAIL] Starting ISC DHCP server: dhcpd[....] check syslog for diagnostics. ... failed!
 failed!

いきなり起動しようとしてエラー吐きました。
まだ何も設定していないので当然っちゃ当然。

というわけで、設定ファイルを編集します。
変更したのは以下の通り。

/etc/dhcp/dhcpd.conf

#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
(上記2行はコメントアウトauthoritative;
(上記1行はアンコメントアウトsubnet 192.168.2.0 netmask 255.255.255.0 {
  range 192.168.2.101 192.168.2.110;
  option broadcast-address 192.168.2.255;
  default-lease-time 600;
  max-lease-time 7200;
  option routers 192.168.2.1;
  option domain-name "local";
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}
(上記を追加。アドレス等は適当に置き換えてください)

DHCPサーバに使用するインタフェース(今回の場合、無線LAN)を指定します。

/etc/default/isc-dhcp-server

INTERFACES="wlan0"

無線LANインタフェースに固定IPアドレスを割り当てます。
(もともと設定が書いてあった箇所はコメントアウト

/etc/network/interfaces

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
#iface wlan0 inet manual
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
iface default inet dhcp

以上で設定は完了です。

デモ

当日のデモはこんな感じでやってみました。

f:id:xyzplus:20161210004856j:plain

ラズパイの左にあるのはモバイルバッテリー
ラズパイはモバイルバッテリーでもちゃんと動作するのがいいですよね。

CentOS7を入れたら色々とハマった

(注)この記事は2014年7月21日に旧ブログに投稿したものです。今でも有効な内容かは不明・・・

CentOS7が出ました。
しばらくすれば、さくらのVPSの標準OSもCentOS 7に変わる思いますが、折角なのでISOイメージからインストールしてみました。

…そしたら色々とハマったのでメモ。

iptables → firewalldに変わった

/etc/sysconfig/iptables ファイルが見当たらないなぁと思ったら、ファイアウォールのサービス変わったんですね。
コマンド叩いて設定入れ直しました。。

設定の一覧を表示
firewall-cmd --list-all-zones

サービスを有効にする
firewall-cmd [--zone=<ゾーン名>] --add-service=<サービス名> [--timeout=<秒>]

ポート,プロトコルを有効にする
firewall-cmd [--zone=<ゾーン名>] --add-port=<ポート番号>[-<ポート番号>]/<プロトコル> [--timeout=<秒>]

  • ちなみに、サービスやポート、プロトコルを無効にしたい場合は –add-~ → –remove-~ に変更
  • –permanent をつけずに実行した場合、再起動した際に設定が消えてしまう。
    再起動後も設定を有効にしたい場合は、–permanent 付き、–permanent 無しをそれぞれ実行する。

詳細は以下のURL参照
FirewallD/jp — Fedora Project Wiki
Linux女子部 firewalld徹底入門!by Etsuji Nakai (Slideshare)
Fedoraのfirewalldの設定 — 猫ぱーんち!

Webminのステータス表示が正しく出ない

コマンド叩くのめんどくさいから普段はWebmin導入しているんですけど、
ステータス表示画面がエラー出てたんですね。
調べたら以下の3パッケージを導入すればいいみたいです。

perl-Data-Dumper
perl-Data-Dumper-Concise
perl-Data-Dumper-Names

起動管理プロセスがupstart → systemdに変わった

設定ファイルの書き方が色々変わって苦労しました。
書き方は下記のURLを参考していただくとして。。。

自動起動を有効/無効にする
systemctl enable/disable <サービス名>

サービスを起動、停止する
systemctl start/stop <サービス名>

サービスの状態を確認する
systemctl status <サービス名>

参考URL
Linux女子部 systemd徹底入門 by Etsuji Nakai (Slideshare)
systemd & systemctl — とみぞーノート

SELinux関係

さくらのVPS(標準OSでインストールした場合)では、SELinuxは無効になっているんですが、ISOからCentOS7をインストールした場合は有効になっていました。
このまま有効にしておいてもよかったんだけど、過去にいろいろSELinux関係でハマっているので無効にしておきます。

SELinuxの有効/無効は/etc/selinux/config ファイルを開いて
SELINUX=disabled
に変更

ちなみに、現在の状態を確認するのは、getenforceコマンド。
一時的に有効/無効に設定するのは、setenforce 0 または setenforce 1

ちなみに、ls -l コマンドでファイルの一覧を表示させたとき、パーミッション欄に表示される “.”(ドット)は、SELinux有効時に作成されたファイルなんですって。
これまであまり気にしてなかったけど、そういう意味だったのね。。