Home - h-sendai/RaspberryPi GitHub Wiki

Raspberry Piのメモ

解説文書

Raspberry Pi OSをセットするときのメモ

以下Scientific LinuxをSLと書く。CentOSでもSLと同様のコマンドが使える。

用意するもの

  • Raspberry Pi本体
  • ACアダプタ
  • マイクロSDカード
  • マイクロSDカードにデータを書けるPC

デスクトップ環境でいろいろやりたい場合

  • コネクタがHDMIなディスプレイ
  • USBキーボード
  • USBマウス

シリアルコンソールを使うとき

SDイメージのダウンロード、書き込み

Raspberry Pi OSあるいはRaspberry Pi OS Liteのイメージをダウンロードする。

Raspberry Pi OS (2020年5月にRaspbianからRaspberry Pi OSに改名された)

64bitが使えるのはRaspberry Pi 3から。Wireless LANもRaspberry Pi 3から付いている。

日付が新しいzipファイルをダウンロードし展開して、SDカードにddコマンドで書く。 SDカードのデバイスファイルはSL 7ではlsblk -Sコマンドでわかる。

ddコマンドは

(Linux) sudo dd bs=4M if=2017-09-07-raspbian-stretch.img of=/dev/sdX oflag=direct conv=fsync
(MacOS) sudo dd bs=1m if=2017-09-07-raspbian-stretch.img of=/dev/rdiskX conv=sync

のようにconv=のオプションを付けておく。Linuxではoflag=directを付けておく ことでメモリキャッシュをバイパスしstatus=progressを付けたときの表示が体感に あうようになる。

Linuxのddコマンドを使うときにはstatus=progessを付けておくと 進行状況がわかる:

1526726656 bytes (1.5 GB, 1.4 GiB) copied, 67 s, 22.8 MB/s

書き終わりまでの残り時間(の推定値)も表示したい場合はpvコマンドを併用する:

pv lite-image.img | dd of=/dev/sdg bs=1M iflag=fullblock oflag=direct

デフォルトユーザーとパスワード

2022-04のアップデートでRaspberry Pi OS Bullseysでは piデフォルトユーザーとデフォルトパスワード が付かなくなった。 https://www.raspberrypi.com/news/raspberry-pi-bullseye-update-april-2022/ https://akkiesoft.hatenablog.jp/entry/20220409/1649471075 (Raspberry Pi OS Busterではたとえば2023-05-03-raspios-buster-armhf-lite.img でも依然としてpiユーザーが登録されている)。

最初の起動でユーザー名とパスワードを登録する画面がでるらしい。 画面なしに起動する場合は Raspberry Pi Imager toolを使うときはsettingsボタンをおして、 Advanced Optionsメニューからユーザー名とパスワードを登録する。 Raspberry Pi Imager toolを使わないときは、 SDカード上のブートパーティション (ふたつできるパーティションのうち小さいほう。FATになっている) をマウントし、 userconfあるいはuserconf.txtファイルを作ってそのなかに username:encrpyted_password を書いておく。encrypted_passwordはopensslを使って

echo 'mypassword' | openssl passwd -6 -stdin

で作ることができる。

環境変数USERのユーザーがログインできるようにするには sudoを実行したユーザー名が環境変数SUDO_USERにはいっているのを利用して

(echo -n "${SUDO_USER}:"; echo 'mypassword' | openssl passwd -6 -stdin) > /mnt/userconf.txt

sshdの起動

デフォルトではsshdは起動しないようになっている。 最初の起動時からsshdでアクセスしたい場合はブートパーティション (ふたつできるパーティションのうち小さいほう。FATになっている) にsshという名前の空のファイルを作っておく。SDカードデバイスが /dev/sdeだとすると

mount /dev/sde1 /mnt
touch /mnt/ssh

初回起動時のファイルシステム拡張

初回起動時に自動でファイルシステムが拡張されるが、拡張されないようにするには ddでイメージを書いたあと /boot パーティションをマウントし、cmdline.txt:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=a8fe70f4-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh

から init=/usr/lib/raspi-config/init_resize.sh を削除しておく。 https://raspberrypi.stackexchange.com/questions/56621/temporarily-disable-expand-filesystem-during-first-boot

あるいは cmdline.txtにinit=/usr/lib/raspi-config/init_resize.sh の記述がない場合には(たとえばネットワークブートのためにすでに起動している SDカードからファイルをぬきだした場合など)、 /etc/init.d/resize2fs_onceファイルを消す。

起動

初回起動時には、自動でSDカード上のファイルシステムが拡張される。 拡張終了後、自動でリブートする。

配布イメージを書いたらSDカードにイメージを書いたときに作った ユーザー名でログインする。

起動後のあれこれ

パスワードの変更

ログイン後、passwdコマンドでパスワードを変更する。

キーボード

キーボードの設定はデフォルトでUKキーボードになっている(ユーロ記号などが入力 できるようになっている)。日本語キーボード、US英語キーボードだとキーアサインが 違うので設定しなおす。設定しなおすには

root# export LANG=C.UTF-8
root# raspi-config

とする。LANG=C.UTF-8にすることで以下の選択メニューで "Generic 105-key (Intl) PC"と表示されるようになる(デフォルトでは アクサン付きの文字が表示される)。 Localisationからキーボードの設定を選ぶ。リブートは必要ない。

  1. 4 Localisation Options
  2. I3 Change Keyboard Layout
  3. Generic 105-key (Intl) PC
  4. Other
  5. English (US)
  6. English (US) (sic)
  7. The Default for the keyboard layout
  8. No composite key

locale、timezoneのセット

デフォルトではen_GB.UTF-8だけが定義されている。 sudo raspi-configコマンドで 4. Localisation Options -> I1 Change Localeで en_US.UTF-8, ja_JP.UTF-8 も追加しておく。デフォルトを変更する ダイアログがでるので適当によいものを選択する。C.UTF-8というのが一番無難か? リブート後に有効化される。

タイムゾーンはsudo raspi-configの 4. Localisation Options → I2 Change Timezone → Asia → Tokyo で日本時間にセットされる。リブートなしで有効になる。

ユーザー登録、piユーザーの無効化

新規ユーザーを登録。sudoグループに追加しておくとsudoでroot権限がとれる。

groupadd -g 5001 usergroup
useradd -m -u 5001 -g 5001 -s /bin/bash -G sudo username
passwd username

必要ならrootパスワードを付ける:

passwd root

piユーザーを無効化する:

usermod -L pi

これで/etc/shadowのパスワードハッシュの先頭に "!" が入って無効化される。 再び有効化するにはusermod -U pi。

ssh server

bootパーティションにsshというファイルを作っていなかったときに sshdを起動するように設定するには、モニター、キーボードを(デスクトップ 環境ありを選択した場合はマウスも)接続してログインするか、あるいはシリアルコンソールから ログインし次のコマンドを実行する。

sudo systemctl start ssh
sudo systemctl enable ssh (リブート後に自動起動)

static IPアドレス

Debian 11 (bullseysおよびそれ以前)

static IPアドレスを付ける場合は/etc/dhcpcd.confを編集する。 デフォルトルーター無し、dns lookup無しなら下のように2行有効にすればよい。

interface eth0
static ip_address=192.168.0.20/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

Debian 12 (bookworm以降)

NetworkManagerで設定する。nmtuiがあるので端末エミュレータからも GUIで設定できる。

ホスト名の設定

/etc/hostnameを編集する。 また可能なら /etc/hostsの127...*以外に割り当てるIPアドレス、自分のホスト名を書いておく。 書いておかないとsshでアクセスしたときに妙に待たされたり、sudoでrootになるときに 妙に待たされたりする。 /etc/hostの例:

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       my-host-exp0
192.168.10.123  my-host-exp0

NTPの設定

ntpパッケージは入っていないが、かわりにsystemd-timesyncdを使ってsntpで時刻同期が可能。 ntpサーバーは/etc/systemd/timesyncd.confで設定する。

[Time]
NTP=192.168.1.254
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org

ソフトウェアパッケージのアップデート

apt-getコマンドを使ってソフトウェアのアップデートを行う。 間にProxyが入るときはhttp_proxy環境変数を設定しておく (デフォルトではsudoはsudoする前の環境変数をすべて引き継ぐ わけではないのでrootになってからhttp_proxy環境変数を 設定する必要がある)。 リポジトリサーバーへの名前解決はproxyサーバーで行うので Raspberry Pi側では名前解決できなくてもよい。 (https_proxy=はついで。https proxyサーバーはport 80でよい)

export http_proxy='http://proxy.server:80/'
export https_proxy=$http_proxy 
apt-get update
apt-get upgrade

ProxyサーバーとしてはApache httpdが使える。SL7/CentOS7ではhttpdパッケージ が入っていれば、設定するだけで使える状態になっている。設定はたとえば /etc/httpd/conf.d/proxy.confに以下のように書いてsystemctl restart httpdする。 SELinuxが有効な場合は setsebool -P httpd_can_network_connect on が必要。

ProxyRequests On
ProxyVia On
<Proxy *>
    Order deny,allow
    Deny from all
    Allow from 192.168.10
</Proxy>

デスクトップで起動するのをやめる、piユーザーの自動ログインをやめる

sudo raspi-configコマンドの 3 Boot Options → B1 Desktop /CLIのうちから 適切なものを選択する。以下のものが選択可能である。

  • B1 Console Text console, requiring user login
  • B2 Console Autologin Text console, automatically logged in as 'pi'
  • B3 Desktop Desktop GUI, requiring user login
  • B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user

デスクトップの端末エミュレータでctrlとcapslockを交換する

/etc/default/keyboardで

XKBOPTIONS="ctrl:swapcaps"

と変更してリブートする。

text consoleを選んだあとsplash screenを止める

sudo raspi-configコマンドの 3 Boot Options → B1 Desktop /CLI → B3 splash screen Choose graphical splash screen or text bootで noを選択する。

あるいは/boot/cmdline.txtからsplash quietの2単語を取り除く。

タイムゾーンの設定

sudo raspi-configで設定するほかtimedatectlでも設定できる。

timedatectl set-timezone Asia/Tokyo

IPv6を無効化

IPv6を無効化するには/etc/sysctl.d/local.confファイルを作って

net.ipv6.conf.all.disable_ipv6 = 1

と書き、リブートする。リブート後 ip aコマンドでみる。

シリアルからログインする

sudo raspi-configを起動して、5 Interface Options → P6 Serial Enable/Disable shell and kernel messages on the serial connection を選択し、Yesで有効化する。リブートが必要。 これでやるのが確実だがたぶん中身は

/boot/config.txt
[all]
enable_uart=1 (これを追加)

/boot/cmdline.txt
console=serial0,115200 console=tty1
のうち最初のconsole=serial0,115200が追加される

と変更される(ような気がする)。 /boot/cmdline.txtの先頭部分は配布されているimgファイルではすでに

console=serial0,115200 console=tty1 root=PARTUUID=XXXXXXXX-YY (以下略)

となっているので/boot/config.txtに追加することのみが必要。 systemdの起動状態をシリアルにだすにはPCのLinuxと同様あとから指定された console=がコンソールになるので

console=tty1 console=serial0,115200 (以下略)

としておく。

ハードウェア接続は 写真 のように接続。受信側ではcu, kermit, screenなどを使って115200 bpsで 接続する。rootでログイン可能。

ピンアサイン
ボードの外側のピン USBコネクタがない側から  TTL-232R-3V3
3番目 (Ground) ---------------------------  黒
4番目 (TXD 0)  (3.3V) --------------------  オレンジ
5番目 (RXD 0)  (3.3V) --------------------  黄色

bootcode.binでearly stage UART (Pre Raspberry Pi 4B)

Raspberry Piハードウェア解説文書RPi 4B以前のRPiでearly stage UARTを有効にする方法 が書いてある。

strings bootcode.bin | grep BOOT_UART
BOOT_UART=0

となることを確認して、bootcode.binをsedで(!)書き換える:

sed -i -e "s/BOOT_UART=0/BOOT_UART=1/" bootcode.bin

出力例

RPi 4Bの場合はfirmwareがEEPROMに載っているのでEEPROM上の 設定ファイルを書き換える。 RasPi4-Bootloaderを参照。

Swap 領域を増やす

swap は/var/swap にファイルとして確保されている。デフォルトでは 100MB確保されている。増やすには、/etc/dphys-swapfile の CONF_SWAPSIZE= のコメントアウトを外し、サイズを指定する。単位はMB。 変更後リブートする。

カーネルコンパイル時に使われたconfigの取得

sudo modprobe configs

とすると/proc/config.gzが出現する。

クロスコンパイル入門

コンパイラの準備

https://www.raspberrypi.org/documentation/linux/kernel/building.md にしたがって作業。

kernelコンパイル

外部ライブラリが必要ないという意味で最初にやってみる。

kernelソースの取得

git clone --depth=1 https://github.com/raspberrypi/linux

config作成

cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

コンパイル

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

gzipのクロスコンパイル

./configure; make 物件の練習。まずは追加ライブラリが必要なさそうなgzip。 pathを設定したあと

% ./configure --host=x86_64-redhat-linux
% make
(arm-linux-gnueabihf-gccがコンパイルドライバとして使われる)
% file gzip
gzip: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3,
for GNU/Linux 3.2.0,
BuildID[sha1]=7783a41594057b9b1098e411cd5b9b2926c1b857, not stripped

Debian上でのクロスコンパイル

ライブラリの準備などはDebian Multiarchの機能を使ったほうがべんりそうだ。 別ページ

カーネルCONFIG_HZ

bullseysベースのカーネルだとCONFIG_HZ=250になっていることに気がついた。 busterだと 2023-05-03-raspios-buster-armhf-lite.img (32bit)でカーネルバージョンが 5.10.103-v7+ のものは以前と同様CONFIG_HZ=100であった。

cgroup

bookwormではmemory以外のcgroupは有効になっている。memoryも有効にするには /boot/firmware/cmdline.txt

cgroup_enable=memory cgroup_memory=1

を追加する。追加した結果

console=serial0,115200 console=tty1 root=PARTUUID=XXXXXXXX-YY rootfstype=ext4 fsck.repair=yes rootwait cgroup_enable=memory cgroup_memory=1

となる。 有効になったかどうかはcat /proc/cgroupsでわかる:

% cat /proc/cgroups
#subsys_name	hierarchy	num_cgroups	enabled
cpuset	0	80	1
cpu	0	80	1
cpuacct	0	80	1
blkio	0	80	1
memory	0	80	1
devices	0	80	1
freezer	0	80	1
net_cls	0	80	1
perf_event	0	80	1
net_prio	0	80	1
pids	0	80	1
⚠️ **GitHub.com Fallback** ⚠️