Home - h-sendai/RaspberryPi GitHub Wiki
以下Scientific LinuxをSLと書く。CentOSでもSLと同様のコマンドが使える。
- Raspberry Pi本体
- ACアダプタ
- マイクロSDカード
- マイクロSDカードにデータを書けるPC
デスクトップ環境でいろいろやりたい場合
- コネクタがHDMIなディスプレイ
- USBキーボード
- USBマウス
シリアルコンソールを使うとき
- TTL-232R-3V3 のような3.3Vで使えるUSBシリアル変換ケーブル
- たとえば http://akizukidenshi.com/catalog/g/gM-05840/ で買えます
Raspberry Pi OSあるいはRaspberry Pi OS Liteのイメージをダウンロードする。
- マスターサイト: https://www.raspberrypi.org/downloads/raspberry-pi-os/
- 国内ミラー (armhf、32bit): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_armhf/
- デスクトップありイメージ (armhf): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_armhf/images/
- デスクトップなしイメージ (armhf): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_armhf/images/
- 国内ミラー (arm64、64bit): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_arm64/
- デスクトップありイメージ (arm64): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_full_arm64/images/
- デスクトップなしイメージ (arm64): http://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_arm64/images/
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でアクセスしたい場合はブートパーティション (ふたつできるパーティションのうち小さいほう。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からキーボードの設定を選ぶ。リブートは必要ない。
- 4 Localisation Options
- I3 Change Keyboard Layout
- Generic 105-key (Intl) PC
- Other
- English (US)
- English (US) (sic)
- The Default for the keyboard layout
- No composite key
デフォルトでは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 で日本時間にセットされる。リブートなしで有効になる。
新規ユーザーを登録。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。
bootパーティションにsshというファイルを作っていなかったときに sshdを起動するように設定するには、モニター、キーボードを(デスクトップ 環境ありを選択した場合はマウスも)接続してログインするか、あるいはシリアルコンソールから ログインし次のコマンドを実行する。
sudo systemctl start ssh
sudo systemctl enable ssh (リブート後に自動起動)
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
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パッケージは入っていないが、かわりに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>
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
/etc/default/keyboardで
XKBOPTIONS="ctrl:swapcaps"
と変更してリブートする。
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を無効化するには/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) -------------------- 黄色
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 は/var/swap にファイルとして確保されている。デフォルトでは 100MB確保されている。増やすには、/etc/dphys-swapfile の CONF_SWAPSIZE= のコメントアウトを外し、サイズを指定する。単位はMB。 変更後リブートする。
sudo modprobe configs
とすると/proc/config.gzが出現する。
https://www.raspberrypi.org/documentation/linux/kernel/building.md にしたがって作業。
- git clone https://github.com/raspberrypi/tools ~/tools
- ~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin をpathに追加
外部ライブラリが必要ないという意味で最初にやってみる。
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
./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 Multiarchの機能を使ったほうがべんりそうだ。 別ページ
bullseysベースのカーネルだとCONFIG_HZ=250になっていることに気がついた。 busterだと 2023-05-03-raspios-buster-armhf-lite.img (32bit)でカーネルバージョンが 5.10.103-v7+ のものは以前と同様CONFIG_HZ=100であった。
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