Raspberry Piで最初にやるべき設定～いくつか便利な設定

# はじめに

Raspberry Piを初めて使うor初期化後に、よく使うであろう設定（また自分が欲しいと思った設定など）をまとめたものである。
新しい設定をしたら随時追記していく。

# microSDカードの作成

使用するSDカードにRaspberry Pi OS(64-BIT)をインストールするために、WindowsにRaspberry Pi Imagerをダウンロードする。

ダウンロードは [Raspberry Pi公式ページ](https://www.raspberrypi.com/software/) より可能。

ダウンロードしたexeファイルからインストールし、起動。OSはRaspberry Pi OS(64-BIT)を選択、ストレージはPCに接続したSDカードを選択し、その他wifiやsshなどの設定もしたら書き込む。

書き込みが完了したらSDカードをRaspberry Pi本体にセットして完了。


# SSH接続

OSインストール段階でSSHの設定をしたので、このまま接続ができるはず。

`ssh <username>@<host>` を実行し、設定したパスワードを入力する。

```
<username>@<host>:~ $
```
という表示になっていれば接続完了。

リセットによって過去の接続と違う、と怒られた場合、以下で解決。

```
ssh-keygen -R <接続先>
```


# IPアドレスの固定

:::note warn
現在の最新バージョン付近において、IPアドレス固定の方法が変わっております。
:::

IPアドレスを固定するための設定を行う。

sshから `ifconfig` を実行し、wifiで接続中なので「**wlan0**」の項目を確認し、現在のIPアドレスとサブネットマスクを確認する。

これを元に設定ファイルを編集するので、以下のコマンドでファイルを開く。これはシステムの設定ファイルのため、管理者権限が必要。

```
sudo nano /etc/dhcpcd.conf
```

ファイルが開いたら一番下に以下の項目を追加する。

```:例
interface wlan0
static ip_address=192.168.3.81/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1
```

```:各項目の説明
interface wlan0
static ip_address={固定IPアドレス}/{サブネットマスク長}
static routers={デフォルトゲートウェイのIPアドレス}
static domain_name_servers={DNSサーバーのIPアドレス}
```

追加できたら上書き保存して閉じ、`reboot` コマンドで再起動して設定を反映させる。


# VNC接続

sshでVNC接続が可能になるように設定を行う。

ssh接続したら、`sudo raspi-config` を実行し、設定をしていく。

「**Interface Options**」を選択、さらに【**VNC**」を選択すると、VNCサーバを有効化するか聞かれるので「**Yes**」を選択する。

VNC Viewerは [realvnc.com](https://www.realvnc.com/en/connect/download/viewer/) からダウンロードする。

固定したIPアドレスを入力し、usernameとpasswordを使ってログインできる。





# 使用するメインのディレクトリを作る

`pi` ディレクトリを作成し、これをメインで使用するディレクトリとした。

```
mkdir pi
```

# NASとしての設定をする

SSHやVNCで接続して使用すれば良いが、複数のファイルを転送する際などに面倒なので、`pi` ディレクトリをNASとして設定する。

### Sambaのインストール

Sambaを使用してファイルサーバとするので、インストールする。

```
sudo apt install samba samba-common-bin
```

### 設定ファイルの変更

Sambaの設定ファイルを編集するので、一応デフォルトのバックアップをしてから編集する。

```
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup
```

```
sudo nano /etc/samba/smb.conf
```

以下を、ファイルの末尾に追加する。

```
[<表示されるディレクトリ名>]
comment = <ディレクトリの説明>
path = <ファイルサーバにするディレクトリのパス>
public = no（yesだとパスワードなしで利用可能）
read only = no（yesだと読み込みのみ）
browsable = yes（yesだと利用可能一覧に表示）
force user = tatsu（ファイル操作をするユーザ）
```

```:例
[pi]
comment = nas pi
path = /home/tatsu/pi
public = no
read only = no
browsable = yes
force user = tatsu
```

保存したらSambaを再起動させて更新を反映させる。

```
sudo systemctl restart smbd
```

### Samba用のユーザとパスワードを設定

Raspberry Pi本体のものとは関係ないので、自由に設定する。
ユーザ `tatsu` で設定する場合は以下。

```
sudo smbpasswd -a tatsu
```

登録されているユーザは以下で確認できる。

```
sudo pdbedit -L
```

参考

https://rikoubou.hatenablog.com/entry/2020/10/22/111508


# 外付けHDDをマウントする

### マウント用ディレクトリを作成する

`/mnt` にマウント用ディレクトリを作成する。今回はBUFFALOのHDDだったので `bhdd` とした。

```
mkdir /mnt/bhdd
```

マウントしたいHDDを接続し、以下コマンドを実行する。

```
sudo fdisk -l
```

```
/dev/sda1          64 3907029119 3907029056  1.8T  7 HPFS/NTFS/exFAT
```

のように出力された。この `/dev/sda1` をマウントしていく。


参考記事では、

> exFATでフォーマットされたHDDは、そのままマウントしてもエラーになるので、以下のコマンドを実行してexFATをマウント出来るようにする
> ```
> sudo apt-get install exfat-fuse exfat-utils
> ```

との記述があったが、そのまま出来た。32bit,64bitの違いだろうか？

### マウントする

bhddという名前でマウントする。

```
sudo mount /dev/sda1 /mnt/bhdd
```

以下のコマンドで、正しくマウントできているか確認する。

```
df -Th
```

```
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4       58G  3.8G   52G   7% /
devtmpfs       devtmpfs  1.7G     0  1.7G   0% /dev
tmpfs          tmpfs     1.9G     0  1.9G   0% /dev/shm
tmpfs          tmpfs     759M  3.0M  756M   1% /run
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
/dev/mmcblk0p1 vfat      255M   31M  225M  12% /boot
tmpfs          tmpfs     380M   24K  380M   1% /run/user/1000
/dev/sda1      exfat     1.9T   14G  1.9T   1% /mnt/bhdd
```

### 起動時に自動でマウントするように設定

再起動するとマウントが解除されてしまうので、起動時にマウントするように設定をする。
UUIDが必要なので、以下コマンドで確認する。

```
sudo blkid
```

```
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="3772-58CD" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="63fe744c-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="ee7f279a-1fe9-4c98-9f3c-83c7173683b7" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="63fe744c-02"
/dev/sda1: LABEL="BHDD" UUID="0C0B-8F40" BLOCK_SIZE="512" TYPE="exfat" PARTUUID="5413ecc8-01"
```

より、今回のUUIDは `0C0B-8F40` 。

起動時にマウントすると、ユーザの書き込み権限がなくなってしまうため、ユーザのudiとgidが必要なので、以下コマンドで確認する。

```
whoami
id
```

```
tatsu
uid=1000(tatsu) gid=1000(tatsu) groups=1000(tatsu),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),104(input),106(render),108(netdev),117(lpadmin),997(gpio),998(i2c),999(spi)
```

今回はuidもgidも `1000` 。

確認出来たら、以下コマンドで設定ファイルを編集する。

```
sudo nano /etc/fstab
```

末尾に以下のように追加する。

```
UUID="0C0B-8F40" /mnt/bhdd exfat uid=1000,gid=1000,defaults,nofail 0 0
```

`UUID　マウント位置　ファイルシステム　uid=XXXX,gid=XXXX,defaults,nofail　0　0` の形式。 `nofail` を書くと、マウントに失敗しても起動することになるので、書かないとマウント失敗時に起動しなくなる。

### これもNASにする

上記のNAS設定より、このディレクトリもNASに設定する。

```
sudo nano /etc/samba/smb.conf
```

```
[bhdd]
comment = nas bhdd
path = /mnt/bhdd
public = no
read only = no
browsable = yes
force user = tatsu
```

参考

https://jorublog.site/raspi-hdd-connect/

https://min117.hatenablog.com/entry/2021/01/02/233517


# pythonスクリプトをautostartする

Raspberry Piが再起動した際にターミナルを立ち上げてPythonを自動で実行するように設定をする。

OSのバージョンなどによっていくつかの方法があるようだが、今回はautostartを使用した。

ユーザーディレクトリにある `.config` ディレクトリの中に `autostart` ディレクトリを作成し、ここに実行ファイルを作成する。 `<任意の名前>.desktop` という拡張子にする。

```
cd .config
mkdir autostart
sudo nano <任意の名前>.desktop
```

書き込む内容は以下。

```
[Desktop Entry]
Exec=<実行するコマンド>
Type=Application
Name=<任意の名前>
Terminal=true
```

実行するコマンドは、全てをフルパスで書く。

ターミナルを起動し、10秒後にシェルスクリプトを実行する場合の書き方は以下のようになる。

```:autostart.desktop
[Desktop Entry]
Exec=lxterminal -e "sleep 10 ; /home/tatsu/pi/autostart.sh"
Type=Application
Name=Autostart
Terminal=true
```

このとき、実行するプログラムにエラーなどがあってもそのまま終了するだけなので注意が必要。また、Pythonを実行するときなどはPythonの標準ライブラリ以外をimportしている場合には正しく実行出来ないことがあるため、起動後一定時間画経ち読み込みが完了してから実行するようになどの変更する必要があった。


# Pythonの定時実行

毎日同じ時刻になったら実行するようなPythonスクリプトを書く。

```
pip install schedule
```

ここでは毎日朝5時にラズパイを再起動するように書きたいので、以下のようなコードになった。

```python
import schedule
import time
import subprocess


def reboot_pi():
    print("reboot")
    rb = subprocess.Popen("reboot", shell=True)


print("scheduled.")
schedule.every().days.at("05:00").do(reboot_pi)

while 1:
    schedule.run_pending()
    time.sleep(1)
```

実行されているのを確認するための `print` を入れた。

スケジュールの指定の仕方は[こちらを参照](https://di-acc2.com/programming/python/4574/#index_id3)。


# Webサーバーの起動

Nginxを使用して、webサーバーとしての機能を持たせる。

### Nginxのインストール

```
sudo apt install nginx
```

`nginx -v` でバージョンが表示されればインストール完了。

インストール後、自動でサービスに登録されて起動しているはず。以下で確認、起動、停止ができる。

```
# 確認
sudo systemctl status nginx

# 起動、自動起動登録
sudo systemctl start nginx
sudo systemctl enable nginx

# 停止、自動起動解除
sudo systemctl stop nginx
sudo systemctl disable nginx
```

Raspberry PiのIPアドレスへブラウザでアクセスし、デフォルトのページが表示されればOK。

### ドキュメントルートの変更

`index.html` や `static` フォルダなどのルートとなるフォルダを変更する。

```
sudo nano /etc/nginx/sites-enabled/default
```

元の記述をコメントアウトし、設定したいディレクトリで書き換える。

```
# root /var/www/html;       <-- ここをコメントアウト
root /home/tatsu/pi/nginx;  <-- ここを追加
```

このとき、ドキュメントルートにたどり着くまでのすべてのディレクトリで、[その他ユーザ]に実行権限が必要。ホームディレクトリ内に設定する場合は以下を実行する。

```
sudo chmod 701 /home/[ユーザー名] 
```

変更を反映させるためにNginxを再起動する。

変更後のディレクトリにhtmlを配置し、反映されていたらOK。

参考

https://101010.fun/iot/raspi-begin-nginx.html


<!--
===== start =====

# 設定ファイルをNASディレクトリに取り出す

リモートで楽に設定変更したいので、シンボリックリンクで参照を利用する。

Nginxの設定ファイルを、`/home/tatsu/pi/nginx_conf/pi_server` とする。

以下ディレクトリに移動する。

```
cd /etc/nginx/sites-enabled/
```

シンボリックリンクを作成する

```
sudo ln -s /home/tatsu/pi/nginx_conf/pi_server pi_server
```

デフォルトのものは削除などしてOK。

systemctlでNginxを再起動し、表示されたら完了。

=====  end  ===== 
-->



# ngrokのインストール
ローカルのwebサーバに外部からアクセス出来るようになりサービス [ngrok](https://ngrok.com/) をインストールする。

ssh接続して実行する。

```
wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
unzip ngrok-stable-linux-arm.zip
sudo mv ngrok /usr/local/bin/
```

`ngrok version` を実行し、バージョンが表示されればインストール完了。

この状態ではゲストとしての使用になり接続時間の制限があるため、認証を行う。[ngrok公式](https://ngrok.com/) にログインし、Authtokenを確認したら、

```
ngrok authtoken <authtoken>
```

を実行することで、アカウントの認証が完了する。



# windowsファイル共有へのアクセス

同じネットワーク上にあるwindowsPCの共有フォルダへのアクセスを設定する。

共有するフォルダをwindows上で作成したら、プロパティから共有設定をし、ネットワークからアクセス可能にしておく。

LinuxからのアクセスではCIFSを使用するので、インストールする。

```
sudo apt install cifs-utils
```

共有フォルダをマウントするディレクトリを作成し、マウントさせる。ここでは、カレントディレクトリに`/share`を作成し、そこにwindows上のshareフォルダをマウントさせた。

```
sudo mkdir share
sudo mount -t cifs -o user=[Windowsユーザー名],password=[Windowsパスワード],uid=[Linuxのユーザー名] //[Windowsサーバー名 or IPアドレス]/[共有フォルダ名] [マウント先のディレクトリ]
```


# 関連記事

https://qiita.com/tatsuki1119/items/3d7bb9766c747886e187