20200519のLinuxに関する記事は14件です。

ラズパイにArchLinux環境を構築する@hibi221b-version

はじめに

この記事ではRaspberrypi 3 Model BにArchLinuxの環境を構築するまでの過程を書いきます(所有しているラズパイが3ModelBのため)。バージョンは少々古いですが、最新版のラズパイ4と比較しても、インストール手順はさほど変わらないと思います。バージョン3以降のラズパイでArchLinuxを動かしたいと思っている人が、この記事の対象となります。

最終的にどのような環境が出来上がる?

今回、デスクトップ環境はxfceを使用します。

end.png

インストール手順

3部構成となります。

=== 仮想環境に用意したlinuxで行う ===
1章. パーティションやファイルシステムの設定をmicroSDカードに書き込む

=== ラズパイでの作業 ===
2章. ロケール、キーボード、ネットワーク、ユーザー追加、時刻、Xorg、デスクトップ環境などの各種設定
3章. 選択したdesktop環境上でのカスタマイズ

1章

この章ではmicroSDカードにarchLinuxのパーティションとファイルシステムを構築します。公式のインストール手順とほぼ同じですが、一連の流れを追うことができると思います。fdiskmounttarなどのコマンドが使えるならばどのような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-4

microSDカードのフォーマット

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/sdb1

Zorin OS 15.2 Liteを使用している場合は、umountしても一定時間後に自動的にマウントされてしまうため、Removable Storageのチェックを全て外してください。

usb.png

現在の利用可能なブロックデバイスの確認

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 Linux

FATファイルシステムの作成とマウント

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 boot

ext4ファイルシステムの作成とマウント

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: done   
root@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-4

root@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  var

sync

以下のサイトで詳しく解説されていますのでそちらを参照してください。

syncコマンド | Linux技術者認定リナック | LPI-Japan
https://linuc.org/study/knowledge/413/

root@hibi221b:/home/hibi21b# sync

移動

やっていることは単純なのですが、ディレクトリ名がややこしいので図にしました。

root@hibi221b:/home/hibi21b# mv root/boot/* boot

mv.png

root@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 root

audit

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@.service

reboot後、ifconfigip 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=false 

rebootしてください。

タイムゾーン

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 hibi221b

hibi221bの一般ユーザが追加されている確認

[root@hibi221b ~]# cat /etc/passwd

デフォルトでalarmという一般ユーザが作られています。このユーザを使う予定はないので削除しておきます。-rでalarmユーザのホームディレクトリも消します。

[root@hibi221b ~]# ls /home
alarm hibi221b
[root@hibi221b ~]# userdel -r alarm

alarm一般ユーザが消えたか確認

[root@hibi221b ~]# cat /etc/passwd
[root@hibi221b ~]# ls /home
hibi221b

pacman

ネットワークの設定などが終わったので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 -Syu

x 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-amdgpu

sudo

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.service

xfceの起動

今回はデスクトップ環境に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 ~]# startxfce4

xfce_desktop.png

3章

それでは、これから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の設定です。

xscreensaver.png

日本語対応

パッケージをインストールし、$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 chromium

vscodiumのインストール

オープンソースの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/vscodium

yay

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/yay

iconを変更

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

complete.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ラズパイにArchLinux環境を構築する

はじめに

この記事ではRaspberrypi 3 Model BにArchLinuxの環境を構築するまでの過程を書いきます(所有しているラズパイが3ModelBのため)。バージョンは少々古いですが、最新版のラズパイ4と比較しても、インストール手順はさほど変わらないと思います。バージョン3以降のラズパイでArchLinuxを動かしたいと思っている人が、この記事の対象となります。

最終的にどのような環境が出来上がる?

今回、デスクトップ環境はxfceを使用します。

end.png

インストール手順

3部構成となります。

=== 仮想環境に用意したlinuxで行う ===
1章. パーティションやファイルシステムの設定をmicroSDカードに書き込む

=== ラズパイでの作業 ===
2章. ロケール、キーボード、ネットワーク、ユーザー追加、時刻、Xorg、デスクトップ環境などの各種設定
3章. 選択したdesktop環境上でのカスタマイズ

1章

この章ではmicroSDカードにarchLinuxのパーティションとファイルシステムを構築します。公式のインストール手順とほぼ同じですが、一連の流れを追うことができると思います。fdiskmounttarなどのコマンドが使えるならばどのような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-4

microSDカードのフォーマット

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/sdb1

Zorin OS 15.2 Liteを使用している場合は、umountしても一定時間後に自動的にマウントされてしまうため、Removable Storageのチェックを全て外してください。

usb.png

現在の利用可能なブロックデバイスの確認

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 Linux

FATファイルシステムの作成とマウント

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 boot

ext4ファイルシステムの作成とマウント

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: done   
root@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-4

root@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  var

sync

以下のサイトで詳しく解説されていますのでそちらを参照してください。

syncコマンド | Linux技術者認定リナック | LPI-Japan
https://linuc.org/study/knowledge/413/

root@hibi221b:/home/hibi21b# sync

移動

やっていることは単純なのですが、ディレクトリ名がややこしいので図にしました。

root@hibi221b:/home/hibi21b# mv root/boot/* boot

mv (1).png

root@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 root

audit

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@.service

reboot後、ifconfigip 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=false 

rebootしてください。

タイムゾーン

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 hibi221b

hibi221bの一般ユーザが追加されているか確認

[root@hibi221b ~]# cat /etc/passwd

デフォルトでalarmという一般ユーザが作られています。このユーザを使う予定はないので削除しておきます。-rでalarmユーザのホームディレクトリも消します。

[root@hibi221b ~]# ls /home
alarm hibi221b
[root@hibi221b ~]# userdel -r alarm

alarm一般ユーザが消えたか確認

[root@hibi221b ~]# cat /etc/passwd
[root@hibi221b ~]# ls /home
hibi221b

pacman

ネットワークの設定などが終わったので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 -Syu

x 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-amdgpu

sudo

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.service

xfceの起動

今回はデスクトップ環境に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 ~]# startxfce4

xfce_desktop.png

3章

それでは、これから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の設定です。

xscreensaver.png

日本語対応

パッケージをインストールし、$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 chromium

yay

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/yay

vscodiumのインストール

オープンソースの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/vscodium

iconを変更

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

complete.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の教科書(三宅英明・大角祐介 著)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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-ltsi 

zImage, .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_defconfigmake 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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のサポート事情

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

デバイスツリー 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 or target-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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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の候補になると思います。お勧めは、香り屋さん版です。

  1. 香り屋さん版Vim
  2. vim.org版Vim

2つのWindows用Vimについて、簡単にその特長をまとめてみました。

特記事項 配布形態 起動方法
香り屋さん版 日本語を扱うのに便利な設定済 Zipファイル gvim/vim内で:Tutorial
vim.org版 チュートリアルの実行に管理者権限必要 Windowsインストーラ 管理者でコマンドプロンプトから$ vimtutor

香り屋さん版は、日本語対応を謳っていますが、vim.org版には、特にそのようなカスタマイズは無く、ただの普通のVimだと思います。チュートリアルを実行するだけであれば、どちらも普通に日本語のチュートリアルが立ち上がります。できることに、特別な違いはありません。

香り屋さん版Vimで、チュートリアルを実行するには

  1. 香り屋さん版Vimの説明に従って、zipファイルをダウンロードします。
  2. 適当なフォルダに、zipファイルを展開します。
  3. フォルダ内のgvimをダブルクリックして、gvimを起動します。
  4. gvimが立ち上がったら、おもむろに「:Tutorial⏎」と入力してください。は、エンターキーです。すると、チュートリアルが立ち上がりますので、後はチュートリアルの指示に従ってください。

:Tutorial&#9166;と入力してください

vim.org版Vimで、チュートリアルを実行するには

  1. vim.org版Vimから、インストーラファイルをダウンロードします。
  2. 通常のWindowsアプリケーションと同様に、インストールしてください。チュートリアルを実行するだけなら、インストーラが聞いてくる設定を変更する必要はありません。
  3. コマンドプロンプトを開きます。このとき、管理者で無いアカウントでチュートリアルを実行するのであれば、"管理者として実行"してください。

    コマンドプロンプトを管理者として実行します

  4. 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
    
  5. "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導入の助けになること請け合いです。


  1. これは善し悪しだと思います。あなたが、Vimで日本語を扱うつもりが無いのであれば、英語でチュートリアルをやってみるのも、また一興かもしれません。 

  2. これはいけません。Vimのインターフェイスから抜け出せなくなって、最後はVimに取り込まれてしまいます。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が終了し、プロンプトが返ってくる。

スクリーンショット 2020-05-19 11.52.00.png

プロンプトが文字化けしている

画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。

Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。

resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。

補完機能

bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。

bashの補完機能
$ ec #ここで Tabキーを入力
$ echo #自動でechoと入力される

候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。

スクリーンショット 2020-05-19 12.06.27.png

コマンド履歴

bashは一度入力したコマンドラインの内容を自動的に記録している

コマンド履歴の操作

キー入力 内容
Ctrl+p、↑キー 一つ前のコマンド履歴に移動する
Ctrl+n、↓キー 次のコマンド履歴に移動する
Ctrl+r 履歴を遡ってインクリメンタル検索する

コマンド履歴の検索

多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。

インクリメンタル検索の時のプロンプト
(reverse-i-search)`':

インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する

また、インクリメンタル検索の状態での操作を次の表に示す。

キー入力 内容
文字の入力 検索語を追加して再検索
Ctrl+r 一つ前の検索結果へ移動
Enter 現在の検索結果を実行
Esc 現在の検索結果を表示したまま、コマンドラインに戻る
Ctrl+g 検索結果を破棄し、プロンプトに戻る

参考資料

新しいLinuxの教科書

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が終了し、プロンプトが返ってくる。

スクリーンショット 2020-05-19 11.52.00.png

プロンプトが文字化けしている

画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。

Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。

resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。

補完機能

bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。

bashの補完機能
$ ec #ここで Tabキーを入力
$ echo #自動でechoと入力される

候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。

スクリーンショット 2020-05-19 12.06.27.png

コマンド履歴

bashは一度入力したコマンドラインの内容を自動的に記録している

コマンド履歴の操作

キー入力 内容
Ctrl+p、↑キー 一つ前のコマンド履歴に移動する
Ctrl+n、↓キー 次のコマンド履歴に移動する
Ctrl+r 履歴を遡ってインクリメンタル検索する

コマンド履歴の検索

多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。

インクリメンタル検索の時のプロンプト
(reverse-i-search)`':

インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する

また、インクリメンタル検索の状態での操作を次の表に示す。

キー入力 内容
文字の入力 検索語を追加して再検索
Ctrl+r 一つ前の検索結果へ移動
Enter 現在の検索結果を実行
Esc 現在の検索結果を表示したまま、コマンドラインに戻る
Ctrl+g 検索結果を破棄し、プロンプトに戻る

参考資料

新しいLinuxの教科書

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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が終了し、プロンプトが返ってくる。

スクリーンショット 2020-05-19 11.52.00.png

プロンプトが文字化けしている

画像ファイルなどのバイナリファイルをシェル上で表示させた後など、プロンプトが文字化けすることがある。
このような場合は画面を消去するCtrl+lを入力すると直る可能性がある。

Ctrl+lを入力しても文字化けが直らない場合はresetコマンドを実行する。
resetコマンドは端末を初期化するコマンドで、端末の表示に問題が発生したときに使用する。

resetコマンドでも直らない場合は、ターミナルエミュレータのメニューから端末を初期化するか、一旦ログアウトして再度ログインすると直る。

補完機能

bashにはコマンド入力の手間を省く補完機能が用意されている。
bashの補完機能はTabキーを押すことで使用できる。

bashの補完機能
$ ec #ここで Tabキーを入力
$ echo #自動でechoと入力される

候補が一つの場合は補完可能だが、候補が複数ある場合には、Tabキーを二回叩くことでコマンドのリストを表示してくれる。
$eの時点でTabキーを二回入力したときのコマンドリストの画像を下に示す。eから始まるコマンドリストを表示してくれている。

スクリーンショット 2020-05-19 12.06.27.png

コマンド履歴

bashは一度入力したコマンドラインの内容を自動的に記録している

コマンド履歴の操作

キー入力 内容
Ctrl+p、↑キー 一つ前のコマンド履歴に移動する
Ctrl+n、↓キー 次のコマンド履歴に移動する
Ctrl+r 履歴を遡ってインクリメンタル検索する

コマンド履歴の検索

多くの作業を行った後のコマンド履歴から、あるコマンドを呼び出すにはコマンド履歴を検索するCtrl+rが役立つ。
Ctrl+rを叩くとプロンプトが次のように変化し、インクリメンタル検索という検索モードに入ります。

インクリメンタル検索の時のプロンプト
(reverse-i-search)`':

インクリメンタル検索の状態では、一文字入力するごとに履歴を検索する

また、インクリメンタル検索の状態での操作を次の表に示す。

キー入力 内容
文字の入力 検索語を追加して再検索
Ctrl+r 一つ前の検索結果へ移動
Enter 現在の検索結果を実行
Esc 現在の検索結果を表示したまま、コマンドラインに戻る
Ctrl+g 検索結果を破棄し、プロンプトに戻る

参考資料

新しいLinuxの教科書

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxコマンドが勉強できるLINEスタンプを作ったよ

はじめに

  • コミュニケーションしながらコマンドを勉強できると楽しいかなと思ったので作りました☆
  • 自分の商品を持ちたかった
  • コマンドを表現するしぐさを考えるのは結構楽しい

スタンプの種類

第1弾

image.png
https://store.line.me/stickershop/product/10720970/ja

  • catコマンドがお気に入りです!かわいいです☆

第2弾

image.png
https://store.line.me/stickershop/product/10918426/ja

  • sudoコマンドがお気に入りです!かっこよくないですか!

第3弾

image.png
https://store.line.me/stickershop/product/11110796/ja

  • routeコマンドがお気に入りです!眼帯が最高にカッコいい

第4弾

image.png
https://store.line.me/stickershop/product/11724293/ja

  • dockerコマンドがお気に入りです!船長です

作ってくれた人

ありがとうございます☆
https://uuunagisa.tumblr.com/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

jupyter-lab で複数ロボを制御

Crabs Crabs

はじめに

 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で構成されたロボ軍団はこの文脈をそのままトレース出来ます。ついでにセンサもつけちゃいましょう。赤外線とか紫外線とか温度とかも。熱源(赤外線)探知が出来るロボに索敵させて、ヘビー級ロボから発射されるミサイル攻撃。妄想が広がりまくリングですね。

BlockDiagram_wifi.png

で、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を上げるか、ロボの移動速度を下げるしかありません。前者はシステムの構成上、不可能ですし、後者は利用していて面白く有りません。

最後に

 こんな中二病が結晶化したプロジェクトの顛末記を最後まで読んでいただいて、本当にありがとうございます。システムを作っているうちに、妄想が広がりました。ついでにリアルタムシステムの端緒を知っていただきたく書いてみました。

開発リソース

Build guide:
Firmware:
Control software:
Groovy-Quatro:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ホームポジションから動かないためのコマンド操作

はじめに

コマンドを打つ時、今までは矢印キーをほぼ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:コマンドの検索

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む