2018 年度 OSS リテラシー 3 : 第 1 回 基本セットアップ
- 2018/09/21 杉山耕一朗
Raspberry Pi のセットアップ
Raspberry Pi (ラズベリーパイ) は ARM プロセッサを搭載したシングルボードコ ンピュータであり, 安価な教育用のコンピュータとして世界中で使われている. 本講義は Raspberry Pi を用いて Linux の演習を行う.
Raspberry Pi は SD カードからブートする. そのため, 「インストール = OS イ メージを書き込んだ SD カードを作る」である. Raspberry pi 上で動作する OS はいくつかあるが, 本実習ではラズベリーパイ財団が公式にサポートしている Debian/GNU Linux ベースの OS である Raspbian を利用する.
イメージファイルのダウンロード
下記の URL から Raspbian stretch の OS イメージファイル (DESKTOP, zip 圧縮) をダウンロードする (Raspbian の元となる Debian は, 映画トイストーリーのキャラクター名をコードネームとして使っている. stretch はトイストーリーのキャラクタ).
<URL:https://www.raspberrypi.org/downloads/raspbian/>
![](./images/lec01-01.png)
イメージファイルを SD カードへ書き込む
ダウンロードした zip ファイルを展開する. 展開には Lhaplus や 7-zip.exe を使うと良い.
![](./images/lec01-02.png)
Windows 上で SD カードに raspbiaen を書き込む. 書き込みには Win32DiskImager.exe を利用する (管理者権限が必要).
- SD カードリーダー/ライターをパソコンに接続し, Win32 Disk Imager を起動する.
- ``Image File'' に書き込むイメージファイルを指定する.
- ``Device'' に SD カードのデバイス名を指定する.
- ``Write'' をクリックしてイメージファイルを SD カードに書き込む.
![](./images/lec01-03.png)
Raspbian の起動
Raspberry Pi に以下の順番で周辺機器を接続する. Raspberry Pi には電源スイッ チは無く, 電源コードを挿すと Raspbian がただちに起動する.
- micro SD カードの挿入
- ディスプレイと接続. HDMI ケーブルを利用する.
- ワイヤレスのマウス・キーボードと接続. USB レシーバーを USB ポートに挿入する.
- 電源コードの接続
基本設定
起動すると, 直ちに初期設定が始まる. locale の設定やパスワードの変更を適切に行う. なお, 本授業ではネットワークの設定を後ほど行うので, 無線の設定や OS アップデートはスキップして良い.
![](./images/lec1-01.png)
再起動後, 「Raspberry Pi の設定」を実行する. デスクトップ左上の Menu の 設定から「Raspberry Pi の設定」をクリックする. さらに「システム」タブを選択し, 以下を行う.
- ホスト名の設定
- ホスト名は学生番号とする (j1500 のように, 先頭の j は小文字で).
- ユーザ pi での自動ログインの禁止.
- 自動ログインはセキュリティ的に問題があるので, チェックを外す. 自動ログインを有効にしたままだと, 他人が勝手に自分のラズパイを起動し, 中に入っているデータを好き勝手に編集できてしまう.
![](./images/lec1-02.png)
"OK" を押すと再起動するか聞かれるので「はい」を押して再起動する.
設定の前に. ターミナル
以下, ラズパイの設定をおこなっていくが, ターミナルからコマンドを打ち込むことが多い. ターミナルは以下の図のように, 左上のアイコン群から起動することができる.
![](./images/lec02-01.png)
なお, 以下では背景が灰色な部分はターミナル上でコマンドを実行することを意味する. 先頭が "$" の場合は一般ユーザ権限でのコマンド実行, 先頭が "#" の場合は管理者権限でのコマンド実行を意味する. sudo コマンドを使って管理者権限を使っていることに注意せよ. また, 括弧内は説明であり, ファイルに書き込む必要はないことに注意せよ.
ネットワークへの接続
演習室に仮設された無線 LAN アクセスポイントに接続する.
ネットワークパラメタの確認方法
ネットワークパラメタを確認するためにターミナルを立ち上げ, ifconfig コマンドを実行する. 何もオプションを与えないと現在起動しているインターフェイスのネットワークの状態が全て表示される. eth0 は有線 LAN のインターフェイス, wlan0 は無線 LAN のインターフェイス, lo は「ローカルループバック」と呼ばれる特殊な項目 (ホスト自身を表す仮想インターフェイス)である.
ifconfig の出力のうち, 特に注目したいのは inet と netmask である (broadcast は inet と netmask から計算できる). 以下の例では 無線 LAN (wlan0) の IP は 10.162.64.104 で netmask は 255.255.255.0, であることがわかる. 有線 LAN (eth0) には接続していないので IP が設定されていないこともわかる.
$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether b8:27:eb:44:0f:13 txqueuelen 1000 (イーサネット) RX packets 366826 bytes 543736682 (518.5 MiB) RX errors 0 dropped 1106 overruns 0 frame 0 TX packets 183220 bytes 32857306 (31.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (ローカルループバック) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.162.64.104 netmask 255.255.255.0 broadcast 10.162.64.255 inet6 fe80::d17f:ac3e:6a9a:a0f7 prefixlen 64 scopeid 0x20<link> ether b8:27:eb:b9:3c:99 txqueuelen 1000 (イーサネット) RX packets 21 bytes 6094 (5.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 56 bytes 7754 (7.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
また, 無線 LAN インタフェースの参照・設定をするためのコマンドとして iwconfig がある. 以下の例では接続しているアクセスポイントが H530W_pub であることや, ビットレートや信号レベルなどがわかる.
$ iwconfig eth0 no wireless extensions. lo no wireless extensions. wlan0 IEEE 802.11 ESSID:"H530W_pub" Mode:Managed Frequency:2.412 GHz Access Point: 4C:E6:76:81:B7:80 Bit Rate=24 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on Link Quality=39/70 Signal level=-71 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:1 Invalid misc:0 Missed beacon:0
ゲートウェイは netstat -rn コマンド (もしくは route コマンド, ip route show コマンド) で確認することができる. 以下の例では, 無線 LAN (wlan0) のゲートウェイは 10.162.64.254 であることがわかる.
$ netstat -rn カーネルIP経路テーブル 受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース 0.0.0.0 10.162.64.254 0.0.0.0 UG 0 0 0 wlan0 10.162.64.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
ネットワークの接続テスト
ネットワークへの接続を確認するために, まず最初に行うのは ping コマンドの実行である. ネットワーク接続している別の計算機に ping を送ってみよう. ネットワークに接続している場合は返事が戻ってくる. 但し, 最近の Windows などでは ping に返事しないのをデフォルトにしているケースもあるので注意せよ.
ping を止める時は Ctrl-c する (Control キーと c キーを一緒に押す).
$ ping moon.epi.it.matsue-ct.jp PING moon.epi.it.matsue-ct.jp (10.164.5.198) 56(84) bytes of data. 64 bytes from 10.164.5.198 (10.164.1.198): icmp_seq=1 ttl=63 time=0.469 ms 64 bytes from 10.164.5.198 (10.164.1.198): icmp_seq=2 ttl=63 time=0.470 ms ^C --- moon.epi.it.matsue-ct.jp ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.469/0.469/0.470/0.021 ms
また, ネットワーク上の径路は traceroute コマンドで確認することができる. 以下の例では, moon.epi.it.matsue-ct.jp (10.164.1.198) に到達する前に, ゲートウェイ 10.162.64.254 を通過していることがわかる.
$ traceroute moon.epi.it.matsue-ct.jp traceroute to moon.epi.it.matsue-ct.jp (10.164.5.198), 30 hops max, 60 byte packets 1 10.162.64.254 (10.162.64.254) 3.250 ms 3.149 ms 3.285 ms 2 10.164.5.198 (10.164.5.198) 0.432 ms 0.379 ms 0.317 ms
パッケージの更新 & 新規インストール
パッケージの更新や新規インストールはネットワーク経由で行う.
松江高専内のミラーサイトを使う設定にする.
Linux ではパッケージ管理システムを用いてネットワーク経由でソフトウェア (パッケージ) をインストールする. ネットワーク的に近いミラーサイトを利用する方がパケージのダウンロードにかかる時間が短くて済む. この演習では松江高専内の raspbian のミラーサイトを利用することにする.
まず, パッケージをダウンロードするミラーサイトを学内のものに変更する. 既存のものをコメントアウトして, ホスト名を moon.epi.it.matsue-ct.jp に変更する. 編集するファイルは 2 つなことに注意せよ.
なお, sudo は管理者権限を使うためのコマンドである.
$ sudo -s # vi /etc/apt/sources.list deb http://moon.epi.it.matsue-ct.jp/raspbian/ stretch main contrib non-free rpi (追加) #deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi (コメントアウト) # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi # vi /etc/apt/sources.list.d/raspi.list deb http://moon.epi.it.matsue-ct.jp/debian/ stretch main ui (追加) #deb http://archive.raspberrypi.org/debian/ stretch main ui (コメントアウト) # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspberrypi.org/debian/ stretch main ui
パッケージの更新
パッケージの更新を行う. update でミラーサイトに置かれたパッケージのバージョンを確認し, upgrade で最新バージョンのパッケージをインストールする. この作業は場合によっては数十分かかる.
# apt-get update 取得:1 http://moon.epi.it.matsue-ct.jp/raspbian stretch InRelease [15.0 kB] 取得:2 http://moon.epi.it.matsue-ct.jp/debian stretch InRelease [25.3 kB] 取得:3 http://moon.epi.it.matsue-ct.jp/raspbian stretch/main armhf Packages [11.7 MB] 取得:4 http://moon.epi.it.matsue-ct.jp/raspbian stretch/contrib armhf Packages [56.8 kB] 取得:5 http://moon.epi.it.matsue-ct.jp/raspbian stretch/non-free armhf Packages [95.2 kB] 取得:6 http://moon.epi.it.matsue-ct.jp/raspbian stretch/rpi armhf Packages [1,360 B] 取得:7 http://moon.epi.it.matsue-ct.jp/debian stretch/main armhf Packages [111 kB] 取得:8 http://moon.epi.it.matsue-ct.jp/debian stretch/ui armhf Packages [26.9 kB] 12.0 MB を 26秒 で取得しました (461 kB/s) パッケージリストを読み込んでいます... 完了
取得先が全て moon.epi.it.matsue-ct.jp になっていることを確認すること. そうなっていない場合はミラーサイトの設定に誤りがあるので, 設定ファイルを見直すこと.
# apt-get upgrade パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 アップグレードパッケージを検出しています... 完了 以下のパッケージはアップグレードされます: bluez dhcpcd5 libbluetooth3 libservlet3.1-java pigpio python-pigpio python3-pigpio rpi-chromium-mods scratch2 アップグレード: 9 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。 78.6 MB のアーカイブを取得する必要があります。 この操作後に追加で 1,160 kB のディスク容量が消費されます。 続行しますか? [Y/n] Y 取得:1 http://moon.epi.it.matsue-ct.jp/debian stretch/ui armhf rpi-chromium-mods armhf 20170913 [9,197 kB] (...後略...)
アップグレードされるパッケージが一覧されるので, それを眺めたら Y を押す. ミラーサイトからパッケージがダウンロードされ, 自動的にインストールが始まる.
パッケージの新規インストール
ラズパイは I/O が弱点で, パッケージのインストールにかなりの時間がかかることがある. 今後の授業がスムーズに進行するために, 今後必要となるパッケージをまとめて インストールしておく (1 行で書くこと).
パッケージには依存関係がある. 以下の例では 10 個のパッケージをインストールする命令を出しただけにもかかわらず, 102 個のパッケージがインストールされている.
なお, 「続行しますか? [Y/n]」と聞かれたら Y を押すこと.
# apt-get install ibus-anthy freeradius-utils mailutils nmap fail2ban gawk busybox bindfs zabbix-agent libi2c-dev パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: anthy anthy-common ca-certificates-java collectd collectd-core dconf-cli default-jre-headless dmeventd exim4-base exim4-config exim4-daemon-light freeradius-common freeradius-config gir1.2-ibus-1.0 guile-2.0-libs ibus im-config kasumi libanthy0 libapr1 libc-ares2 libcollectdclient1 libconfuse-common libconfuse1 libdbi-perl libdbi1 libdevmapper-event1.02.1 libesmtp6 libfdt1 libfreeradius3 libftdi1 libganglia1 libgc1c2 libgps22 libgsasl7 libhiredis0.13 libibus-1.0-5 libkyotocabinet16v5 liblinear3 liblua5.1-0 liblua5.3-0 liblvm2app2.2 liblvm2cmd2.02 libmailutils5 libmariadbclient18 libmemcached11 libmicrohttpd12 libmodbus5 libmosquitto1 libnl-route-3-200 libntlm0 libopenipmi0 liboping0 libow-3.1-5 libowcapi-3.1-5 libpcap0.8 libpci3 libpq5 libprotobuf-c1 librabbitmq4 librdkafka1 libreadline5 libriemann-client0 librrd8 libserialport0 libsigrok2 libsigsegv2 libsnmp-base libsnmp30 libtokyocabinet9 libtokyotyrant3 libupsclient4 libvarnishapi1 libvirt0 libxen-4.8 libxenstore3.0 libzip4 lvm2 mailutils-common mysql-common ndiff openjdk-8-jre-headless owfs-common pciutils python-bs4 python-html5lib python-lxml python-webencodings python3-systemd rrdtool ssl-cert whois (...中略...) アップグレード: 0 個、新規インストール: 102 個、削除: 0 個、保留: 1 個。 62.3 MB のアーカイブを取得する必要があります。 この操作後に追加で 209 MB のディスク容量が消費されます。 続行しますか? [Y/n] (... 以下略...) # exit $
(2019/09/21 現在, ca-certification-java, openjdk-8-jre-headless, default-jre-headless パッケージのインストールでエラーが出る. 気にしなくてよい)
日本語入力
日本語をキーボードから入力できるように設定する. すでに Input method として anthy がインストールされているので, 以下のように「iBus の設定」をクリックして iBus デーモンを起動する (iBus の設定は特に変える必要はない).
![](./images/anthy-1.png)
![](./images/anthy-2.png)
デスクトップ右上の言語のアイコンを右クリックし, 日本語のインプットメソッドを Anthy にする. その後, 右クリックすると入力モードが選べるので, そこで「ひらがな」「英数」などを切り替えられる. なお, キーボードで「半角/全角」キーや Ctrl-j (Ctrl キーを押しながら j キーを押す) でも「ひらがな」と「英数」の切り替えを行うことができる.
![](./images/anthy-3.png)
![](./images/anthy-4.png)
日本語が実際に打てるか試してみよ. 例えばブラウザを立ち上げて, 検索窓に日本語を入力せよ.
時刻の設定
Linux のシステム時刻には, ハードウェアクロックとシステムクロックの 2 つがある.
- ハードウェアクロック
- マザーボード上の IC によって提供される時計. マザーボード上の電池はこのためにある.
- 電源を落としても時刻は進む.
- RTC(Real Time Clock)とも呼ばれる.
- システムクロック
- Linux カーネルの内部に存在している時計.
- 起動時に一度だけハードウェア・クロックを参照し, システム・クロックを設定する.
- 時刻は 1970/01/01T00:00:00 からの経過時間として保持される.
ラズパイはハードウェアクロックを持たないので, hwclock コマンドを実行しても「ハードウェアクロックを参照できない」と表示される. (ラズパイに電池載ってないですよね?)
$ hwclock hwclock: Cannot access the Hardware Clock via any known method. hwclock: Use the --debug option to see the details of our search for an access method.
ハードウェアクロックの代わりとして /etc/fake-hwclock.data がある. /etc/fake-hwclock.data に前回シャットダウンの時刻が記録されていて, これがシステムクロックから参照される. 起動時にラズパイの時刻がずれているのはこのためである.
$ cat /etc/fake-hwclock.data 2017-10-16 13:17:01
UNIX 系 OS で時刻を確認する標準コマンドは date である.
$ date 2017年 10月16日 月曜日 23時50分33秒 JST
systemdに導入された timdatectl コマンドでシステム時刻の各種表示形式を確認することができる. Local time は日本時間, Universal time は世界標準時である. リアルタイムクロック (RTC) は存在しないので n/a になっている. ここでポイントは "Network time on" と "NTP synchronized" で, ハードウェアクロックを持たない代わりにネットワーク経由で時刻合わせをしている.
$ timedatectl status Local time: 月 2017-10-16 22:27:43 JST Universal time: 月 2017-10-16 13:27:43 UTC RTC time: n/a Time zone: Asia/Tokyo (JST, +0900) Network time on: yes (NTP 使う設定) NTP synchronized: yes (NTP 同期済み) RTC in local TZ: no
NTP (Network Time Protocol)
NTP はネットワーク経由での時刻同期するためのプロトコルである. 先の例にあるように, ラズパイは NTP を使う設定になっている. そのため, ラズパイ起動から一定時間経過すると, ラズパイのシステムクロックは NTP と同期して正しい値となる.
以下のようにオプションを与えると, NTP との同期のログが表示される.
$ systemctl status systemd-timesyncd.service ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/systemd-timesyncd.service.d └─disable-with-time-daemon.conf Active: active (running) since Mon 2017-10-16 19:28:25 JST; 3h 10min ago Docs: man:systemd-timesyncd.service(8) Main PID: 312 (systemd-timesyn) Status: "Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org)." CGroup: /system.slice/systemd-timesyncd.service └─312 /lib/systemd/systemd-timesyncd 10月 16 19:28:24 iot-00 systemd[1]: Starting Network Time Synchronization... 10月 16 19:28:25 iot-00 systemd[1]: Started Network Time Synchronization. 10月 16 19:29:11 iot-00 systemd-timesyncd[312]: Synchronized to time server 108.61.223.189:123 (2.debian.pool.ntp.org).
NTPサーバは /etc/systemd/timesyncd.conf にて指定出来る. 学内の NTP サーバを使うように設定してみよ.
$ sudo -s # vi /etc/systemd/timesyncd.conf [Time] NTP=ntp.matsue-ct.jp FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org (コメントアウト外すだけ) # reboot
再起動後, 再び systemctl を用いて, NTP サーバとして ntp.matsue-ct.jp が 用いられていることを確認する (ログの部分に着目せよ).
$ systemctl status systemd-timesyncd.service ● systemd-timesyncd.service - Network Time Synchronization Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled) Drop-In: /lib/systemd/system/systemd-timesyncd.service.d └─disable-with-time-daemon.conf Active: active (running) since Mon 2017-10-16 23:04:29 JST; 8min ago Docs: man:systemd-timesyncd.service(8) Main PID: 317 (systemd-timesyn) Status: "Synchronized to time server 10.0.10.5:123 (ntp.matsue-ct.jp)." CGroup: /system.slice/systemd-timesyncd.service └─317 /lib/systemd/systemd-timesyncd 10月 16 23:04:29 iot-00 systemd[1]: Starting Network Time Synchronization... 10月 16 23:04:29 iot-00 systemd[1]: Started Network Time Synchronization. 10月 16 23:05:06 iot-00 systemd-timesyncd[317]: Synchronized to time server 10.0.10.5:123 (ntp.matsue-ct.jp).
参考:スクリーンショット
本演習では, 課題を行った証拠としてスクリーンショットを提出してもらうことがある. ここでラズパイでのスクリーンショットの取り方を説明しておく. ターミナルを立ち上げて 以下のコマンドを実行せよ. ls コマンドを実行すると, 作成されたファイルの名前が確認できる.
$ scrot $ ls (ファイルの確認) 2017-10-02-190947_1024x768_scrot.png
ある一定の時間後 (以下では 10 秒後) にスクリーンショットを取りたい場合は, -d オプションを用いる.
$ scrot -d 10
作成したファイルを確認するには, 上部に並んだアイコンから「ファイルマネージャー」を選び, 画像のアイコンをクリックすると良い.
![](./images/dir.png)
課題
- ブラウザを立ち上げて wbt にログインせよ.
- ブラウザのスクリーンショットを取り, その画像を wbt から提出せよ.
- 日本語が実際に打てるか試してみよ. 例えばブラウザを立ち上げて, 検索窓に日本語を入力せよ.
- ブラウザのスクリーンショットを取り, その画像を wbt から提出せよ.
- ifconfig コマンド, netstat コマンド, iwconfig コマンドの出力結果を wbt のオンラインテキストにコピペせよ. さらに, 自分のラズパイの IP アドレス, netmask, broadcast (計算すること), ゲートウェイ, 接続している無線アクセスポイントを wbt のオンラインテキストに報告せよ.
- IP アドレス, netmask, broadcast, ゲートウェイ, の意味を調べて wbt のオンラインテキストに報告せよ.
- systemctl status systemd-timesyncd.service コマンドの出力を wbt のオンラインテキストにコピペせよ. さらに使われている ntp サーバの IP とホスト名を答えよ.