- 投稿日:2020-05-19T22:15:29+09:00
ラズパイにArchLinux環境を構築する@hibi221b-version
はじめに
この記事ではRaspberrypi 3 Model BにArchLinuxの環境を構築するまでの過程を書いきます(所有しているラズパイが3ModelBのため)。バージョンは少々古いですが、最新版のラズパイ4と比較しても、インストール手順はさほど変わらないと思います。バージョン3以降のラズパイでArchLinuxを動かしたいと思っている人が、この記事の対象となります。
最終的にどのような環境が出来上がる?
今回、デスクトップ環境はxfceを使用します。
インストール手順
3部構成となります。
=== 仮想環境に用意したlinuxで行う ===
1章. パーティションやファイルシステムの設定をmicroSDカードに書き込む=== ラズパイでの作業 ===
2章. ロケール、キーボード、ネットワーク、ユーザー追加、時刻、Xorg、デスクトップ環境などの各種設定
3章. 選択したdesktop環境上でのカスタマイズ1章
この章ではmicroSDカードにarchLinuxのパーティションとファイルシステムを構築します。公式のインストール手順とほぼ同じですが、一連の流れを追うことができると思います。
fdisk
、mount
、tar
などのコマンドが使えるならばどのようなOSでも問題ありません。しかし傷を負わずに、安全に行いたい場合はVirtualBoxやVMwareなどの仮想環境上にlinuxを用意したほうが良いと思います。
私はwindowsでVMboxの仮想環境にZorin OS 15.2 Lite(無料のもの)を入れた環境で行いました。1章の説明は以下の公式とほぼ同じことをしていきます。
Raspberry Pi 3 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
Raspberry Pi 4 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4microSDカードのフォーマット
windowsの場合は、SDカードフォーマッター、Macの場合はディスクユーティリティなどから、フォーマットを行ってください。
新規パーティション、ファイルシステムの構築
現在、仮想環境にインストールしたZorin OS 15.2 Liteでターミナルを開いています。
su
でrootに切り替えてください。まずmicroSDカードが自動的にマウントされてしまう場合は、アンマウントする必要があります。
mount
で現在のマウント状況を確認してください。一番最後の行を確認してみるとやはり自動的にマウントされてしまっています。root@hibi221b:/home/hibi21b# mount ... ... /dev/sdb1 on /media/hibi21b/B1FD-E84D type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
umount /dev/sdb1
でアンマウントしてください。後で/dev/sdb1にbootディレクトリをマウントしたいので外す必要があります。root@hibi221b:/home/hibi21b# umount /dev/sdb1Zorin OS 15.2 Liteを使用している場合は、umountしても一定時間後に自動的にマウントされてしまうため、
Removable Storage
のチェックを全て外してください。現在の利用可能なブロックデバイスの確認
lsblk
コマンドで確認できます。16GBのmicroSDカードを使用しています(128GBくらいのにしておけばよかったです)。root@hibi221b:/home/hibi21b# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 96G 0 disk └─sda1 8:1 0 96G 0 part / sdb 8:16 1 15G 0 disk └─sdb1 8:17 1 15G 0 part sr0 11:0 1 1024M 0 rom
fdisk -l
でも確認しておきます。今回はmicroSDカードのブロックデバイスが/dev/sdbでしたが、/dev/sdcなど変わることがあるのでその場合は読み替えてくださいroot@hibi221b:/home/hibi21b# fdisk -l Disk /dev/sda: 96 GiB, 103079215104 bytes, 201326592 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xee589588 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 201324543 201322496 96G 83 Linux Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe5e4a4e3 Device Boot Start End Sectors Size Id Type /dev/sdb1 8192 31481855 31473664 15G c W95 FAT32 (LBA)新しいパーティションの作成
公式の通りに行います。
<----------
があるところは自分で入力する必要があります。root@hibi221b:/home/hibi21b# fdisk /dev/sdb Welcome to fdisk (util-linux 2.31.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): o <---------- Created a new DOS disklabel with disk identifier 0x7fa48a0b. Command (m for help): p <---------- パーティションテーブルを表示 Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7fa48a0b Command (m for help): n <---------- Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p <---------- Partition number (1-4, default 1): <---------- First sector (2048-31481855, default 2048): <---------- Last sector, +sectors or +size{K,M,G,T,P} (2048-31481855, default 31481855): +100M <---------- Created a new partition 1 of type 'Linux' and of size 100 MiB. Command (m for help): t <---------- Selected partition 1 Hex code (type L to list all codes): c <---------- Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. Command (m for help): n <---------- Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p <---------- Partition number (2-4, default 2): <---------- First sector (206848-31481855, default 206848): <---------- Last sector, +sectors or +size{K,M,G,T,P} (206848-31481855, default 31481855): <---------- Created a new partition 2 of type 'Linux' and of size 14.9 GiB. Command (m for help): w <---------- The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks./dev/sdbを再度確認
fdisk -l
を行うと、新しいパーティションができていることがわかります。root@hibi221b:/home/hibi21b# fdisk -l ... ... Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7fa48a0b Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 206847 204800 100M c W95 FAT32 (LBA) /dev/sdb2 206848 31481855 31275008 14.9G 83 LinuxFATファイルシステムの作成とマウント
root@hibi221b:/home/hibi21b# mkfs.vfat /dev/sdb1 mkfs.fat 4.1 (2017-01-24) root@hibi221b:/home/hibi21b# mkdir boot root@hibi221b:/home/hibi21b# mount /dev/sdb1 bootext4ファイルシステムの作成とマウント
mkfs.ext4 /dev/sdb2
は少し時間がかかります。root@hibi221b:/home/hibi21b# mkfs.ext4 /dev/sdb2 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 3909376 4k blocks and 979200 inodes Filesystem UUID: 8371c867-4a52-4ebb-9e3a-40d20ac0c161 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: doneroot@hibi221b:/home/hibi21b# mkdir root root@hibi221b:/home/hibi21b# mount /dev/sdb2 rootマウントされているか確認
mount
で確認しますroot@hibi221b:/home/hibi21b# mount ... ... /dev/sdb1 on /home/hibi21b/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) /dev/sdb2 on /home/hibi21b/root type ext4 (rw,relatime)tarballを取得
wgetでtarballを取得します。ラズパイのバージョンによって取得するtarballが異なります。
wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-XXX-latest.tar.gz
公式を再度確認してください
Raspberry Pi 3 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
Raspberry Pi 4 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4root@hibi221b:/home/hibi21b# wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz ... ... Saving to: ‘ArchLinuxARM-rpi-2-latest.tar.gz’ ArchLinuxARM-rpi-2-latest.tar.gz 100%[============================================================================================================>] 445.14M 1.24MB/s in 6m 53s 2020-05-08 21:23:50 (1.08 MB/s) - ‘ArchLinuxARM-rpi-2-latest.tar.gz’ saved [466758916/466758916]tarballを取得できました。
rpi-2
となっていますが、ラズパイ3ModelBでも正常に起動しました。root@hibi221b:/home/hibi21b# ls ArchLinuxARM-rpi-2-latest.tar.gz boot Desktop Documents Downloads Music Pictures Public root Templates Videos解凍
公式では
bsdtar
を使用していますが、私は、tar
コマンドを使いました。tar zxvf Arch...
と、v
オプションをつけてしまうとターミナルに全て詳細表示されてしまうため、つけませんでした。-C root
の意味はrootディレクトリ(/dev/sdb2のマウントポイントとなっている)以下に解凍するという意味です。-C
は大文字です。時間がかかります。
root@hibi221b:/home/hibi21b# tar zxf ArchLinuxARM-rpi-2-latest.tar.gz -C root tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' root@hibi221b:/home/hibi21b#解凍されていることがわかります。
root@hibi221b:/home/hibi21b# ls root/ bin boot dev etc home lib lost+found mnt opt proc root run sbin srv sys tmp usr varsync
以下のサイトで詳しく解説されていますのでそちらを参照してください。
syncコマンド | Linux技術者認定リナック | LPI-Japan
https://linuc.org/study/knowledge/413/root@hibi221b:/home/hibi21b# sync移動
やっていることは単純なのですが、ディレクトリ名がややこしいので図にしました。
root@hibi221b:/home/hibi21b# mv root/boot/* bootroot@hibi221b:/home/hibi21b# ls boot/ bcm2709-rpi-2-b.dtb bcm2836-rpi-2-b.dtb config.txt fixup_cd.dat kernel7.img start4x.elf bcm2710-rpi-2-b.dtb bcm2837-rpi-3-b.dtb fixup4cd.dat fixup.dat overlays start_cd.elf bcm2710-rpi-3-b.dtb bcm2837-rpi-3-b-plus.dtb fixup4.dat fixup_db.dat start4cd.elf start_db.elf bcm2710-rpi-3-b-plus.dtb bootcode.bin fixup4db.dat fixup_x.dat start4db.elf start.elf bcm2710-rpi-cm3.dtb cmdline.txt fixup4x.dat initramfs-linux.img start4.elf start_x.elf root@hibi221b:/home/hibi21b# ls root/boot/ root@hibi221b:/home/hibi21b#アンマウント
最後にbootとrootのマウントポイントをアンマウントします。
root@hibi221b:/home/hibi21b# mount /dev/sdb1 on /home/hibi21b/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) /dev/sdb2 on /home/hibi21b/root type ext4 (rw,relatime) root@hibi221b:/home/hibi21b# umount boot rootこれで1章での作業は終了しました。microSDカードを抜いてください。仮想環境も閉じてもらって大丈夫です。
2章
2章以降はラズパイでの作業になります。microSDカードをラズパイにセットして、起動してください。公式によるとrootの初期のパスワードはrootになります。
キーボード
loadkeys jp106
は一時的な設定でrebootなどをすると日本語配列ではなくなってしまうため、localectl
でも設定をしておいた方が良いです。コンソールでのキーボード設定 - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A[root@alarmpi ~]# loadkeys jp106 [root@alarmpi ~]# localectl set-keymap jp106 [root@alarmpi ~]# localectl //確認rootユーザのパスワード変更
正しくキー入力ができるようになったのでrootユーザのパスワードを変えておきます。
[root@alarmpi ~]# passwd rootaudit
audit: xxxxxxx
のようなメッセージが出てしまうと、作業の妨げになって嫌だったためmaskで止めておきます。解除する場合はsystemctl unmask XXX
をします。Arch Linux ARM ・ View topic - How disable AUDIT messages
https://archlinuxarm.org/forum/viewtopic.php?f=60&t=13175[root@alarmpi ~]# systemctl mask systemd-journald-audit.socket Created symlink /etc/systemd/system/systemd-journald-audit.socket -> /dev/null [root@alarmpi ~]# rebootロケール
system localeを追加します。
nano /etc/locale.gen
で設定ファイルを開き、以下の二つのコメントを外してください。viでも良いですがnanoを使った方が事故は少ないです。
- en_US.UTF-8
- ja_JP.UTF-8
en_US.UTF-8ではなくja_JP.UTF-8を選択してし、rebootすると文字化けしてしまうため
en_US.UTF-8
の方を設定します。ロケール - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB
GNU nanoを使いこなす - Qiita
https://qiita.com/snct_hu/items/971d512c26dd8b3a3b3c[root@alarmpi ~]# nano /etc/locale.gen [root@alarmpi ~]# locale-gen [root@alarmpi ~]# localectl set-locale en_US.UTF-8 [root@alarmpi ~]# localectl //反映されているか確認ネットワーク
ここでは無線LANの設定を行います。有線を使っている方は別途調べる必要があります。
iw dev
で無線インタフェースを調べます。結果は、Interface wlan0と出て、wlan0
であることがわかりました。[root@alarmpi ~]# iw dev
wpa_passphrase
コマンドを使ってwifiのパスワードを暗号化し、それを新規設定ファイルに書き込みます。
設定ファイル名は、次の書式にしてください。
/etc/wpa_supplicant/wpa_supplicant-インタフェース名.conf
wpa_supplicantは、アンダーバー、インタフェース名の前はハイフンを使ってください。[root@alarmpi ~]# wpa_passphrase "MYSSID" "passphrase" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
を開くとパスワードが平文でコメントされているので、その部分を削除します。WPA supplicant - ArchWiki
https://wiki.archlinux.jp/index.php/WPA_supplicant#wpa_passphrase_.E3.81.A7.E6.8E.A5.E7.B6.9A.E3.81.99.E3.82.8B[root@alarmpi ~]# nano /etc/wpa_supplicant/wpa_supplicant-wlan0.conf --------- 設定ファイル内 network={ ssid="MYSSID" #psk="passphrase" <--- この1行を消す psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } ---------起動時にワイヤレスを有効にします。
systemctl enable wpa_supplicant@インタフェース名
systemctl enable dhcpcd@インタフェース名
[root@alarmpi ~]# systemctl enable wpa_supplicant@wlan0 Created symlink /etc/systemd/system/multi-user.target.wants/wpa_supplicant@wlan0.service -> /usr/lib/systemd/system/wpa_supplicant@.service. [root@alarmpi ~]# systemctl enable dhcpcd@wlan0 Created symlink /etc/systemd/system/multi-user.target.wants/dhcpcd@wlan0.service -> /usr/lib/systemd/system/dhcpcd@.servicereboot後、
ifconfig
やip addr show
でwlan0のところを確認してくださいDNSSEC
ネットワーク設定を終え、
ping -c5 8.8.8.8
などをしてみると、これは正常に通ります。しかし、ping -c5 google.com
は通りません。この原因はsystemctl status /etc/systemd/resolved.conf
でわかります。
解決策は以下のサイトから、知ることができます。systemd-resolved - ArchWiki
https://wiki.archlinux.jp/index.php/Systemd-resolved#DNSSEC
Raspberry DNS problems with ArchLinuxARM and DNSSEC | madflex
https://madflex.de/posts/raspberry-dns-problems-with-archlinuxarm-and-dnssec/DNSSECを無効化します。
/etc/systemd/resolved.conf
に追記してください。[root@alarmpi ~]# echo "DNSSEC=false" >> /etc/systemd/resolved.conf [root@alarmpi ~]# cat /etc/systemd/resolved.conf ... ... DNSSEC=falserebootしてください。
タイムゾーン
timedatectl
でTime zone: Asia/Tokyoになっているか確認してください。時刻 - ArchWiki
https://wiki.archlinux.jp/index.php/%E6%99%82%E5%88%BB[root@alarmpi ~]# timedatectl set-timezone Asia/Tokyo時刻
日本標準時(JST)グループ
https://jjy.nict.go.jp/tsp/PubNtp/index.html
systemd-timesyncd - ArchWiki
https://wiki.archlinux.jp/index.php/Systemd-timesyncd[root@alarmpi ~]# nano /etc/systemd/timesyncd.conf --------- 設定ファイル内 #NTP= NTP=ntp.ncit.jp //変更 コメント外してサーバを指定 --------- [root@alarmpi ~]# timedatectl set-ntp true [root@alarmpi ~]# rebootホスト名の変更
[root@alarmpi ~]# nano /etc/hostname --------- 設定ファイル内 alarmpi <-- 消す hibi221b <-- 追加 ---------その後rebootします。ホスト名が変更されました。
[root@hibi221b ~]#ユーザーの追加、削除
rootユーザ以外に一般ユーザを作成します。
useradd
コマンドで追加します。
-m
ホームディレクトを作成 ※必ずつけます-d
ホームディレクトリの場所-s
ログインシェルはbashにしました- 最後にユーザ名を指定します。
[root@hibi221b ~]# useradd -m -d /home/hibi221b -s /bin/bash hibi221b追加した一般ユーザの新規パスワードを作成 ※必ず行ってください
[root@hibi221b ~]# passwd hibi221bhibi221bの一般ユーザが追加されている確認
[root@hibi221b ~]# cat /etc/passwdデフォルトで
alarm
という一般ユーザが作られています。このユーザを使う予定はないので削除しておきます。-r
でalarmユーザのホームディレクトリも消します。[root@hibi221b ~]# ls /home alarm hibi221b [root@hibi221b ~]# userdel -r alarmalarm一般ユーザが消えたか確認
[root@hibi221b ~]# cat /etc/passwd [root@hibi221b ~]# ls /home hibi221bpacman
ネットワークの設定などが終わったのでpacmanを使ってパッケージを導入していきます。
pacman - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman
pacman-key - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman-key
Pacman 比較表 - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman_%E6%AF%94%E8%BC%83%E8%A1%A8[root@hibi221b ~]# pacman-key --init [root@hibi221b ~]# pacman-key --populate archlinuxarm [root@hibi221b ~]# pacman -Syux window systemで必要なものなど
Xorg - ArchWiki
https://wiki.archlinux.jp/index.php/Xorg[root@hibi221b ~]# pacman -S xorg-server xorg-xinit xorg-apps xorg-twm xterm mesa xf86-video-fbdev xf86-video-amdgpusudo
sudo
を使えるようにします。まずvimとsudoをインストールする必要があります。export EDITOR=vim
をしないでもvisudoで設定ファイルを開けるのですが、なぜかキー入力が正しく行われないため、export EDITOR=vim
はした方が良いと思います。[root@hibi221b ~]# pacman -S vim sudo [root@hibi221b ~]# export EDITOR=vim [root@hibi221b ~]# visudo --------- 設定ファイル内 ## ## User privilege specification ## root ALL=(ALL) ALL hibi221b ALL=(ALL) ALL <---------- この一行を追加 ---------lightdmのインストール
ディスプレイマネージャはlightdmを使いました。
LightDM - ArchWiki
https://wiki.archlinux.jp/index.php/LightDM[root@hibi221b ~]# pacman -S lightdm lightdm-gtk-greeter [root@hibi221b ~]# systemctl enable lightdm Created symlink /etc/systemd/system/display-manager.service -> /usr/lib/systemd/system/lightdm.servicexfceの起動
今回はデスクトップ環境にxfceを使います。
Xfce - ArchWiki
https://wiki.archlinux.jp/index.php/Xfce[root@hibi221b ~]# pacman -S xfce4 xfce4-goodies
startxfce4
で起動して、下のデスクトップ画面が出ればインストール成功です。
lightdmを有効にしたので、次回起動時は、自分が追加したユーザでログインします。(一般ユーザのパスワードを忘れた場合はotherを選択してrootユーザでログインしてください)[root@hibi221b ~]# which startxfce4 /usr/bin/startxfce4 [root@hibi221b ~]# startxfce43章
それでは、これからxfceのデスクトップ環境上で設定を行っていきます。
画面がフリーズして何も操作できなくなってしまった場合は、ctrl
+Alt
+Backspace
で再起動できます。xscreensaver
xfceのデフォルトのscreensaverは使わないため、現在設定されている全てのscreensaverの項目をoffにしてください。autostartでもscreensaverがデフォルトで実行されるようになっているため、offにしてください。(
Applications
->Settings
->Session and Startup
->Application Autostart
のところのscreensaverのチェックも外します。)新しくxscreensaverを追加します。
[hibi221b@hibi221b ~]# sudo pacman -S xscreensaver月が描かれている方がデフォルトで設定されているもので、先ほど全ての項目をoffにしました。赤い方が新しいxscreensaverの設定です。
日本語対応
パッケージをインストールし、
$HOME/.xprofile
に設定を行いreboot後、左上のapplication
->Settings
->fcitx-configuration
を選択、Mozcを追加してください。Fcitx - ArchWiki
https://wiki.archlinux.jp/index.php/Fcitx
フォント - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88#.E6.97.A5.E6.9C.AC.E8.AA.9E[hibi221b@hibi221b ~]$ sudo pacman -S fcitx fcitx-mozc fcitx-configtool fcitx-im otf-ipafont [hibi221b@hibi221b ~]$ vim .xprofile --------- .xprofile設定ファイル内 3行を追加 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx --------- [hibi221b@hibi221b ~]$ rebootブラウザ
[hibi221b@hibi221b ~]$ sudo pacman -S firefox chromiumvscodiumのインストール
オープンソースのvscodeをインストールします。
[hibi221b@hibi221b ~]$ git clone https://aur.archlinux.org/vscodium-bin.git [hibi221b@hibi221b ~]$ cd vscodium-bin [hibi221b@hibi221b vscodium-bin]$ makepkg -si [hibi221b@hibi221b vscodium-bin]$ which vscodium /usr/bin/vscodiumyay
AUR(Arch User Repository)のヘルパーである
yay
をインストールします。Arch Linux に yayをインストール - Qiita
https://qiita.com/ekzemplaro/items/6714469c1fb1ae06b80f[hibi221b@hibi221b ~]$ sudo pacman -S base-devel git go [hibi221b@hibi221b ~]$ git clone https://aur.archlinux.org/yay.git [hibi221b@hibi221b ~]$ cd yay [hibi221b@hibi221b yay]$ makepkg -si [hibi221b@hibi221b yay]$ which yay /usr/bin/yayiconを変更
xfce-lookなどのサイトから好みのアイコンを選びます。ダウンロードして、
$HOME/.icons
に解凍します。
その後、左上のApplications
->Settings
->Appearance
->Icons
でダウンロードしたアイコンテーマを選択します。McMojave-circle - Eyecandy for your XFCE-DESKTOP - xfce-look.org
https://www.xfce-look.org/s/XFCE/p/1305429[hibi221b@hibi221b ~]$ mkdir .icons [hibi221b@hibi221b ~]$ cd Downloads [hibi221b@hibi221b Downloads]$ ls McMojave-circle-yellow.tar.xz [hibi221b@hibi221b Downloads]$ tar Jxf McMojave-circle-yellow.tar.xz [hibi221b@hibi221b Downloads]$ ls McMojave-circle-yellow.tar.xz McMojave-circle-yellow McMojave-circle-yellow-dark [hibi221b@hibi221b Downloads]$ mv McMojave-circle-yellow McMojave-circle-yellow-dark ../.icons/themeを変更
xfce-lookなどのサイトから好みのテーマを選びます。ダウンロードして、
$HOME/.themes
に解凍します。
その後、左上のApplications
->Settings
->Appearance
->style
でダウンロードしたテーマを選択します。material-black COLORS Complete Desktop [GS-3.36 support] - Eyecandy for your XFCE-DESKTOP - xfce-look.org
https://www.xfce-look.org/p/1316887/[hibi221b@hibi221b ~]$ mkdir .themes [hibi221b@hibi221b ~]$ cd Downloads [hibi221b@hibi221b Downloads]$ ls Material-Black-Pistachio_1.8.1.zip [hibi221b@hibi221b Downloads]$ sudo pacman -S unzip [hibi221b@hibi221b Downloads]$ unzip Material-Black-Pistachio_1.8.1.zip [hibi221b@hibi221b Downloads]$ mv Material-Black-Pistachio ../.themes/デスクトップの画像変更
デスクトップの画像は
/usr/share/backgrounds/xfce
以下にデフォルトで保存されているため、このディレクトリに保存した方が管理が楽になると思います。
左上のApplications
->Settings
->Desktop
->Background
でダウンロードした画像を選択します。Arch Dark Blue Wallpaper - linux-apps.com
https://www.linux-apps.com/p/1306984/[hibi221b@hibi221b Downloads]$ ls arch_dark_blue.png [hibi221b@hibi221b Downloads]$ sudo mv arch_dark_blue.png /usr/share/backgrounds/xfce/menuの英語表記を日本語にする
左上の
Applications
とかを日本語にします。2章のロケールのところでja_JP.UTF-8
を生成しました。これをsystem localeに設定します。[hibi221b@hibi221b ~]$ su [root@hibi221b ~]# localectl set-locale ja_JP.UTF-8 [root@hibi221b ~]# rebootおわり
後は、
Applications
->Settings
->Panel
->Panel 2
->Items
でLauncherのカスタマイズを行うと、完成です。[hibi221b@hibi221b ~]$ sudo pacman -S neofetch [hibi221b@hibi221b ~]$ neofetch
- 投稿日:2020-05-19T22:15:29+09:00
ラズパイにArchLinux環境を構築する
はじめに
この記事ではRaspberrypi 3 Model BにArchLinuxの環境を構築するまでの過程を書いきます(所有しているラズパイが3ModelBのため)。バージョンは少々古いですが、最新版のラズパイ4と比較しても、インストール手順はさほど変わらないと思います。バージョン3以降のラズパイでArchLinuxを動かしたいと思っている人が、この記事の対象となります。
最終的にどのような環境が出来上がる?
今回、デスクトップ環境はxfceを使用します。
インストール手順
3部構成となります。
=== 仮想環境に用意したlinuxで行う ===
1章. パーティションやファイルシステムの設定をmicroSDカードに書き込む=== ラズパイでの作業 ===
2章. ロケール、キーボード、ネットワーク、ユーザー追加、時刻、Xorg、デスクトップ環境などの各種設定
3章. 選択したdesktop環境上でのカスタマイズ1章
この章ではmicroSDカードにarchLinuxのパーティションとファイルシステムを構築します。公式のインストール手順とほぼ同じですが、一連の流れを追うことができると思います。
fdisk
、mount
、tar
などのコマンドが使えるならばどのようなOSでも問題ありません。しかし傷を負わずに、安全に行いたい場合はVirtualBoxやVMwareなどの仮想環境上にlinuxを用意したほうが良いと思います。
私はwindowsでVirtualBoxの仮想環境にZorin OS 15.2 Lite(無料のもの)を入れた環境で行いました。1章の説明は以下の公式とほぼ同じことをしていきます。
Raspberry Pi 3 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
Raspberry Pi 4 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4microSDカードのフォーマット
windowsの場合は、SDカードフォーマッター、Macの場合はディスクユーティリティなどから、フォーマットを行ってください。
新規パーティション、ファイルシステムの構築
現在、仮想環境にインストールしたZorin OS 15.2 Liteでターミナルを開いています。
su
でrootに切り替えてください。まずmicroSDカードが自動的にマウントされてしまう場合は、アンマウントする必要があります。
mount
で現在のマウント状況を確認してください。一番最後の行を確認してみるとやはり自動的にマウントされてしまっています。root@hibi221b:/home/hibi21b# mount ... ... /dev/sdb1 on /media/hibi21b/B1FD-E84D type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
umount /dev/sdb1
でアンマウントしてください。後で/dev/sdb1にbootディレクトリをマウントしたいので外す必要があります。root@hibi221b:/home/hibi21b# umount /dev/sdb1Zorin OS 15.2 Liteを使用している場合は、umountしても一定時間後に自動的にマウントされてしまうため、
Removable Storage
のチェックを全て外してください。現在の利用可能なブロックデバイスの確認
lsblk
コマンドで確認できます。16GBのmicroSDカードを使用しています(128GBくらいのにしておけばよかったです)。root@hibi221b:/home/hibi21b# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 96G 0 disk └─sda1 8:1 0 96G 0 part / sdb 8:16 1 15G 0 disk └─sdb1 8:17 1 15G 0 part sr0 11:0 1 1024M 0 rom
fdisk -l
でも確認しておきます。今回はmicroSDカードのブロックデバイスが/dev/sdbでしたが、/dev/sdcなど変わることがあるのでその場合は読み替えてくださいroot@hibi221b:/home/hibi21b# fdisk -l Disk /dev/sda: 96 GiB, 103079215104 bytes, 201326592 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xee589588 Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 201324543 201322496 96G 83 Linux Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xe5e4a4e3 Device Boot Start End Sectors Size Id Type /dev/sdb1 8192 31481855 31473664 15G c W95 FAT32 (LBA)新しいパーティションの作成
公式の通りに行います。
<----------
があるところは自分で入力する必要があります。root@hibi221b:/home/hibi21b# fdisk /dev/sdb Welcome to fdisk (util-linux 2.31.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): o <---------- Created a new DOS disklabel with disk identifier 0x7fa48a0b. Command (m for help): p <---------- パーティションテーブルを表示 Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7fa48a0b Command (m for help): n <---------- Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p <---------- Partition number (1-4, default 1): <---------- First sector (2048-31481855, default 2048): <---------- Last sector, +sectors or +size{K,M,G,T,P} (2048-31481855, default 31481855): +100M <---------- Created a new partition 1 of type 'Linux' and of size 100 MiB. Command (m for help): t <---------- Selected partition 1 Hex code (type L to list all codes): c <---------- Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'. Command (m for help): n <---------- Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p <---------- Partition number (2-4, default 2): <---------- First sector (206848-31481855, default 206848): <---------- Last sector, +sectors or +size{K,M,G,T,P} (206848-31481855, default 31481855): <---------- Created a new partition 2 of type 'Linux' and of size 14.9 GiB. Command (m for help): w <---------- The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks./dev/sdbを再度確認
fdisk -l
を行うと、新しいパーティションができていることがわかります。root@hibi221b:/home/hibi21b# fdisk -l ... ... Disk /dev/sdb: 15 GiB, 16118710272 bytes, 31481856 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7fa48a0b Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 206847 204800 100M c W95 FAT32 (LBA) /dev/sdb2 206848 31481855 31275008 14.9G 83 LinuxFATファイルシステムの作成とマウント
root@hibi221b:/home/hibi21b# mkfs.vfat /dev/sdb1 mkfs.fat 4.1 (2017-01-24) root@hibi221b:/home/hibi21b# mkdir boot root@hibi221b:/home/hibi21b# mount /dev/sdb1 bootext4ファイルシステムの作成とマウント
mkfs.ext4 /dev/sdb2
は少し時間がかかります。root@hibi221b:/home/hibi21b# mkfs.ext4 /dev/sdb2 mke2fs 1.44.1 (24-Mar-2018) Creating filesystem with 3909376 4k blocks and 979200 inodes Filesystem UUID: 8371c867-4a52-4ebb-9e3a-40d20ac0c161 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: doneroot@hibi221b:/home/hibi21b# mkdir root root@hibi221b:/home/hibi21b# mount /dev/sdb2 rootマウントされているか確認
mount
で確認しますroot@hibi221b:/home/hibi21b# mount ... ... /dev/sdb1 on /home/hibi21b/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) /dev/sdb2 on /home/hibi21b/root type ext4 (rw,relatime)tarballを取得
wgetでtarballを取得します。ラズパイのバージョンによって取得するtarballが異なります。
wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-XXX-latest.tar.gz
公式を再度確認してください
Raspberry Pi 3 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-3
Raspberry Pi 4 | Arch Linux ARM
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4root@hibi221b:/home/hibi21b# wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz ... ... Saving to: ‘ArchLinuxARM-rpi-2-latest.tar.gz’ ArchLinuxARM-rpi-2-latest.tar.gz 100%[============================================================================================================>] 445.14M 1.24MB/s in 6m 53s 2020-05-08 21:23:50 (1.08 MB/s) - ‘ArchLinuxARM-rpi-2-latest.tar.gz’ saved [466758916/466758916]tarballを取得できました。
rpi-2
となっていますが、ラズパイ3ModelBでも正常に起動しました。root@hibi221b:/home/hibi21b# ls ArchLinuxARM-rpi-2-latest.tar.gz boot Desktop Documents Downloads Music Pictures Public root Templates Videos解凍
公式では
bsdtar
を使用していますが、私は、tar
コマンドを使いました。tar zxvf Arch...
と、v
オプションをつけてしまうとターミナルに全て詳細表示されてしまうため、つけませんでした。-C root
の意味はrootディレクトリ(/dev/sdb2のマウントポイントとなっている)以下に解凍するという意味です。-C
は大文字です。時間がかかります。
root@hibi221b:/home/hibi21b# tar zxf ArchLinuxARM-rpi-2-latest.tar.gz -C root tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.security.capability' root@hibi221b:/home/hibi21b#解凍されていることがわかります。
root@hibi221b:/home/hibi21b# ls root/ bin boot dev etc home lib lost+found mnt opt proc root run sbin srv sys tmp usr varsync
以下のサイトで詳しく解説されていますのでそちらを参照してください。
syncコマンド | Linux技術者認定リナック | LPI-Japan
https://linuc.org/study/knowledge/413/root@hibi221b:/home/hibi21b# sync移動
やっていることは単純なのですが、ディレクトリ名がややこしいので図にしました。
root@hibi221b:/home/hibi21b# mv root/boot/* bootroot@hibi221b:/home/hibi21b# ls boot/ bcm2709-rpi-2-b.dtb bcm2836-rpi-2-b.dtb config.txt fixup_cd.dat kernel7.img start4x.elf bcm2710-rpi-2-b.dtb bcm2837-rpi-3-b.dtb fixup4cd.dat fixup.dat overlays start_cd.elf bcm2710-rpi-3-b.dtb bcm2837-rpi-3-b-plus.dtb fixup4.dat fixup_db.dat start4cd.elf start_db.elf bcm2710-rpi-3-b-plus.dtb bootcode.bin fixup4db.dat fixup_x.dat start4db.elf start.elf bcm2710-rpi-cm3.dtb cmdline.txt fixup4x.dat initramfs-linux.img start4.elf start_x.elf root@hibi221b:/home/hibi21b# ls root/boot/ root@hibi221b:/home/hibi21b#アンマウント
最後にbootとrootのマウントポイントをアンマウントします。
root@hibi221b:/home/hibi21b# mount /dev/sdb1 on /home/hibi21b/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro) /dev/sdb2 on /home/hibi21b/root type ext4 (rw,relatime) root@hibi221b:/home/hibi21b# umount boot rootこれで1章での作業は終了しました。microSDカードを抜いてください。仮想環境も閉じてもらって大丈夫です。
2章
2章以降はラズパイでの作業になります。microSDカードをラズパイにセットして、起動してください。公式によるとrootの初期のパスワードはrootになります。
キーボード
loadkeys jp106
は一時的な設定でrebootなどをすると日本語配列ではなくなってしまうため、localectl
でも設定をしておいた方が良いです。コンソールでのキーボード設定 - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A[root@alarmpi ~]# loadkeys jp106 [root@alarmpi ~]# localectl set-keymap jp106 [root@alarmpi ~]# localectl //確認rootユーザのパスワード変更
正しくキー入力ができるようになったのでrootユーザのパスワードを変えておきます。
[root@alarmpi ~]# passwd rootaudit
audit: xxxxxxx
のようなメッセージが出てしまうと、作業の妨げになって嫌だったためmaskで止めておきます。解除する場合はsystemctl unmask XXX
をします。Arch Linux ARM ・ View topic - How disable AUDIT messages
https://archlinuxarm.org/forum/viewtopic.php?f=60&t=13175[root@alarmpi ~]# systemctl mask systemd-journald-audit.socket Created symlink /etc/systemd/system/systemd-journald-audit.socket -> /dev/null [root@alarmpi ~]# rebootロケール
system localeを追加します。
nano /etc/locale.gen
で設定ファイルを開き、以下の二つのコメントを外してください。viでも良いですがnanoを使った方が事故は少ないです。
- en_US.UTF-8
- ja_JP.UTF-8
en_US.UTF-8ではなくja_JP.UTF-8を選択して、rebootすると文字化けしてしまうため
en_US.UTF-8
の方を設定します。ロケール - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB
GNU nanoを使いこなす - Qiita
https://qiita.com/snct_hu/items/971d512c26dd8b3a3b3c[root@alarmpi ~]# nano /etc/locale.gen [root@alarmpi ~]# locale-gen [root@alarmpi ~]# localectl set-locale en_US.UTF-8 [root@alarmpi ~]# localectl //反映されているか確認ネットワーク
ここでは無線LANの設定を行います。有線を使っている方は別途調べる必要があります。
iw dev
で無線インタフェースを調べます。結果は、Interface wlan0と出て、wlan0
であることがわかりました。[root@alarmpi ~]# iw dev
wpa_passphrase
コマンドを使ってwifiのパスワードを暗号化し、それを新規設定ファイルに書き込みます。
設定ファイル名は、次の書式にしてください。
/etc/wpa_supplicant/wpa_supplicant-インタフェース名.conf
wpa_supplicantは、アンダーバー、インタフェース名の前はハイフンを使ってください。[root@alarmpi ~]# wpa_passphrase "MYSSID" "passphrase" > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
を開くとパスワードが平文でコメントされているので、その部分を削除します。WPA supplicant - ArchWiki
https://wiki.archlinux.jp/index.php/WPA_supplicant#wpa_passphrase_.E3.81.A7.E6.8E.A5.E7.B6.9A.E3.81.99.E3.82.8B[root@alarmpi ~]# nano /etc/wpa_supplicant/wpa_supplicant-wlan0.conf --------- 設定ファイル内 network={ ssid="MYSSID" #psk="passphrase" <--- この1行を消す psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx } ---------起動時にワイヤレスを有効にします。
systemctl enable wpa_supplicant@インタフェース名
systemctl enable dhcpcd@インタフェース名
[root@alarmpi ~]# systemctl enable wpa_supplicant@wlan0 Created symlink /etc/systemd/system/multi-user.target.wants/wpa_supplicant@wlan0.service -> /usr/lib/systemd/system/wpa_supplicant@.service. [root@alarmpi ~]# systemctl enable dhcpcd@wlan0 Created symlink /etc/systemd/system/multi-user.target.wants/dhcpcd@wlan0.service -> /usr/lib/systemd/system/dhcpcd@.servicereboot後、
ifconfig
やip addr show
でwlan0のところを確認してくださいDNSSEC
ネットワーク設定を終え、
ping -c5 8.8.8.8
などをしてみると、これは正常に通ります。しかし、ping -c5 google.com
は通りません。この原因はsystemctl status /etc/systemd/resolved.conf
でわかります。
解決策は以下のサイトから、知ることができます。systemd-resolved - ArchWiki
https://wiki.archlinux.jp/index.php/Systemd-resolved#DNSSEC
Raspberry DNS problems with ArchLinuxARM and DNSSEC | madflex
https://madflex.de/posts/raspberry-dns-problems-with-archlinuxarm-and-dnssec/DNSSECを無効化します。
/etc/systemd/resolved.conf
に追記してください。[root@alarmpi ~]# echo "DNSSEC=false" >> /etc/systemd/resolved.conf [root@alarmpi ~]# cat /etc/systemd/resolved.conf ... ... DNSSEC=falserebootしてください。
タイムゾーン
timedatectl
でTime zone: Asia/Tokyoになっているか確認してください。時刻 - ArchWiki
https://wiki.archlinux.jp/index.php/%E6%99%82%E5%88%BB[root@alarmpi ~]# timedatectl set-timezone Asia/Tokyo時刻
日本標準時(JST)グループ
https://jjy.nict.go.jp/tsp/PubNtp/index.html
systemd-timesyncd - ArchWiki
https://wiki.archlinux.jp/index.php/Systemd-timesyncd[root@alarmpi ~]# nano /etc/systemd/timesyncd.conf --------- 設定ファイル内 #NTP= NTP=ntp.ncit.jp //変更 コメント外してサーバを指定 --------- [root@alarmpi ~]# timedatectl set-ntp true [root@alarmpi ~]# rebootホスト名の変更
[root@alarmpi ~]# nano /etc/hostname --------- 設定ファイル内 alarmpi <-- 消す hibi221b <-- 追加 ---------その後rebootします。ホスト名が変更されました。
[root@hibi221b ~]#ユーザーの追加、削除
rootユーザ以外に一般ユーザを作成します。
useradd
コマンドで追加します。
-m
ホームディレクトを作成 ※必ずつけます-d
ホームディレクトリの場所-s
ログインシェルはbashにしました- 最後にユーザ名を指定します。
[root@hibi221b ~]# useradd -m -d /home/hibi221b -s /bin/bash hibi221b追加した一般ユーザの新規パスワードを作成 ※必ず行ってください
[root@hibi221b ~]# passwd hibi221bhibi221bの一般ユーザが追加されているか確認
[root@hibi221b ~]# cat /etc/passwdデフォルトで
alarm
という一般ユーザが作られています。このユーザを使う予定はないので削除しておきます。-r
でalarmユーザのホームディレクトリも消します。[root@hibi221b ~]# ls /home alarm hibi221b [root@hibi221b ~]# userdel -r alarmalarm一般ユーザが消えたか確認
[root@hibi221b ~]# cat /etc/passwd [root@hibi221b ~]# ls /home hibi221bpacman
ネットワークの設定などが終わったのでpacmanを使ってパッケージを導入していきます。
pacman - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman
pacman-key - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman-key
Pacman 比較表 - ArchWiki
https://wiki.archlinux.jp/index.php/Pacman_%E6%AF%94%E8%BC%83%E8%A1%A8[root@hibi221b ~]# pacman-key --init [root@hibi221b ~]# pacman-key --populate archlinuxarm [root@hibi221b ~]# pacman -Syux window systemで必要なものなど
Xorg - ArchWiki
https://wiki.archlinux.jp/index.php/Xorg[root@hibi221b ~]# pacman -S xorg-server xorg-xinit xorg-apps xorg-twm xterm mesa xf86-video-fbdev xf86-video-amdgpusudo
sudo
を使えるようにします。まずvimとsudoをインストールする必要があります。export EDITOR=vim
をしないでもvisudoで設定ファイルを開けるのですが、なぜかキー入力が正しく行われないため、export EDITOR=vim
はした方が良いと思います。[root@hibi221b ~]# pacman -S vim sudo [root@hibi221b ~]# export EDITOR=vim [root@hibi221b ~]# visudo --------- 設定ファイル内 ## ## User privilege specification ## root ALL=(ALL) ALL hibi221b ALL=(ALL) ALL <---------- この一行を追加 ---------lightdmのインストール
ディスプレイマネージャはlightdmを使いました。
LightDM - ArchWiki
https://wiki.archlinux.jp/index.php/LightDM[root@hibi221b ~]# pacman -S lightdm lightdm-gtk-greeter [root@hibi221b ~]# systemctl enable lightdm Created symlink /etc/systemd/system/display-manager.service -> /usr/lib/systemd/system/lightdm.servicexfceの起動
今回はデスクトップ環境にxfceを使います。
Xfce - ArchWiki
https://wiki.archlinux.jp/index.php/Xfce[root@hibi221b ~]# pacman -S xfce4 xfce4-goodies
startxfce4
で起動して、下のデスクトップ画面が出ればインストール成功です。
lightdmを有効にしたので、次回起動時は、自分が追加したユーザでログインします。(一般ユーザのパスワードを忘れた場合はotherを選択してrootユーザでログインしてください)[root@hibi221b ~]# which startxfce4 /usr/bin/startxfce4 [root@hibi221b ~]# startxfce43章
それでは、これからxfceのデスクトップ環境上で設定を行っていきます。
画面がフリーズして何も操作できなくなってしまった場合は、ctrl
+Alt
+Backspace
で再起動できます。xscreensaver
xfceのデフォルトのscreensaverは使わないため、現在設定されている全てのscreensaverの項目をoffにしてください。autostartでもscreensaverがデフォルトで実行されるようになっているため、offにしてください。(
Applications
->Settings
->Session and Startup
->Application Autostart
のところのscreensaverのチェックも外します。)新しくxscreensaverを追加します。
[hibi221b@hibi221b ~]$ sudo pacman -S xscreensaver月が描かれている方がデフォルトで設定されているもので、先ほど全ての項目をoffにしました。赤い方が新しいxscreensaverの設定です。
日本語対応
パッケージをインストールし、
$HOME/.xprofile
に設定を行いreboot後、左上のapplication
->Settings
->fcitx-configuration
を選択、Mozcを追加してください。カーソルが有効なところでctrl
+space
を押すと英語<->日本語に切り替えることができます。Fcitx - ArchWiki
https://wiki.archlinux.jp/index.php/Fcitx
フォント - ArchWiki
https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88#.E6.97.A5.E6.9C.AC.E8.AA.9E[hibi221b@hibi221b ~]$ sudo pacman -S fcitx fcitx-mozc fcitx-configtool fcitx-im otf-ipafont [hibi221b@hibi221b ~]$ vim .xprofile --------- .xprofile設定ファイル内 3行を追加 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx --------- [hibi221b@hibi221b ~]$ rebootブラウザ
[hibi221b@hibi221b ~]$ sudo pacman -S firefox chromiumyay
AUR(Arch User Repository)のヘルパーである
yay
をインストールします。Arch Linux に yayをインストール - Qiita
https://qiita.com/ekzemplaro/items/6714469c1fb1ae06b80f[hibi221b@hibi221b ~]$ sudo pacman -S base-devel git go [hibi221b@hibi221b ~]$ git clone https://aur.archlinux.org/yay.git [hibi221b@hibi221b ~]$ cd yay [hibi221b@hibi221b yay]$ makepkg -si [hibi221b@hibi221b yay]$ which yay /usr/bin/yayvscodiumのインストール
オープンソースのvscodeをインストールします。
[hibi221b@hibi221b ~]$ git clone https://aur.archlinux.org/vscodium-bin.git [hibi221b@hibi221b ~]$ cd vscodium-bin [hibi221b@hibi221b vscodium-bin]$ makepkg -si [hibi221b@hibi221b vscodium-bin]$ which vscodium /usr/bin/vscodiumiconを変更
xfce-lookなどのサイトから好みのアイコンを選びます。ダウンロードして、
$HOME/.icons
に解凍します。
その後、左上のApplications
->Settings
->Appearance
->Icons
でダウンロードしたアイコンテーマを選択します。McMojave-circle - Eyecandy for your XFCE-DESKTOP - xfce-look.org
https://www.xfce-look.org/s/XFCE/p/1305429[hibi221b@hibi221b ~]$ mkdir .icons [hibi221b@hibi221b ~]$ cd Downloads [hibi221b@hibi221b Downloads]$ ls McMojave-circle-yellow.tar.xz [hibi221b@hibi221b Downloads]$ tar Jxf McMojave-circle-yellow.tar.xz [hibi221b@hibi221b Downloads]$ ls McMojave-circle-yellow.tar.xz McMojave-circle-yellow McMojave-circle-yellow-dark [hibi221b@hibi221b Downloads]$ mv McMojave-circle-yellow McMojave-circle-yellow-dark ../.icons/themeを変更
xfce-lookなどのサイトから好みのテーマを選びます。ダウンロードして、
$HOME/.themes
に解凍します。
その後、左上のApplications
->Settings
->Appearance
->style
でダウンロードしたテーマを選択します。material-black COLORS Complete Desktop [GS-3.36 support] - Eyecandy for your XFCE-DESKTOP - xfce-look.org
https://www.xfce-look.org/p/1316887/[hibi221b@hibi221b ~]$ mkdir .themes [hibi221b@hibi221b ~]$ cd Downloads [hibi221b@hibi221b Downloads]$ ls Material-Black-Pistachio_1.8.1.zip [hibi221b@hibi221b Downloads]$ sudo pacman -S unzip [hibi221b@hibi221b Downloads]$ unzip Material-Black-Pistachio_1.8.1.zip [hibi221b@hibi221b Downloads]$ mv Material-Black-Pistachio ../.themes/デスクトップの画像変更
デスクトップの画像は
/usr/share/backgrounds/xfce
以下にデフォルトで保存されているため、このディレクトリに保存した方が管理が楽になると思います。
左上のApplications
->Settings
->Desktop
->Background
でダウンロードした画像を選択します。Arch Dark Blue Wallpaper - linux-apps.com
https://www.linux-apps.com/p/1306984/[hibi221b@hibi221b Downloads]$ ls arch_dark_blue.png [hibi221b@hibi221b Downloads]$ sudo mv arch_dark_blue.png /usr/share/backgrounds/xfce/menuの英語表記を日本語にする
左上の
Applications
とかを日本語にします。2章のロケールのところでja_JP.UTF-8
を生成しました。これをsystem localeに設定します。[hibi221b@hibi221b ~]$ su [root@hibi221b ~]# localectl set-locale ja_JP.UTF-8 [root@hibi221b ~]# rebootおわり
後は、
Applications
->Settings
->Panel
->Panel 2
->Items
でLauncherのカスタマイズを行うと、完成です。[hibi221b@hibi221b ~]$ sudo pacman -S neofetch [hibi221b@hibi221b ~]$ neofetch
- 投稿日:2020-05-19T20:08:55+09:00
Linuxコマンドラインショートカット
カーソルの移動
コマンド 動作説明 Ctrl + b 後方に1文字移動 Ctrl + f 前方に1文字移動 Ctrl + a 行頭に移動 Ctrl + e 行末に移動 Alt + b 後方に単語1つぶん移動 Alt + f 前方に単語1つぶん移動 削除と挿入
※bashではペーストをヤンクと呼ぶ
コマンド 動作説明 Ctrl + h 後方に1文字削除 Ctrl + d カーソル位置の1文字削除 Ctrl + w 後方にスペース区切りで1単語ぶん削除 Ctrl + k カーソル位置から行末までを削除(カット) Ctrl + u カーソル位置から行頭までを削除(カット) Ctrl + y 最後に削除した内容を挿入する(ヤンク) 画面操作
※Ctrl + sでロック中も打ち込んだ文字列は受け付けられるため注意が必要
コマンド 動作説明 Ctrl + s 画面表示をロックする Ctrl + q 画面表示のロックを解除 Ctrl + c 実行中のコマンドを強制終了 Ctrl + l 画面に表示された履歴を削除 コマンド履歴検索
コマンド 動作説明 Ctrl + p 1つ前のコマンド履歴に移動 Ctrl + n 次のコマンド履歴へ移動 Ctrl + r インクリメンタル検索を開始 インクリメンタル検索(Ctrl + r)
コマンド 動作説明 文字の入力 検索語を追加して再検索 Ctrl + r 1つ前の検索結果へ移動 Enter 現在の検索結果をそのまま実行 Esc 現在の検索結果を表示したままコマンドラインに戻る Ctrl + g 検索結果を破棄しプロンプトに戻る Enter 現在の検索結果をそのまま実行 インクリメンタル検索「ec」で検索した例
(reverse-i-search)`ec': echo hello world参考文献:新しいLinuxの教科書(三宅英明・大角祐介 著)
- 投稿日:2020-05-19T18:53:40+09:00
DE10nano 向けLinux Kernel Build
はじめに
ARM CPU一体型FPGAの載った低価格ボードTerasic DE10nano用のLinux KernelをbuildしてUpdateしてみる方法について書かせていただきます。
このボード用のLinux SD card ImageはTerasicのサイトに複数アップロードされており、ユーザー登録をすればダウンロードしてすぐLinuxを起動できるようになっています。このボードで遊んでいるうちに、Kernel Driverを追加したり、デバイツリーオバーレイでFPGAのコンフィグレーションを行ってみようとすると、Kernelを自分でビルドしたくなったりするので。
要約
組み込みLinuxのビルドに慣れている方は、この情報だけで十分かと思います。
- Kernel souceは
- 必要なビルド工程は
make socfpga_defconfig; make zImage; make dtbs
make modules; make modules_install ...
- 作ったバイナリたちは、SD cardのどこに書くか
- zImage, socfpga_cyclone5_de0_sockit.dtb -> Fat Partitionの該当ファイルと置き換え
- lib/modules/* ディレクトリ -> Linux Partitionの "/"下 にコピー
- 参考:Intel SoC FPGA 用Linuxのポータルサイト RocketBoards.org
必要なもの
- 開発用のPC。OS は Ubuntu Linux。以下の環境下で動作しているものでもOKでしょう。
- Virtual Machine
- Windows SubSystem for Linux(WSL)
- Docker container
- Internetアクセスが開通していること。Kernel Source等をダウンロードするため。
作業の内容
Linuxを動作させるために必要なSD Cardの内容は、Kernel関連とRoot File Systemの2種類に分けることができます。ここでbuildするのはKernel関連のみで、Root File Systemのファイル群はそのまま使います。
手順
Intel SoC FPGA 用Linuxのポータルサイト RocketBoards.org のドキュメントを参考に作業を行います。
https://rocketboards.org/foswiki/Documentation/GSRDCompilingLinux
の中の"5. Building Kernel and U-Boot Separately From Git Trees" のBuilding Linux Kernelの部分を実行することになります。環境準備
まずは、クロスコンパイラをダウンロードしたり、Kernel buildに必要なコマンド類を準備します。例えば開発用PCが素の状態の Ubuntu 18.04(64bit)だと最低限以下のパッケージが必要と思います。
$ sudo apt update $ sudo apt install -y wget git build-essential bc kmod libncursesw5-dev $ sudo apt install -y lib32stdc++6 lib32ncurses5 lib32z1クロスコンパイラのダウンロード
クロスコンパイラをダウンロードし、CROSS_COMPILE環境変数を設定します。ここではホームディレクトリ下で作業してますが、お好きなディレクトリで行ってOK (その際は、CROSS_COMPILEに設定するPATHもそれなりに変更を)。
$ cd ~ $ wget https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2 --no-check-certificate $ tar xjf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.bz2 $ export CROSS_COMPILE=~/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux/bin/arm-linux-gnueabihf-Kernel Sourceのダウンロード
Git リポジトリからKernel Source をダウンロード(clone)します。そして、好きな branch or tag をチェックアウトします。例ではsocfpga-4.14.130-ltsi ブランチをチェックアウトしています。ここでもホームディレクトリ下で作業開始してますが好きな場所でやってください。-b の後の "test_branch"も好きな名前に変えて可。
$ cd ~ $ git clone https://github.com/altera-opensource/linux-socfpga $ cd linux-socfpga $ git checkout -b test_branch origin/socfpga-4.14.130-ltsizImage, .dtb のビルド
いよいよ最終目的のKernel本体であるzImageとデバイスツリーをビルドします。(export CROSS_COMPILE=... は既に設定されているという前提です)
$ export ARCH=arm $ make socfpga_defconfig $ make zImage $ make socfpga_cyclone5_de0_sockit.dtb上記により、arch/arm/boot/の下にzImage, arch/arm/boot/dts/の下にsocfpga_cyclone5_de0_sockit.dtb が生成されます。ちなみに、socfpga_cyclone5_de0_sockit.dtb は、DE10nano用のデバイスツリーファイルです。
これらをSD cardのFAT partitionにあるzImage, .dtbファイルと置き換えます。SD card への書き込み例
まずは、書き換え対象のSD card(DE10nano を Linux boot できるcard)のパーティション内容を調べる必要があります。開発用PCに、SD cardを挿してpartition情報を表示してみます。PCでのSD card device名が /dev/mmcblk0 の場合 コマンドは、
sudo fdisk -l /dev/mmcblk0
です。$ sudo fdisk -l /dev/mmcblk0 ...略... Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 2048 206848 204801 100M b W95 FAT32 /dev/mmcblk0p2 227331 7395332 7168002 3.4G 83 Linux /dev/mmcblk0p3 206849 227330 20482 10M a2 unknownこの情報から、FAT partition は Partition1(/dev/mmcblk0p1) で、Linux partition はPartition2(/dev/mmcblk0p2) だと分かります。
FAT partition のPartition1(/dev/mmcblk0p1)に入っている zImage と .dtb を自分で作ったもので書き換えます。例えば、Terasicのサイトの
DE10-Nano Kit Resourcesページ
の"Linux LXDE Desktop (kernel 4.5)" のMicroSD Card Imageを使っていたとすると、FAT parttitionにある該当ファイルは zImage, soc_system.dtb という名前なので、これらを置き換えます。$ sudo mount /dev/mmcblk0p1 /mnt $ cp /mnt/zImage /mnt/zImage.org $ cp /mnt/soc_system.dtb /mnt/soc_system.dtb.org $ cp arch/arm/boot/zImage /mnt $ cp arch/arm/boot/dts/socfpga_cyclone5_de0_sockit.dtb /mnt/soc_system.dtb $ sudo umount /mnt(SD cardのdevice名が /dev/mmcblk0 、空ディレクトリ /mnt が既にあったとしています)
Kernel modules も
前述の
make socfpga_defconfig
で一気にKernelのパラメータを設定してますが、ここで設定されたものには、zImage に含めず、moduleとして別ファイル(.ko)にするという設定[M]のモジュールもいくつかあります。これらもKernel関連ファイルなので、SD cardの所定の場所に書き込みます。Kernel Parameterで[M]として選択されているモジュールを使いたい場合はこの作業も必要です(通常DE10nanoを使っている範囲では必要ない気がしますが)。$ make modules $ mkdir /tmp/kmod $ make modules_install INSTALL_MOD_PATH=/tmp/kmod $ cd /tmp/kmod $ tar cvzf /tmp/mod.tgz * $ sudo mount /dev/mmcblk0p2 /mnt $ sudo tar xf /tmp/mod.tgz -C /mnt $ sudo umount /mnt $ rm -rf /tmp/mod.tgz /tmp/kmod(SD cardのdevice名が /dev/mmcblk0 、SD cardのLinux partitionが/dev/mmcblk0p2だった場合の例です)
(この例の場合 /tmp/kmod/lib/modules/*/build, /tmp/kmod/lib/modules/*/source は、開発用PCのKernel SourceディレクトリへのSymbolic Linkとなります。 クロスコンパイルで別環境にコピーする今回の場合は、これらは削除してから tar cvzf .. して構わないと思います. ARM側の環境でこの先 moduleのbuild作業をする際に必要とされるSymbolic Linkなので)おまけ FrameBuffer driver 追加
Terasicから提供されているSD card imageには、HDMIモニタからのGUIが使えるようになっているimageがあります(上述の"Linux LXDE Desktop" imageなど)が、上記の手順で作成したKernelに書き換えるとモニタ出力が出なくなります。モニタ出力のためのドライバ(frame buffer driver)がデフォルトの socfpga_defconfig には入っていないため。モニタ出力を可能とするためにはframe buffer driverが入ったKernelにする必要があります。前述の
make socfpga_defconfig
とmake zImage
の間に$ make menuconfigを実行してください。これにより、Kernelパラメータの設定用のGUI?が起動してくるので、カーソルキーとEnterキーを駆使して、
Device Drivers-> Graphics support -> Frame buffer Devices -> Altera VIP Frame Reader framebuffer support
の行に行き、そこのマークを(Spaceキーで)<*> にします。下部のメニューで save を選び .config に save して Exit します。
それから、今有効にしたframe bufferを起動するために、デバイツリーファイルの追記も必要です。socfpga_cyclone5_de0_sockit.dtsをsocfpga_cyclone5_de10nano_FB.dtsとしてコピーし、好きなエディタを使って、socfpga_cyclone5_de10nano_FB.dts を修正します。$ cd arch/arm/boot/dts $ cp socfpga_cyclone5_de0_sockit.dts socfpga_cyclone5_de10nano_FB.dts $ vi socfpga_cyclone5_de10nano_FB.dts # エディットします $ cd ../../../..修正内容は、ファイルの最後に以下を追記する、です。
&base_fpga_region { ranges = <0x00000000 0xff200000 0x00200000>; alt_vip_vfr_hdmi: vip@0x100031000 { compatible = "ALTR,vip-frame-reader-14.0", "ALTR,vip-frame-reader-9.1"; reg = <0x00031000 0x00000080>; max-width = <1024>; max-height = <768>; bits-per-color = <8>; colors-per-beat = <4>; beats-per-pixel = <1>; mem-word-width = <128>; }; };その後、zImageと変更した名前のデバイスツリー.dtbを作り、これらを SD cardのファイルと入れ替えます。
$ make zImage $ make socfpga_cyclone5_de10nano_FB.dtbなお、2020/5月の段階では、この Frame Buffer driver は、Kernel sourceのブランチがsocfpga-5.* だと入っていません。5.* バージョンのカーネルを使って、frame buffer を使いたい場合は、socfpga-4.* のコードからframe bufferを持って来る必要があります...
まとめ
DE10nanoのLinux SD cardのLinux kernelのみをbuild&updateする方法を書いてみました。実は、この内容は、別記事で書いている「デバイスツリーオーバーレイでFPGAコンフィグ」の中で必要となったので書いてみた、という側面があります。
なお、上記の作業コマンド例では、DE10nanoのSD cardを開発用PCに挿してmountしその内容を書き換える、としてますが、私はDE10nanoと開発用PCをEthernetで接続し、開発用PCで生成したバイナリをscpでDE10nanoに送り、DE10nanoでファイルを書き換えるという流れで作業してます(SD cardの抜き差しが面倒なので)。参考資料
参考:Intel SoC FPGA 用Linuxのポータルサイトの Compiling Linux
- 投稿日:2020-05-19T18:50:08+09:00
FPGA Subsystem(FPGA-region)でFPGAをコンフィグする
はじめに
Linuxの本家Mainline Kernelにも組み込まれているFPGAをコンフィグレーションするための FPGA subsystemについて書かせていただきます。主にARM CPUを内蔵するFPGAをLinuxで動作させている時に使うものです。デバイスツリーオーバーレイの仕組みを使い、このSubsystemのFPGA regionをオーバーレイすることによりFPGAのコンフィグレーションが行えます。
Partial Reconfigurationの対応まで考えられた仕組みですが、とりあえずここでは、FPGA全体をコンフィグレーションする場合を中心に書いております。ご参考まで:
デバイスツリーについて調べてみた 、
デバイスツリー Overlay について調べてみた構成要素と動作の仕組み
FPGA Subsystemは、次の3つのframeworkで構成されています。
FPGA region
FPGA Manager, FPGA bridgeを使いFPGAのコンフィグレーションを行います。FPGAの書き換え中にCPU側に変な信号(spurious signals)が送られないようにし、安全に再コンフィグレーションが行える仕組みになっています。コンフィグレーションの動作は、オーバーレイにて指定されたpropertyによりコントロールされます。FPGA Manager
FPGAのコンフィグレーションコントローラ。ここにビットストリームを送り込むことでコンフィグレーションが行われる。FPGAの状態もここで管理される。FPGA bridge
書き換えらるFPGA部 とCPU側 を接続するバスブリッジ。実装によっては、不要な場合もあり(FPGA Managerが必要なFPGA Bridgeの動作ケアをしている場合。X系のフルFPGAコンフィグレーション)。
Partial Reconfigurationの場合は、FPGA内のソフトロジックで作られたものになるかと思います。FPGAコンフィグをするために必要なデバイスツリー記述
FPGA subsystemを使ってFPGAをコンフィグレーションするためのデバイスツリー記述について書きます。
Base Tree において
少なくとも以下のnodeがBase Device tree(起動時に読み込まれるデバイスツリー)に入っている必要があります。
FPGA Manager node
FPGAのコンフィグレーションコントローラ。compatible property は使うFPGA用のドライバようの文字列を使う: X系なら "xlnx,zynq-devcfg-1.0", I系なら"altr,socfpga-fpga-mgr"。FPGA region node
Base tree中の最上位のFPGA regionは、Base FPGA regionと呼ばれ、FPGA全体を表すnodeとなります。このFPGA regionのpropertyには、fpga-mgr = <FPGA Managerへのphandle>;
が書かれていることが必要です。もし、Partial reconfigに対応するなら、Base FPGA region の子nodeとしてさらにFPGA region node を作り、Partial reconfig regionとします。 compatible property は "fpga-region"。FPGA bridge node
これは必要に応じて(FPGAの種類による)。FPGA bridgeは、FPGA regionの親nodeとするか、FPGA regionのpropertyに入れることで、FPGA regionの制御対象となります。sample_base.dts(一部)fpga_mgr: fpga-mgr@ff706000 { compatible = "altr,socfpga-fpga-mgr"; ... }; fpga_bridge0: fpga-bridge@ff400000 { compatible = "altr,socfpga-lwhps2fpga-bridge"; ... }; base_fpga_region0: base-fpga-region0 { compatible = "fpga-region"; fpga-mgr = <&fpga_mgr>; };Overlay において
デバイスツリー オーバーレイファイルにおいて、以下の記述をするとコンフィグレーションが実行できます。ルート直下のnodeにおいて、以下のproperty, nodeを記述します。
"target-path" もしくは "target" プロパティ
オーバーレイをするターゲットのnodeとしてBase treeに存在しているFPGA region node を指定する。target-path
ではフルパス名を指定、target
では、phandle を指定する"__overlay__" node
オーバレイの仕組みに従い、オーバーレイする内容(property, nodes)をこのnode下に書く。以下の内容は、この __overlay__ node の下に書く。
- "firmware-name" プロパティ: コンフィグレーションファイル名を指定する。指定したコンフィグレーションファイルは、/lib/firmware/ に置いておく。
- #address-cells, #size-cells, ranges プロパティ : アドレスマッピングをする子nodeを持つ場合には必要。
- 子nodeたち : オプション。コンフィグレーションしたことにより、あらたに追加されたハードウェアのためのnodeを記述。(別のnodeの下に追加しても良い)
sample_overlay.dtso(一部)/dts-v1/; /plugin/; / { fragment@0 { target = <&base_fpga_region0>; ... __overlay__ { firmware-name = "soc_system.rbf"; ... }; }; };参考資料
Kernel Source Tree の Documentation/devicetree/bindings/fpga/fpga-region.txt
https://www.kernel.org/doc/html/latest/driver-api/fpga/index.html
https://elinux.org/images/8/88/Fpga_and_dt.pdf
Solution Zynq PL Programming With FPGA Manager
Linux Kernel 4.10 でのFPGAのサポート事情
- 投稿日:2020-05-19T18:49:38+09:00
デバイスツリー Overlay について調べてみた
1.はじめに
ARM CPUを内蔵するFPGAをLinuxで動作させているうちに、デバイスツリーだけでなく、デバイツリー オーバーレイという仕組みを使うと良いことがあること分かりました(FPGAをコンフィグレーションできるとか)。
デバイツリー オーバーレイの使い方について調べてみた内容を書かせていただきます。(FPGAのLinuxを開発している人向け, 実機での動作はIntel系のFPGAでのみやっております)。なお、ここでは「デバイスツリー」についの内容は含みません。そちらについては別の資料ををご覧ください( デバイスツリーについて調べてみた もあります)。
Devicetree Overlay でできること
Kernelは、起動時にbootloaderから指定されたデバイスツリーを読み込みます(base tree)。通常は、デバイスツリー情報は再起動しない限り変更はできないのですが、デバイツリーオーバーレイを使えば、base treeの内容に対し、
- node(=デバイス)の追加
- propertyの追加
- propertyのvalue変更
といったことが再起動なしできるようになります。
オーバーレイする内容は、オーバーレイファイルで記述し、そのファイルを読み込むことで実施されます。オーバーレイファイルは、複数読み込むことも可能です。
また、オーバーレイした内容は、オーバーレイファイル単位で削除することが可能となり、そのオーバーレイファイルを読み込む前の状態に戻すこともできるようになってます。オーバーレイファイルを読み込んだり、削除したりすることでデバイスツリーの内容が変化しますが、その点でのデバイスツリーの内容は、live treeと呼ばれます。デバイツリーオーバーレイが実行されてなければ、live tree = base tree です。
Devicetree Overlay ファイルの書き方
デバイスツリーオーバーレイファイルも、テキストソースとバイナリがあり、デバイスツリーと同じくdtcでコンパイルします。デバイスツリーファイルと区別するため、ここではオーバーレイソースの拡張子を.dtso, オーバーレイバイナリの拡張子を.dtboとしてます。
必要最小限度のオーバーレイファイルは以下です。
minimum.dtso/dts-v1/; /plugin/; / { fragment@0 { /* node名は何でも良い */ target = <phandle>; /* overlayするnodeの phandle */ /* もしくは */ target-path="/path"; /* overlayするnodeの path */ __overlay__ { /* オーバーレイする property 定義 たち*/ /* オーバーレイする node 定義 たち*/ }; }; };必要な内容はシンプルで、
- 冒頭の /dts-v1/; の後に
/plugin/;
- ルートnode
- ルートnodeの子node。 nodeの名前は何でも良い
- 子node に
target
(もしくはtarget-path
)propertyと__overlay__
nodeを持たせる
target
ortarget-path
propertyで、オーバレイ対象となるnodeを指定
target
ではphandleで指定(もしくはラベル)target-path
ではpath stringで指定__overlay__
node 内に具体的にオーバーレイする内容を記述
- 追加したいpropertyやnodeたちを定義する
となります。冒頭の
/plugin/;
により、オーバーレイファイルの記述に、過去に読み込んだデバイスツリー(live tree)で定義されているlabelを参照できるようにするためのものです。例えば、target
のvalueとしてbase treeで定義されているラベル名を使えるようになります(オーバーレイファイル中にこのファイルないで定義されていないラベルがあってもdtcでエラーとならない)。
ただし、base tree が、dtcでのコンパイル時に.dtbにシンボル情報も含めるよう -@ オプションが付けられている必要があります(FPGA用のGitリポジトリにあるKernel Sourceでmakeした .dtb なら -@ 付でコンパイルされていると思います)。Devicetree Overlayの実行方法
FPGAベンダがメンテナンスしているのGitリポジトリのKernel SourceにはConfigFsというドライバ入っており、デフォルトで使えるようになっています(参考資料1,2より)のでこの仕組みを使っていきます。
(残念ながら、ユーザーランド(ユーザーコマンドやアプリケーション)からOverlayを行う方法は、現時点ではMainline Kernelに取り込まれていません(5.7.0-rc6)。Overlayを行うKernel driverを自分で書く必要があります。configfsの仕組みだとどんなDvicetree nodeでも任意のタイミング書き換えられてしまうので、そのようなことを想定していないドライバで問題が起こる...といった問題が挙げられている様で。Mainlineに入るのはもう少し時間がかかりそうです。)
以下、デバイスツリーオーバーレイ用のconfigfsのpathを $OVL_PATH とします。
X系: OVL_PATH=/configfs/device-tree/overlays
I系: OVL_PATH=/sys/kernel/config/device-tree/overlays
(X系では、mkdir /configfs; mount -t configfs configfs /configfs
を事前にしておく必要ありそうな)オーバレイ実施
次のの2つのステップで実行されます。
- $OVL_PATH ディレクトリ下に任意の名前でディレクトリを作る。
- 作成したディレクトリ下に自動的に dtbo ファイルが生成されるので、その dtbo ファイルに自分のオーバレイファイル(.dtbo)を書き込む。
my_overlay1_dir ディレクトリを作り、my_overlay1.dtbo というオーバーレイファイル読み込ませる例は以下となります。(root ユーザでの実行を想定してます)
# mkdir $OVL_PATH/my_overlay1_dir # cat my_overlay1.dtbo > $OVL_PATH/my_overlay1_dir/dtboオーバーレイ削除
削除は1ステップで実行されます。
- オーバーレイ用に生成した $OVL_PATH ディレクトリ下のディレクトリを削除する
上の例でオーバーレイした内容を削除する場合は、
# rmdir $OVL_PATH/my_overlay1_dirその他の機能
オーバーレイ用に作成したディレクトリ下には、
dtbo
以外にpath
,status
というファイルが自動で生成されます。
path
は、dtbo
と同様にオバーレイ実施を行えるインターフェースですが、/lib/firmware/ 下に置いたオーバーレイファイルを読み込むもので、以下のコマンドにより /lib/firmware/の下にある abc.dtbo でオバーレイを行います。# echo "abc.dtbo" > $OVL_PATH/my_overlay1_dir/path
status
は、オーバーレイ用ディレクトリの状態を知ることができるインターフェースで、cat することでこのディレクトリの dtboもしくはpath を使ってオーバーレイが実施されているかを知ることが可能です。# cat $OVL_PATH/my_overlay1_dir/status /*applied か unapplied がprint される*/参考資料
Solution Zynq PL Programming With FPGA Manager
https://rocketboards.org/foswiki/Documentation/HOWTOCreateADeviceTree
FPGA+SoC+LinuxでDevice Tree Overlayを試してみた :@ikwzm さんの記事、いつも参考にさせていただいておりますm(--)m
- 投稿日:2020-05-19T14:21:40+09:00
2020年6月新学期! 今から始めるVimのチュートリアル
Vimのチュートリアルをやって、Vim初心者になろう
どうもこんにちは。毎日が日曜日のサンデープログラマー、ヨコスキーです。
皆さん、Vim使ってますか?
この記事では、Vimに取っ付き難さを感じているそんな皆さんへ、とりあえずVim初心者になるにはどうしたら良いか、をご紹介したいと思います。Vim初心者になる、それには
- Vimに付いて来てる、チュートリアルをやってみる
のが、一番の近道です。
Vimのチュートリアルは、30分程度でVimの基本操作を一通り学習できる、とても良く考えられたチュートリアルです。日本語環境であれば日本語で学習できます1。このチュートリアルをやってみれば、Vimに対して感じていた敷居の高さが、低くなること請け合いです。どうやって、チュートリアルを実行しますか?
何だか、こなれてない翻訳物みたいな見出しレベル2ですが、まずは肝心のVimです。お手元の環境に、Vimはインストールされていますか?
リモートで、どこかのサーバーに入れるのであれば、そこで使えるVimでも良いと思います。使えるVimが無ければ、お使いのOSに合わせて、Vimをインストールしてください。Windowsをお使いなら
Windowsでは、次の内のどちらかが、練習用として入れてみるVimの候補になると思います。お勧めは、香り屋さん版です。
2つのWindows用Vimについて、簡単にその特長をまとめてみました。
特記事項 配布形態 起動方法 香り屋さん版 日本語を扱うのに便利な設定済 Zipファイル gvim/vim内で:Tutorial vim.org版 チュートリアルの実行に管理者権限必要 Windowsインストーラ 管理者でコマンドプロンプトから$ vimtutor 香り屋さん版は、日本語対応を謳っていますが、vim.org版には、特にそのようなカスタマイズは無く、ただの普通のVimだと思います。チュートリアルを実行するだけであれば、どちらも普通に日本語のチュートリアルが立ち上がります。できることに、特別な違いはありません。
香り屋さん版Vimで、チュートリアルを実行するには
- 香り屋さん版Vimの説明に従って、zipファイルをダウンロードします。
- 適当なフォルダに、zipファイルを展開します。
- フォルダ内のgvimをダブルクリックして、gvimを起動します。
- gvimが立ち上がったら、おもむろに「:Tutorial⏎」と入力してください。⏎は、エンターキーです。すると、チュートリアルが立ち上がりますので、後はチュートリアルの指示に従ってください。
vim.org版Vimで、チュートリアルを実行するには
- vim.org版Vimから、インストーラファイルをダウンロードします。
- 通常のWindowsアプリケーションと同様に、インストールしてください。チュートリアルを実行するだけなら、インストーラが聞いてくる設定を変更する必要はありません。
コマンドプロンプトを開きます。このとき、管理者で無いアカウントでチュートリアルを実行するのであれば、"管理者として実行"してください。
Vimをインストールしたフォルダ以下のbatファイルがあるフォルダにcdします。vimのバージョンが8.2で、インストール時に設定を変更していなければ、c:\Program Files (x86)\vim\vim82にあると思います。
C:\WINDOWS\system32>cd "c:\Program Files (x86)\Vim\vim82" c:\Program Files (x86)\Vim\vim82>dir *.bat ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は E3BD-94E0 です c:\Program Files (x86)\Vim\vim82 のディレクトリ 2018/01/27 05:20 1,812 vimtutor.bat 1 個のファイル 1,812 バイト 0 個のディレクトリ 128,640,741,376 バイトの空き領域 c:\Program Files (x86)\Vim\vim82>vimtutor"vimtutor"と入力します。すると、gvimがチュートリアルを開いた状態で立ち上がります。後は、チュートリアルの指示に従ってください。
管理者のアカウントであれば、スタートメニューのVim 8.2以下にあるVim tutorを実行することで、チュートリアルを起動することができます。
また、自分でgvimにパスを通せば、エクスプローラからvimtutor.batを選択して"管理者として実行"することでも、チュートリアルを起動することができます。チュートリアルでは、実際にサンプルファイルを書き換えて、vimの使い方を学習します。vimtutorコマンドや、香り屋さん版Vimの:Tutorialコマンドでチュートリアルを実行しようとすると、まずvimがオリジナルのチュートリアルファイルをコピーして、サンプルファイルとして保存しようとします。vim.org版では、この書込み先がProgram Filesのインストール先になってしまうため、管理者で無いアカウントではエラーが発生してしまいます。
Linuxでチュートリアルを実行するには
チュートリアルのUnixの項の指示に従ってください。
チュートリアルの実行に必要なのは、チュートリアル用のテキストファイルであって、本体の機能がそれ用にコンパイルされているとかいないとかは無いと思います。しかし、あまりにも素うどん的なvimのパッケージしかインストールされてないと、チュートリアル用のテキストファイルが存在しないことがあるかもしれません。わたしは今まで、Linuxでチュートリアルを実行しようとしてエラーに当ったことはありませんが、もしもエラーで失敗するようであれば、エラーメッセージを良く読んでから、大き目のvimのパッケージのインストールを検討してみてください。
因みに、手元のCentOS 6.xで確認したところ、vim-enhancedが入っていました。Ubuntu16.04では、vim.basicですね。どちらも、vimtutor jaで日本語のチュートリアルが立ち上がります。Macで...
FreeBSDベースのOS、というところから、理解がフリーズしています。チュートリアルのUnixの指示でいいのかもしれません。また、macvim-kaoriyaというプロジェクトもあるようです。
チュートリアルをやってみたら
例によって、公式のドキュメントを読みましょう。有志の方によって日本語に翻訳されたドキュメントが、以下の場所にあります。
この中にあるtutorを読みましょう。チュートリアルもここで紹介されています。チュートリアルを一度やってしまえば、それ以外の項目は、必要により
自分をVimに合わせていけば2参照すれば良いと思います。また、vimエディタ・スターターマニュアル #2 (モードの切替)も、チュートリアルをやってみてVimのモードについて疑問が湧いたら、読んでみると理解が進むと思います。英語でチュートリアルをやってみる
日本語のチュートリアルをやってみて、日本語IMEのON/OFFが煩雑だと感じたり、そもそもVimで日本語を入力する場面が思い浮かばないのであれば、英語のチュートリアルをやってみるのはどうでしょうか。英語のチュートリアルであれば、Vimのモード切り替えのみに集中することができます。
香り屋さん版Vimで、英語のチュートリアルを実行するには
英語のチュートリアルファイルを、まずコピーします。これは、オリジナルのファイルを潰さないためです。それからコマンドラインから、オプションを与えてgvimを実行します。
C:\Users\yokoski> C:\Users\yokoski>cd opt\vim82-kaoriya-win64 C:\Users\yokoski\opt\vim82-kaoriya-win64>cp vim82\tutor\tutor tutor.en C:\Users\yokoski\opt\vim82-kaoriya-win64>dir tutor.en ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は E3BD-94E0 です C:\Users\yokoski\opt\vim82-kaoriya-win64 のディレクトリ 2020/05/18 14:53 33,257 tutor.en 1 個のファイル 33,257 バイト 0 個のディレクトリ 128,565,624,832 バイトの空き領域 C:\Users\yokoski\opt\vim82-kaoriya-win64>gvim -u NONE -c "set nocp" tutor.enわたしが、香り屋さん版VimのZipファイルを展開したフォルダは、ホームフォルダ以下のoptフォルダです。vim82\tutorフォルダ以下に、各言語各エンコーディングのチュートリアルファイルがあって、tutorが英語版のファイルです。gvimに与えている起動オプションは、-u NONEで設定ファイルを読み込まない、-c "set nocp"でVi互換でない、になります。これらの起動オプションは、vim.org版のvimtutor.batを参考にしています。
vim.org版Vimで、英語のチュートリアルを実行するには
vim.org版Vimで、チュートリアルを実行するには、の5.で、"vimtutor en"と入力してください。
さぁて、来週のVimerさんは?
チュートリアルを一回やってみれば、もうあなたはVim初心者です。怖いものなんて、ありません。かく言うわたしも、普段実際に使っているのは、チュートリアルで学習した内容の一部だけです。
結局、なんで自分がVimを使っているかというと、Vimのインターフェイスに手と頭が馴染んでいるから、に他なりません。少し複雑な置換をしようとすると、方法が分からず、毎回検索エンジンのお世話になっていますが、それでいいと思っています。「Vimでこんなことが出来たはずだけど」ということを知っているということが、「Vimを使うと、何が嬉しいのよ?」から抜け出せてる、ということなのですから。さぁて、来週のVimerさんは?
豊富なPluginを試してみるのもいいでしょう。でも、わたしのお勧めは、香り屋さん版Vimの設定ファイルを読んでみることです。日本語でのコメントが、Plugin導入の助けになること請け合いです。
これは善し悪しだと思います。あなたが、Vimで日本語を扱うつもりが無いのであれば、英語でチュートリアルをやってみるのも、また一興かもしれません。 ↩
これはいけません。Vimのインターフェイスから抜け出せなくなって、最後はVimに取り込まれてしまいます。 ↩
- 投稿日:2020-05-19T12:35:05+09:00
Linux基礎2 -シェルの便利な機能-
ショルはコマンド入力を効率よく行うためのさまざまな機能を有している。
今回は、シェルからコマンドを入力する方法を確認する。コマンドラインの編集
コマンドは、プロンプト記号の後ろに入力する。コマンド入力部分のことをコマンドラインと呼ぶ。
プロンプトとコマンドライン$ echo Hello ⬜︎ # ⬜︎ はカーソル
- "$" -> プロンプト
- "echo Hello ⬜︎"-> 文字列を入力しているエリア -> コマンドライン
カーソルの移動
カーソルの移動にはカーソルキー←↑↓→を可能な限り使用せず、コントロールキーを利用したキー入力をおすすめする。
頻度の高い操作のたびにホームポジションを崩してしまうと、効率がよくないからである。カーソル移動に関するキー入力
キー入力 内容 Ctrl+b 後方に一文字分移動する Ctrl+f 前方に一文字分移動する Ctrl+a 行頭に移動する Ctrl+e 行末に移動する Meta+b 後方に単語一つ分移動する Meta+f 前方に単語一つ分移動する ※一般的なパソコンにはMetaキーがないため下記のいずれかの方法で代用します。
- Escキーを押してから、b(f)キーを押す
- Altキーを押しながら、b(f)キーを押す削除コマンド
文字を余計に叩いてしまった場合に削除する方法は以下の通り。
文字の削除に関するキー入力
キー入力 内容 備考 BackSpace、Ctrl+h カーソル位置の後方に一文字削除する キーボードやターミナルエミュレータの設定次第で使用できないこともある Delete、Ctrl+d カーソル位置の一文字を削除する コマンドラインに何も入力されていない場合、bashはログアウト操作とみなしてしまうので注意 Ctrl+w 後方にスペース区切りで一単語分を削除する 特になし カットとヤンク(ペースト)
よくあるカットアンドペースト。覚えておくと何かと使い勝手が良い。
カットとヤンクに関するキー入力
キー入力 内容 Ctrl+k カーソル位置から行末までを削除する Ctrl+u カーソル位置から行頭までを削除する Ctrl+y 最後に削除した内容を挿入する トラブルが発生した時に覚えておくと良いこと
ユーザの単純な操作ミスにより、キーボードの操作を受け付けない状態になったり、プロンプトが返ってこないという状態になることがある。ここでは、そんなトラブルへの対処方法について紹介する。
各種トラブルと対処方法としてのキー入力
トラブル キー入力 内容 キーボードからの操作を一切受け付けない Ctrl+s 画面表示をロックする 〃 Ctrl+q 画面表示のロックを解除する コマンドが終了せず、プロンプトが返ってこない Ctrl+c 実行中のコマンドを強制終了する プロンプトが文字化けしている Ctrl+l 画面を消去する キーボードからの操作を一切受け付けない場合
Ctrl+sを誤って入力してしまうと画面がロックされて操作を視覚的に確認できなくなる。叩いた文字列は受け付けられているので落ち着いてCtrl+qを叩いて画面のロックを解除しましょう。
コマンドが終了せずプロンプトが返ってこない
Linuxの一部のコマンドは、実行した後は明示的に終了操作をしない限り、動き続ける仕組みになっているものがある。このようなコマンドはCtrl+cで実行中のコマンドを終了させてプロンプトを返す。
例えば下の図ではネットワークの疎通をチェックするpingコマンドを実行して、Ctrl+c(^C)で終了している。^Cの入力で実行中のpingが終了し、プロンプトが返ってくる。
プロンプトが文字化けしている
画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。
補完機能
bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。bashの補完機能$ ec #ここで Tabキーを入力 $ echo #自動でechoと入力される候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。コマンド履歴
bashは一度入力したコマンドラインの内容を自動的に記録している。
コマンド履歴の操作
キー入力 内容 Ctrl+p、↑キー 一つ前のコマンド履歴に移動する Ctrl+n、↓キー 次のコマンド履歴に移動する Ctrl+r 履歴を遡ってインクリメンタル検索する コマンド履歴の検索
多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。インクリメンタル検索の時のプロンプト(reverse-i-search)`':
インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する。
また、インクリメンタル検索の状態での操作を次の表に示す。
キー入力 内容 文字の入力 検索語を追加して再検索 Ctrl+r 一つ前の検索結果へ移動 Enter 現在の検索結果を実行 Esc 現在の検索結果を表示したまま、コマンドラインに戻る Ctrl+g 検索結果を破棄し、プロンプトに戻る 参考資料
- 投稿日:2020-05-19T12:35:05+09:00
Linux基礎 2-シェルの便利な機能-
ショルはコマンド入力を効率よく行うためのさまざまな機能を有している。
今回は、シェルからコマンドを入力する方法を確認する。コマンドラインの編集
コマンドは、プロンプト記号の後ろに入力する。コマンド入力部分のことをコマンドラインと呼ぶ。
プロンプトとコマンドライン$ echo Hello ⬜︎ # ⬜︎ はカーソル
- "$" -> プロンプト
- "echo Hello ⬜︎"-> 文字列を入力しているエリア -> コマンドライン
カーソルの移動
カーソルの移動にはカーソルキー←↑↓→を可能な限り使用せず、コントロールキーを利用したキー入力をおすすめする。
頻度の高い操作のたびにホームポジションを崩してしまうと、効率がよくないからである。カーソル移動に関するキー入力
キー入力 内容 Ctrl+b 後方に一文字分移動する Ctrl+f 前方に一文字分移動する Ctrl+a 行頭に移動する Ctrl+e 行末に移動する Meta+b 後方に単語一つ分移動する Meta+f 前方に単語一つ分移動する ※一般的なパソコンにはMetaキーがないため下記のいずれかの方法で代用します。
- Escキーを押してから、b(f)キーを押す
- Altキーを押しながら、b(f)キーを押す削除コマンド
文字を余計に叩いてしまった場合に削除する方法は以下の通り。
文字の削除に関するキー入力
キー入力 内容 備考 BackSpace、Ctrl+h カーソル位置の後方に一文字削除する キーボードやターミナルエミュレータの設定次第で使用できないこともある Delete、Ctrl+d カーソル位置の一文字を削除する コマンドラインに何も入力されていない場合、bashはログアウト操作とみなしてしまうので注意 Ctrl+w 後方にスペース区切りで一単語分を削除する 特になし カットとヤンク(ペースト)
よくあるカットアンドペースト。覚えておくと何かと使い勝手が良い。
カットとヤンクに関するキー入力
キー入力 内容 Ctrl+k カーソル位置から行末までを削除する Ctrl+u カーソル位置から行頭までを削除する Ctrl+y 最後に削除した内容を挿入する トラブルが発生した時に覚えておくと良いこと
ユーザの単純な操作ミスにより、キーボードの操作を受け付けない状態になったり、プロンプトが返ってこないという状態になることがある。ここでは、そんなトラブルへの対処方法について紹介する。
各種トラブルと対処方法としてのキー入力
トラブル キー入力 内容 キーボードからの操作を一切受け付けない Ctrl+s 画面表示をロックする 〃 Ctrl+q 画面表示のロックを解除する コマンドが終了せず、プロンプトが返ってこない Ctrl+c 実行中のコマンドを強制終了する プロンプトが文字化けしている Ctrl+l 画面を消去する キーボードからの操作を一切受け付けない場合
Ctrl+sを誤って入力してしまうと画面がロックされて操作を視覚的に確認できなくなる。叩いた文字列は受け付けられているので落ち着いてCtrl+qを叩いて画面のロックを解除しましょう。
コマンドが終了せずプロンプトが返ってこない
Linuxの一部のコマンドは、実行した後は明示的に終了操作をしない限り、動き続ける仕組みになっているものがある。このようなコマンドはCtrl+cで実行中のコマンドを終了させてプロンプトを返す。
例えば下の図ではネットワークの疎通をチェックするpingコマンドを実行して、Ctrl+c(^C)で終了している。^Cの入力で実行中のpingが終了し、プロンプトが返ってくる。
プロンプトが文字化けしている
画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。
補完機能
bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。bashの補完機能$ ec #ここで Tabキーを入力 $ echo #自動でechoと入力される候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。コマンド履歴
bashは一度入力したコマンドラインの内容を自動的に記録している。
コマンド履歴の操作
キー入力 内容 Ctrl+p、↑キー 一つ前のコマンド履歴に移動する Ctrl+n、↓キー 次のコマンド履歴に移動する Ctrl+r 履歴を遡ってインクリメンタル検索する コマンド履歴の検索
多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。インクリメンタル検索の時のプロンプト(reverse-i-search)`':
インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する。
また、インクリメンタル検索の状態での操作を次の表に示す。
キー入力 内容 文字の入力 検索語を追加して再検索 Ctrl+r 一つ前の検索結果へ移動 Enter 現在の検索結果を実行 Esc 現在の検索結果を表示したまま、コマンドラインに戻る Ctrl+g 検索結果を破棄し、プロンプトに戻る 参考資料
- 投稿日:2020-05-19T12:35:05+09:00
Linux基礎 -シェルの便利な機能-
ショルはコマンド入力を効率よく行うためのさまざまな機能を有している。
今回は、シェルからコマンドを入力する方法を確認する。コマンドラインの編集
コマンドは、プロンプト記号の後ろに入力する。コマンド入力部分のことをコマンドラインと呼ぶ。
プロンプトとコマンドライン$ echo Hello ⬜︎ # ⬜︎ はカーソル
- "$" -> プロンプト
- "echo Hello ⬜︎"-> 文字列を入力しているエリア -> コマンドライン
カーソルの移動
カーソルの移動にはカーソルキー←↑↓→を可能な限り使用せず、コントロールキーを利用したキー入力をおすすめする。
頻度の高い操作のたびにホームポジションを崩してしまうと、効率がよくないからである。カーソル移動に関するキー入力
キー入力 内容 Ctrl+b 後方に一文字分移動する Ctrl+f 前方に一文字分移動する Ctrl+a 行頭に移動する Ctrl+e 行末に移動する Meta+b 後方に単語一つ分移動する Meta+f 前方に単語一つ分移動する ※一般的なパソコンにはMetaキーがないため下記のいずれかの方法で代用します。
- Escキーを押してから、b(f)キーを押す
- Altキーを押しながら、b(f)キーを押す削除コマンド
文字を余計に叩いてしまった場合に削除する方法は以下の通り。
文字の削除に関するキー入力
キー入力 内容 備考 BackSpace、Ctrl+h カーソル位置の後方に一文字削除する キーボードやターミナルエミュレータの設定次第で使用できないこともある Delete、Ctrl+d カーソル位置の一文字を削除する コマンドラインに何も入力されていない場合、bashはログアウト操作とみなしてしまうので注意 Ctrl+w 後方にスペース区切りで一単語分を削除する 特になし カットとヤンク(ペースト)
よくあるカットアンドペースト。覚えておくと何かと使い勝手が良い。
カットとヤンクに関するキー入力
キー入力 内容 Ctrl+k カーソル位置から行末までを削除する Ctrl+u カーソル位置から行頭までを削除する Ctrl+y 最後に削除した内容を挿入する トラブルが発生した時に覚えておくと良いこと
ユーザの単純な操作ミスにより、キーボードの操作を受け付けない状態になったり、プロンプトが返ってこないという状態になることがある。ここでは、そんなトラブルへの対処方法について紹介する。
各種トラブルと対処方法としてのキー入力
トラブル キー入力 内容 キーボードからの操作を一切受け付けない Ctrl+s 画面表示をロックする 〃 Ctrl+q 画面表示のロックを解除する コマンドが終了せず、プロンプトが返ってこない Ctrl+c 実行中のコマンドを強制終了する プロンプトが文字化けしている Ctrl+l 画面を消去する キーボードからの操作を一切受け付けない場合
Ctrl+sを誤って入力してしまうと画面がロックされて操作を視覚的に確認できなくなる。叩いた文字列は受け付けられているので落ち着いてCtrl+qを叩いて画面のロックを解除しましょう。
コマンドが終了せずプロンプトが返ってこない
Linuxの一部のコマンドは、実行した後は明示的に終了操作をしない限り、動き続ける仕組みになっているものがある。このようなコマンドはCtrl+cで実行中のコマンドを終了させてプロンプトを返す。
例えば下の図ではネットワークの疎通をチェックするpingコマンドを実行して、Ctrl+c(^C)で終了している。^Cの入力で実行中のpingが終了し、プロンプトが返ってくる。
プロンプトが文字化けしている
画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。
補完機能
bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。bashの補完機能$ ec #ここで Tabキーを入力 $ echo #自動でechoと入力される候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。コマンド履歴
bashは一度入力したコマンドラインの内容を自動的に記録している。
コマンド履歴の操作
キー入力 内容 Ctrl+p、↑キー 一つ前のコマンド履歴に移動する Ctrl+n、↓キー 次のコマンド履歴に移動する Ctrl+r 履歴を遡ってインクリメンタル検索する コマンド履歴の検索
多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。インクリメンタル検索の時のプロンプト(reverse-i-search)`':
インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する。
また、インクリメンタル検索の状態での操作を次の表に示す。
キー入力 内容 文字の入力 検索語を追加して再検索 Ctrl+r 一つ前の検索結果へ移動 Enter 現在の検索結果を実行 Esc 現在の検索結果を表示したまま、コマンドラインに戻る Ctrl+g 検索結果を破棄し、プロンプトに戻る 参考資料
- 投稿日:2020-05-19T10:24:37+09:00
Linuxコマンドが勉強できるLINEスタンプを作ったよ
はじめに
- コミュニケーションしながらコマンドを勉強できると楽しいかなと思ったので作りました☆
- 自分の商品を持ちたかった
- コマンドを表現するしぐさを考えるのは結構楽しい
スタンプの種類
第1弾
https://store.line.me/stickershop/product/10720970/ja
- catコマンドがお気に入りです!かわいいです☆
第2弾
https://store.line.me/stickershop/product/10918426/ja
- sudoコマンドがお気に入りです!かっこよくないですか!
第3弾
https://store.line.me/stickershop/product/11110796/ja
- routeコマンドがお気に入りです!眼帯が最高にカッコいい
第4弾
https://store.line.me/stickershop/product/11724293/ja
- dockerコマンドがお気に入りです!船長です
作ってくれた人
ありがとうございます☆
https://uuunagisa.tumblr.com/
- 投稿日:2020-05-19T06:36:32+09:00
jupyter-lab で複数ロボを制御
はじめに
AIの開発環境として、pythonが多く使われています。特に開発環境では、VS-code, jupyter-labで開発されている方も多いのではないでしょうか?さらにAIの応用例として、Roboticsが上げられます。先に言っておきましょう、
ロボは漢[おとこ]のロマンである
と。SBCジャンキー
SBCとはSingle Board Computerの略称です。ラズパイとかそんなのをイメージしてもらえば良いと思います。これ、自分がそうなのですが、新しいのを出るとつい買ったりしませんか?すぐに「勉強」とか「Armの新しいSoCには常に触れておかねば!」とか適当な理由を付けて買います。期末に予算が微妙に余ると、「じゃ、買っておくか!?」って感じで。SDにイメージを焼くとこまではやるんですが、その後は特に使うまでもなく。のべつまくなしに買うのも大人げないので、もっともらしいルールを自分の中で設けます。「64bit以上のSoCとOS」、「サイズはラズパイと同一」とか。でも、なぜか予算にはあまり縛りを設けず、割と高めのSBCを買ってしまったりします。最近だとJetson-Nanoとか…。
応用と運用のたたかい
最初のうちは、Home-AutomationとかIoTの勉強とかをそれなりにやるんですが、SBCの増殖の方が導入より圧倒的に速く、運用が追いつかかなくなります。しまいには「なんで、こんなボード買ったんだろ?」ってなります。買ったのは自分なのに…。
意味のあるスケールとは?
IoTをはじめとしたシステムのPoCが成功すると、二言目には「それ、スケールできるの?」って話になります。売上だったり、導入台数だったり、その時の営業やコンサルの立ち位置で文脈は変わりますが、PoCの後にこの言葉が来るのは皆さんの皮膚感覚でしょう。なぜかスケールが先に来て「投機的実行」がなされた皆さんのSBCを意味のあるものにしましょう。だからと言って、各SBCにセンサを1個だけ付けて、廊下に50cm毎に設置しても意味ないですよね?
で、ロボ軍団
数が多ければ多いほど楽しくうれしいのは軍団を作ることです。古では春秋戦国時代、現代では社内派閥がそれですね。個性に溢れた個で構成されていると魂が揺さぶられます。様々なSBCで構成されたロボ軍団はこの文脈をそのままトレース出来ます。ついでにセンサもつけちゃいましょう。赤外線とか紫外線とか温度とかも。熱源(赤外線)探知が出来るロボに索敵させて、ヘビー級ロボから発射されるミサイル攻撃。妄想が広がりまくリングですね。
で、jupyter-lab
やっとjupyter-labまで来ました。自分より皆さんのほうがjupyter-labには詳しいと思うので、そのものの説明はしません。応用例のみ、簡潔に記述します。一言で言うなら、
ロボットにそれぞれ、jupyter-labのサービスを実行させ、手元のPCに接続されたゲームコントローラで制御する。
これを行うためには、FrontEnd(PC)のブラウザでゲームコントローラの入力値を読み取り、jupter-lab上で実行されているpythonスクリプトに入力値を渡し、ロボの動作にします。リアルタイム制御
ロボをはじめとした組み込みシステムの制御になると、この言葉が不可分のように出てきます。誤解を恐れずに言えば、どんなシステムにも「
リアルタイム制御成分
」はあります。リアルタイム制御
とはリアルタイム性
が成立しているかどうかになります。リアルタイム性
とはその時間内での動作実行を運用上、許容出来るか、どうか?になります。Linux, クライアント・サーバ, インタプリタ
とリアルタイムとは程遠い三連コンボが今回のシステムです。Trade-off
先程述べた
スケール
がPoC後の話なら、Trade-off
は設計・開発・実装時に使われる言葉です。今回のシステムにももちろんあります。代表的な例としては、アナログスティックを切り捨てたことです。アナログスティックの読み取り速度(Sampling-rate)とイベントの発生回数(Frequency)が遅すぎました。ロボの移動速度についていけずに制御不能です。ここでのトレードオフとして、リアルタイム性
を確保するためには、Sampling-rateとFrequencyを上げるか、ロボの移動速度を下げるしかありません。前者はシステムの構成上、不可能ですし、後者は利用していて面白く有りません。最後に
こんな中二病が結晶化したプロジェクトの顛末記を最後まで読んでいただいて、本当にありがとうございます。システムを作っているうちに、妄想が広がりました。ついでにリアルタムシステムの端緒を知っていただきたく書いてみました。
開発リソース
- 投稿日:2020-05-19T05:44:18+09:00
Deadline IO scheduler tunables
https://www.kernel.org/doc/html/latest/block/deadline-iosched.html
Deadline IO scheduler tunables
This little file attempts to document how the deadline io scheduler works. In particular, it will clarify the meaning of the exposed tunables that may be of interest to power users.
この小さなファイルでは、deadline io schedulerがどのように動作するのかを文章化しようとしています。特に、パワーユーザーが関心を抱くであろう、公開されたチューニングできる調整に関して明らかにしていきます。
Selecting IO schedulers
Refer to Documentation/block/switching-sched.rst for information on selecting an io scheduler on a per-device basis.
デバイス毎にio schedulerを選択する情報に関しては、Documentation/block/switching-sched.rstを参照してください
read_expire (in ms)
The goal of the deadline io scheduler is to attempt to guarantee a start service time for a request. As we focus mainly on read latencies, this is tunable. When a read request first enters the io scheduler, it is assigned a deadline that is the current time + the read_expire value in units of milliseconds.
deadline io scheduler の目的は、要求に対してstart service timeを保障しようとするものである。read latencyに注目し、それを調整することができます。io schedulerに初めてread requestが到達した場合、current_ time + read_expireのdeadlineが割り当てられます。これらの単位はmillisecondsです。
write_expire (in ms)
Similar to read_expire mentioned above, but for writes.
read_expireを同じようなものですが、これはwriteに関するものです。
fifo_batch (number of requests)
Requests are grouped into batches of a particular data direction (read or write) which are serviced in increasing sector order. To limit extra seeking, deadline expiries are only checked between batches. fifo_batch controls the maximum number of requests per batch.
要求は、それぞれのデータの方向(read / write)のbatchとしてグループ化されます。これらは、セクター順序で処理されます。余計なseekを限定するために、期限が切れたexpireはbatch館でのみチェックされます。fifo_batchは、batch単位で要求の最大数を制御するものである。
This parameter tunes the balance between per-request latency and aggregate throughput. When low latency is the primary concern, smaller is better (where a value of 1 yields first-come first-served behaviour). Increasing fifo_batch generally improves throughput, at the cost of latency variation.
このパラメータは、リクエスト毎のlatencyと、スループット保障の間でのバランスを調整するものです。low lantencyが重要だと考えれば、小さい値が有益です(1を指定すると、最初に来たものを最初に処理する振る舞いをします)。fifo_batchを増価させる事で、一般的にスループットが良くなりますが、latencyはばらつきます。
writes_starved (number of dispatches)
When we have to move requests from the io scheduler queue to the block device dispatch queue, we always give a preference to reads. However, we don’t want to starve writes indefinitely either. So writes_starved controls how many times we give preference to reads over writes. When that has been done writes_starved number of times, we dispatch some writes based on the same criteria as reads.
io scheduker queueから、block device dispatch queueに対して要求を多く動かさねばならない場合、常に読み込みを優先させなければならないです。しかし、書き込みを無制限に枯渇させたくはないです。そこで、writes_starvedはどれだけの回数を読み込みから書き込みに優先させるかを制御します。writes_starvedの回数実行されると、readと同じ優先度で、writeがdispatchされます。
front_merges (bool)
Sometimes it happens that a request enters the io scheduler that is contiguous with a request that is already on the queue. Either it fits in the back of that request, or it fits at the front. That is called either a back merge candidate or a front merge candidate. Due to the way files are typically laid out, back merges are much more common than front merges. For some work loads, you may even know that it is a waste of time to spend any time attempting to front merge requests.
既にqueueにある要求に隣接するio schedulerに要求が来る場合があります。この場合、その要求の後ろに収まる、あるいは、前に収まります。これは、back merge candidateあるいはfront merge candidateと呼ばれます。ファイルの通常のレイアウト方法では、バックマージはフロントマージよりもはるかに一般的です。一般の作業負荷では、マージ要求に対するフロントへの処理を試みるために時間を費やすことは時間の無駄であると認識できるかもしれません。
Setting front_merges to 0 disables this functionality. Front merges may still occur due to the cached last_merge hint, but since that comes at basically 0 cost we leave that on. We simply disable the rbtree front sector lookup when the io scheduler merge function is called.
front_mergesを0にセットする事で、この機能を無効化できます。キャッシュされたlast_merge hintに基づいて再びFront mergeされる可能性はありますが、基本的には0 costであるため、何もしません。io schedulerのmerge functionが呼びされたときの、rbtree front sector lookupを単純に無効化するだけです。
Nov 11 2002, Jens Axboe <jens.axboe@oracle.com>
もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる(はずの認識)。
https://www.kernel.org/doc/html/latest/index.html
Licensing documentation
The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing
- 投稿日:2020-05-19T00:01:58+09:00
ホームポジションから動かないためのコマンド操作
はじめに
コマンドを打つ時、今までは矢印キーをほぼ100%使ってきました。
矢印キーを使わずにホームポジションを守りつつコマンドを進めていくためのコマンドをまとめてみました。便利コマンド操作まとめ
●<カーソルの移動>
ctrl + b
:1文字戻る
ctrl + f
:1文字進む※矢印キーは極力使わない
→ホームポジションを保つため●<行頭へ移動>
ctrl + a
●<文末へ 移動>
ctrl + a
●<単語ごとの移動>
esc + b
:(カーソルの乗った)単語の先頭
esc + f
:(カーソルの乗った)単語の最後●<単語ごとの削除>
ctrl + w
:(カーソルの乗った)単語の削除●<コマンドのカットとヤンク(ペースト)>
ctrl + k
:カーソルの位置から文末までを削除
ctrl + u
:カーソルの位置から行頭までを削除
ctrl + y
:最後に削除した内容をペーストトラブル対処法
●<画面をスッキリさせる>
ctrl + l
または$ clear
で不要な情報を消して画面を一度きれいにしてくれる補完機能
●<bashの補完機能>
・
Tabキー
:ecの時点でのTabキーでechoを補完してくれる
→コマンドを全て打つ手間を省くことが出来るコマンド履歴
●<履歴の操作>
ctrl + p
または↑
:1つ前のコマンド
(pはprevious)
ctrl + n
または⇩
:1つ後のコマンド
(nはnext)●<打ったコマンドの検索>
ctrl + r
:コマンドの検索