0
0

【作業メモ】ラズパイ3ubuntu serverをインストールしてpython開発環境を構築

Last updated at Posted at 2024-08-18

概要

自宅のラズベリーパイ3にubuntu serverをインストールして、pythonを使えるようにして、flaskアプリを起動するようにしたので、同じことをやりたいときのための作業メモ。

ubuntu serverのインストール

OSの選定

raspbianとubuntu serverで迷ったが、Web上の情報量の多さからubuntuのほうが何かと使いやすそうだと判断し、ubuntu serverを選択した。昔はraspbianしか使ったことなかったが、最近はubuntuも公式でraspberrypiへのインストールにしたらしいので。

デスクトップは不要なので、ubuntu desktopではなく、ubuntu serverを選択した。

軽く調べた感じ、デスクトップを使わないならubuntu server on ラズパイ3は、重たいということはなさそう。

SDカードへの焼き込み

raspberrypi imagerを使った。環境はmac(M1)。昔はddコマンドでやっていたが、GUIでできるのでこちらのほうが便利そうだった。

やり方は以下を参考にした。
https://qiita.com/RYO_/items/eb008b44363dbec8b6f0

基本、GUIから直感的に操作可能だった。
ubuntuのバージョンは24.04 LTSを選択した。
「SSHを有効化:パスワード認証を行う」は別タブにあるので注意。

上記参考ページでは、OS Customizationをすると不具合が生じたと記載されているが、今回のトライでは問題なく、成功した。

初回ログイン

SDイメージの焼き込みが完了したらラズパイ3ハードに挿して、電源に繋いだ。
WiFiの設定もSDカードへの焼き込み時に済んでいるので、同じWiFiに繋いだPCから、初期設定したユーザ名@ホスト名でsshをした。問題なくログインできた。

ラズパイ初期設定

sshのあと、必要なソフトウェアなどのインストールや各種設定をする。

git

インストール

sudo apt-get update
sudo apt-get install git

gitのインストールで以下のエラーが発生した。

E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 2483 (unattended-upgr)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

検索するとlockファイルを削除すると解決したという記事がいくつか見つかったので試してみたが、改善しなかった。

エラーメッセージにBe aware that removing the lock file is not a solution and may break your system.と書いてあったのでlockファイルは削除しないほうが良かったかもしれない。反省。

process 2483はunattended-upgrというプロセスで、パッケージを自動更新しているらしい。
10分ほどまったら、2483のprocessがなくなった。

再度、apt-getでgitをインストールすると、成功した。ただgit is already the newest version (1:2.43.0-1ubuntu7.1).というメッセージが表示されており、gitはすでにインストール済みだったらしい。最初からインストール済みだったのか、エラー改善の試行錯誤の何処かでインストールされていたのかは不明。

ユーザの設定

git config --global user.name [任意のユーザ名]
git config --global user.email [任意のユーザ名]

参考
https://qiita.com/tommy_g/items/771ac45b89b02e8a5d64

uvのインストール

pyenvとuvでpython環境を作ることにした。

uvはpipでもインストールできるがpythonのバージョンに依存させたくなかったので、直接インストールした。

curl -LsSf https://astral.sh/uv/install.sh | sh

パスを追加。ホームに.bashrcと.zshrcがあるが、今回インストールしたubuntu serverではbashを使っているっぽいので、.bashrcに追加する。

現在のシェルの確認。

echo $SHELL
/bin/bash

.bashrcに追加しようと思ったが、すでに末尾に. "$HOME/.cargo/env"追加済みだった。
念の為、再ログインしてuvコマンドが使えるか試したところ使えそうだったので、.bashrcの編集は不要と判断した。

pyenv

以下を参考にpyenvをインストールした。
https://zenn.dev/tsaeki/articles/bc868a8d8fd6ae

sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
curl https://pyenv.run | bash

参考記事のパスの追加先を.zshrcから.bashrcに変更した。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

source .bashrc

python

pyenvを使って、とりあえずpython 3.12をインストール。

pyenv install 3.12

3.12.5がインストールされたので、それをグローバルで使うように設定した。

pyenv global 3.12.5

flaskサーバの実行

詳細は省略するが、flaskサーバを自作してgitにアップロードし、ラズパイからclone。
仮想環境を作成して、flaskサーバを実行。
そこに同一ネットワークの別PCからアクセスできることを確認。

systemdサーバ自動起動の登録

前小節で作成したflaskサーバをsystemdで自動起動する。

/etc/systemd/systemに拡張子.systemのファイルを作成。
記述内容の例

[Unit]
Description=description
After=network.target

[Service]
Type=simple
WorkingDirectory=/path/to/app-dot-py-dir
ExecStart=/path/to/app-dot-py-dir/.venv/bin/python /path/to/app-dot-py-dir/app.py

[Install]
WantedBy=multi-user.target

以下、動作確認

有効化

sudo systemctl daemon-reload

起動

sudo systemctl start yourapp

停止

sudo systemctl stop yourapp

動作確認終了。
続いて、OS起動時に自動実行されるようにする。

sudo systemctl enable yourapp

もし無効化したい場合は以下。

sudo systemctl disable yourapp

参考
https://qiita.com/__deracio__/items/4f50a5c2585fc742a10b

ネットワーク設定

何度か再起動をしていたらいつの間にかipv4アドレスを無線で取得できなくなっていた。
sshやブラウザからwebサーバへのアクセスにホスト名を用いていたが、ホスト名の名前解決がsshではできるのに、ブラウザからはできなくなったので気付いた。またwebサーバにlocalhostからもアクセスはできていた。

ip addr showでwlan0の項目を見ると、link-localがipv6は取得できているのに、ipv4は取得できていなかった。link-localはローカルネットワーク用のipアドレスらしい。またping google.comがうまく実行できないことからインターネットアクセスもできていなさそうだった。

何らかの理由で自宅のwifiルータへの接続に失敗し、リカバリとして、ipv6のlink-localだけは取得できていた、という状況らしい。

ルータの設定は、DHCPの割当数には余裕があり問題なさそうだった。また、/etc/hostnameや/etc/hostsなども見たが特に問題なさそうだった。

ChatGPTのアドバイスに従って、/etc/netplan/50-cloud-init.yamlを編集した。wlan0のlink-localの行だけ追記した。

/etc/netplan/50-cloud-init.yaml
network:
    version: 2
    renderer: networkd
    wifis:
        wlan0:
            dhcp4: true
            link-local: [ipv4]
            access-points:
                "my-ssid-name":
                    password: "..."
            optional: true
sudo netplan apply

上記コマンドを実行するとネット接続が切れた。
再度別ターミナルからsshして、ip addr showをするとipv4のアドレスが取得できていた。
またping google.comやブラウザからの名前解決も成功するようになった。

おわりに

raspberrypi imagerのおかげで昔より楽にできた印象があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0