1
0
hugo/content/m/arch.md
2024-12-20 17:03:48 +09:00

754 lines
18 KiB
Markdown

+++
date = "2022-10-29"
lastmod = "2022-12-05"
tags = ["arch","m"]
title = "archlinux"
slug = "arch"
+++
# install
archのinstallは簡単で`/`にpacstrapでarch(linux,base)を入れること。bootを設定することです。grubが簡単なのでgrubを使用します。bootloaderは起動時にlinux.imgを実行したり選択するものです。
現在は、macbook air(intel)の2台にインストールしています。serverやdockerもほとんどarchlinuxを使用しています。
`arch-install-script`が用意されているので、面倒な人は実行するといいでしょう。
https://wiki.archlinux.org/title/Installation_guide
```sh
# https://gitlab.archlinux.org/archlinux/arch-install-scripts
$ archinstall
```
私は毎回手動でinstallしています。昔は自動化していましたがメンテナンスが面倒になりました。
```sh
$ fdisk -l
/dev/nvme0n1p1
/dev/nvme0n1p2
$ mkfs.vfat /dev/nvme0n1p1
$ mkfs.ext4 /dev/nvme0n1p2
$ mount /dev/nvme0n1p2 /mnt
$ mkdir -p /mnt/boot/efi
$ mount /dev/nvme0n1p1 /mnt/boot/efi
$ pacstrap /mnt base linux grub efibootmgr
$ arch-chroot /mnt
$ grub-install --force /dev/nvme0n1p1
$ grub-mkconfig -o /boot/grub/grub.cfg
$ passwd
$ useradd -m -g wheel -s /bin/bash ${username}
$ passwd ${username}
```
```sh
# mkfs.vfat /dev/sda1
# mkfs.ext4 /dev/sda2
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub
```
```sh
$ pacman -S base-devel zsh git vim tmux sudo dhcpcd openssh
$ systemctl enable dhcpcd
$ systemctl enable sshd
$ chsh -s /bin/zsh
```
```sh
$ exit
$ reboot
```
## network
`dhcpcd`を使う方法と`systemd-networkd`を使う方法があります。基本的にどのlinuxもdhcpcdを入れておりnetworkを設定しています。
まずkernelで自動設定されるインターフェイス名を`eth0`などに戻しましょう。
```sh
$ ip route show
enp0s12 192.168.1.23
```
```sh
# 伝統的な名前を使う
$ mkdir -p /etc/systemd/network/99-default.link.d
$ vim /etc/systemd/network/99-default.link.d/traditional-naming.conf
[Link]
NamePolicy=keep kernel
# こちらの方法も使える
$ ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
```
### dhcpcd
> /etc/dhcpcd.conf
```sh:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.1.23/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 1.1.1.1
```
### systemd-networkd
```sh
$ systemctl disable dhcpcd
$ vim /etc/systemd/network/eth.network
```
```sh:/etc/systemd/network/eth.network
[Match]
Name=eth0
[Network]
Address=192.168.1.23/24
Gateway=192.168.1.1
DNS=192.168.1.1
```
```sh
$ systemctl enable systemd-networkd
```
なお、デバイスによってはこの方法で接続できない場合があります。その場合は`dhcpcd`が有効です。
nameserverは`/etc/resolv.conf`を見てください。
## ssh
次にsshで接続する方法です。
```sh
# 接続する側
$ ssh-keygen -f ~/.ssh/archlinux
$ ssh-copy-id -i ~/.ssh/archlinux.pub ${username}@192.168.1.23
# 接続される側:archlinux
$ vim /etc/ssh/sshd_config
PasswordAuthentication no
$ systemctl restart sshd
```
```sh
$ ssh ${username}@192.168.1.23
```
## xorg
デスクトップ環境の構築です。
```sh
$ pacman -S tilix xterm zsh git tmux chromium otf-ipaexfont i3 xorg xorg-xinit pcmanfm lightdm lightdm-gtk-greeter
```
```sh
# autologin
$ groupadd -r autologin
$ gpasswd -a $USER autologin
$ vim /etc/lightdm/lightdm.conf
[Seat:*]
pam-service=lightdm
pam-autologin-service=lightdm-autologin
autologin-user=${USER}
autologin-user-timeout=0
session-wrapper=/etc/lightdm/Xsession
autologin-session=i3
```
```sh
$ systemctl enable lightdm
```
## zip
```sh
$ pacman -S atool zip unrar
```
## displayが暗くならないようにする
```sh
$ vim /etc/X11/xorg.conf.d/10-monitor.conf
Section "ServerFlags"
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
EndSection
```
## 蓋を閉じてもsleepしないようにする
> /etc/systemd/logind.conf
```sh:/etc/systemd/logind.conf
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
```
# make
archlinux.imgを作る方法です。
https://gitlab.archlinux.org/archlinux/archiso
```sh
$ pacman -Syuu --noconfirm base-devel archiso git
$ git clone https://gitlab.archlinux.org/archlinux/archiso
$ ./archiso/archiso/mkarchiso -v -o ./ ./archiso/configs/releng/
$ tar xf *bootstrap*.tar.gz
$ mkdir -p root.x86_64/var/lib/machines/arch
$ pacstrap -c root.x86_64/var/lib/machines/arch base
```
# old
ここからは古い情報です。
archlinuxのinstaller(script)です。
https://github.com/syui/arch
```sh
$ fdisk -l
sda
$ export x=a
$ curl -sL git.io/air | zsh
```
archlinuxの一般的なinstall手順です。
```sh
$ cfdisk /dev/sda
sda1 200M linux-system
sda2 8GB linux-system
write(yes), quit
$ mkfs.vfat /sda1
$ mkfs.ext4 /sda2
$ mount /dev/sda2 /mnt
$ pacstrap -K /mnt base linux base-devel
$ genfstab -U /mnt >> /mnt/etc/fstab
$ arch-chroot /mnt
$ user=syui
$ echo xxx >> /etc/hostname
$ pacman -S zsh git tmux vim openssh grub dhcpcd efibootmgr atool net-tools inetutils jq
$ grub-install --force --recheck /dev/sda
$ grub-mkconfig -o /boot/grub/grub.cfg
$ vim /etc/systemd/network/eth.network
[Match]
Name=en*
[Network]
#DHCP=ipv4
Address=192.168.11.15
Gateway=192.168.11.1
DNS=192.168.11.1
[DHCP]
#RouteMetric=10
$ systemctl enabel systemd-networkd
$ ip link
$ systemctl enable dhcpcd
$ systemctl enable sshd
$ useradd -m -G wheel -s /bin/zsh $user
$ passwd
$ passwd $user
$ vim /etc/sudoers
Defaults env_keep += "HOME"
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: /usr/bin/reboot, /usr/bin/poweroff
$ exit
$ reboot
```
### macbook air(intel)
macは`/dev/sda1`のrootに`.volumeicon.icns`を置くとアイコンを設定できます。
icns : https://www.iconfinder.com
```sh
## macbook air(intel)
$ cd;mkdir boot
$ mount /dev/sda1 boot
$ grub-install --target=x86_64-efi --efi-directory=boot
$ tree -L 2 ./boot
.
├── .volumeicon.icns
├── EFI
│   └── arch/grubx64.efi
├── System
│   └── Library/CoreServices/Boot.efi
└── grub
├── fonts
├── grub.cfg
├── grubenv
├── locale
├── themes
└── x86_64-efi
```
### usb
img : http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/
```sh
$ d=`date '+%Y.%m'`
$ curl -sLO http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/$d.01/archlinux-$d.01-x86_64.iso
$ diskutil list
$ sudo dd bs=4M if=./archlinux-$d.01-x86_64.iso of=/dev/disk4 conv=fsync oflag=direct status=progress
```
### locale
```sh
$ vim /etc/locale.gen
ja_JP.UTF-8 UTF-8
$ locale-gen
$ vim /etc/locale.conf
LANG=ja_JP.UTF-8
```
### timezone
```sh
$ rm -rf /etc/localtime
$ pacman -S tzdata
$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ timedatectl set-timezone Asia/Tokyo
```
### zsh
```sh
$ pacman -S zsh
$ pacman -S powerline zsh-completions zsh-syntax-highlighting
$ vim ~/.zshrc
source /usr/share/powerline/bindings/zsh/powerline.zsh
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fpath=(usr/share/zsh/site-functions $fpath)
autoload -Uz compinit && compinit
```
### zip
```sh
$ pacman -S atool zip unrar
# 解凍
$ aunpack test.zip
# 圧縮
$ apack test.zip $dir
# rar
$ aunpack test.rar
```
### ssh
```sh:host.txt
$ vim /etc/ssh/sshd_config
Port 2299
PasswordAuthentication no
$ systemctl restart sshd
```
```sh:guest.txt
$ ssh-keygen -f ~/.ssh/xxx
$ ssh-copy-id -i ~/.ssh/xxx.pub -p 2299 $user@192.168.11.15
$ ssh -p 2299 $user@192.168.11.15
```
### pacman
```sh
# install
$ pacman -S zsh
# search
$ pacman -Ss zsh
# uninstall
$ pacman -R zsh
$ pacman -Rc zsh
# clean
$ pacman -Scc
```
例えば、下記はcore, extra, communityのpkg(package) binaryをmirrorlistからdownloadするという意味です。
```sh:/etc/pacman.conf
[core]
Include = /etc/pacman.d/mirrorlist
[extra]
Include = /etc/pacman.d/mirrorlist
[community]
Include = /etc/pacman.d/mirrorlist
```
速度は使用回線の場所からmirror-serverの場所により変化します。
```sh:/etc/pacman.d/mirrorlist
# japan
Server = https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
```
armのmirrorは別です。armのjp-mirrorは`asashi linux`が用意してくれているようです。
```sh:/etc/pacman.d/mirrorlist
Server = jp.mirror.archlinuxarm.org/$arch/$repo
```
### aur
`yay`と`paru`が人気です。aurは公式にないappをinstallするときに使います。もちろん、公式にあるpkgをbuildしたいときにも使えます。
ただし、aurを使用する場合、src(source)を手元のマシンでbuildするため時間がかかります。
pacmanでinstallされるpkg(core,community,etc...)は、あらかじめarchでbuildされたbinaryをdownloadしてくるだけなので。
https://aur.archlinux.org/paru.git
```sh
$ sudo pacman -S --needed base-devel
$ git clone https://aur.archlinux.org/paru.git
$ cd paru
$ makepkg -si
$ ./paru
```
### desktop
window managerは`i3(xorg)`, `sway(wayland)`を使用しています。かつては`awesome`を使用していました。
```sh
$ mkdir -p ~/.config/sway
$ cp -rf /etc/sway/config ~/.config/sway/
$ pacman -S sway swaybg xorg-xwayland polkit dmenu foot
```
file managerは`pcmanfm`です。かつては`spacefm`を使用していました。
```sh
# 自動マウント
$ pacman -S pcmanfm gvfs
```
login managerは`lightdm`です。かつては`slim`を使用していました。
```sh
$ pacman -S lightdm
$ systemctl enable lightdm
$ groupadd -r autologin
$ gpasswd -a USERNAME autologin
```
```sh:/etc/lightdm/lightdm.conf
[Seat:*]
autologin-user=syui
autologin-session=sway
```
アイコンは`blueman`, `network-manager(nm-applet)`, `pulseaudio`, `fcitx`, `clipman`, `rofi`など。
キーバインドは`xdotool`, `xmodmap`, `xbindkeys`などを使用しています。
screenshotは、`grim`を使用しています。
その他、画像関連は`imagemagick`, `gimp`, `inkscape`, `krita`あたりが便利です。
音楽動画は`ffmpeg`, `vlc`, `mpv`あたりが便利です。
### theme
例えば、`pcmanfm`のthemeはgtk2です。
```sh
$ paru -S arc-icon-theme arc-gtk-theme ttf-font-awesome
$ ls /usr/share/{icon*,theme*,font*}
$ cp /usr/share/gtk-2.0/gtkrc ~/.gtkrc-2.0
$ vim ~/.gitrc-2.0
$ gtk-icon-theme-name = "Arc"
$ gtk-theme-name = "Arc"
$ gtk-font-name = "awesome-terminal-fonts"
```
### cron
cronie, fcron
```sh
$ sudo pacman -S fcron
$ fcrontab -e
# auto update
0 0 * * * sudo rm -rf /var/lib/pacman/db.lck && sudo pacman -Syu --noconfirm
$ systemctl enable fcron
```
`/etc/sudoers`に以下のような設定が必要です。これは、`sudo xxx`とする際にpasswordを要求しないコマンドを設定します。
```sh
%wheel ALL=(ALL) NOPASSWD: /usr/bin/pacman -Syu --noconfirm, /usr/bin/rm -rf /var/lib/pacman/db.lck
```
### vpn
vpn serverとclientは`pritunl`が便利です。
https://pritunl.com
#### vpn server
wanからlan(local-network)に入るには、様々な方法がありますが、ルーターのポートフォワーディングと呼ばれる機能とvpn serverを使用します。
ポートフォワーディングでssh-serverに接続し、dockerからpritunl(vpn server)を立ち上げ、profileを書き換えて、vpnにアクセスし、lanに入ります。lanに入ればlocal-ipが使えるはずですから、private-keyだけで様々なserverにアクセスできるはず。よく使うserverは[termius](https://syui.cf/m/post/ios/)に登録しておきましょう。
```sh
$ sudo pacman -S docker docker-compose
```
https://github.com/goofball222/pritunl
https://hub.docker.com/r/goofball222/pritunl
```yml:docker-compose.yml
version: '3'
services:
mongo:
image: mongo:latest
container_name: pritunldb
hostname: pritunldb
network_mode: bridge
volumes:
- ./db:/data/db
pritunl:
image: goofball222/pritunl:latest
container_name: pritunl
hostname: pritunl
depends_on:
- mongo
network_mode: bridge
privileged: true
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
links:
- mongo
volumes:
- /etc/localtime:/etc/localtime:ro
ports:
- 80:80
- 443:443
- 1194:1194
- 1194:1194/udp
- 14036:14036/udp
environment:
- TZ=UTC
```
```sh
$ sudo systemctl start docker
$ mkdir -p mongo
$ sudo docker-compose up -d
```
browser(chromiumなど)で`localhost`にアクセスし、web-uiから初期設定を行います。defaultのuserとpassは両方ともpritunlです。
profileをdownloadしてiosに共有しておきます。なお、global-ipは通常は変動しますので、固定ipを持っていない場合は、ddnsの登録を行ったうえでそれを使用するか、ipが変わったとき通知するか、してください。
固定ipやddnsの場合は、profileを書き換える必要はありませんが、そうでない場合は、profileのglobal-ipを書き換える必要があります。書き換えは`goodreader`などが便利です。
```sh
- remote 123.45.67.89 $port udp
+ remote 89.45.67.123 $port udp
```
vpn serverを常時起動しておくのは電力の無駄でsecurity上もよくありません。したがって、できればポートフォワーディング用のserverを用意して、使用するときに起動したほうがいいと思います。
また、securityを考慮するなら、ポートフォワーディング用のserver自体を必要最小限にし、wol serverにした上で、ssh serverをwolで起動する役割のみを与えます。wolしたあとは、sshの踏み台にして、private-key自体はiosに置いておくという形が理想的だと思います。そのssh serverにアクセスしたあとはvpn serverを立ち上げ、lanに入ればいいでしょう。ただし、手間がかかりますから、そのへんのsecurityは使用頻度を考慮した上で考えればいいと思います。
#### vpn client
[gotunl](https://github.com/cghdev/gotunl)でvpn serverにアクセスし、local-networkに入ります。
なお、`gotunl`を使うには、あらかじめ公式client(electron)をinstallして、profileを[import](https://syui.cf/m/post/arch/)しておく必要があります。
```sh:/etc/pacman.conf
[pritunl]
Server = https://repo.pritunl.com/stable/pacman
```
```sh
$ sudo pacman -Syu pritunl-client-electron
$ sudo pacman -S pritunl-client-electron-numix-theme
$ pritunl-client-electron
# ここでprofile(.vpn)をimport
$ git clone https://github.com/cghdev/gotunl.git
$ cd gotunl
$ go install
$ ./${GOPATH}/bin/gotunl -l
$ ./${GOPATH}/bin/gotunl -c 1
```
### continer(systemd-nspawn)
```sh
$ mkdir -p ~/arch
$ sudo pacstrap -c ~/arch base
# -D : chroot
$ sudo systemd-nspawn -D ~/arch
$ passwd
$ logout
# -b : コンテナ起動
$ sudo systemd-nspawn -b -D ~/arch
# -n : ネットワーク
$ sudo systemd-nspawn -b -D ~/arch -n
```
これは色んな意味で正しいのですが、私の環境では動作しません。
設定したpasswordでloginできない。なお、設定していないと空なのでenterでloginできるはず(たぶん)。ttyのsecurityが働いているからです。
```sh
Arch Linux 6.0.11-arch1-1 (pts/1)
arch login:
arch-nspawn login: root
Login incorrect
```
ここでホストから`~/arch/etc/securetty`を編集し、ここでは`pts/1`でloginしようとしているため、これを追記します。`pts/0`なら`pts/0`です。その他ならそのttyを記述してください。
```sh
$ sudo vim ~/arch/etc/securetty
```
一旦、`poweroff`して仮想環境(continer)を落とします。
```sh
$ poweroff
$ machinectl list
```
次に、本来の`systemd-nspawn`の一般的な使い方を説明します。
```sh
$ machinectl --help
$ sudo mv ~/arch /var/lib/machines/
$ sudo machinectl list-images
$ sudo machinectl start arch
$ sudo machinectl login arch
# vmの削除
$ sudo machinectl remove arch
# vmをdown
$ sudo machinectl poweroff arch
$ sudo machinectl terminate arch
```
continerにアクセスする場合、loginはおすすめしません。Ctrl+Dで抜けられません
shellの場合はexitで抜けられます。continerはupしたままになります。
```sh
$ sudo machinectl shell arch
```
`/var/lib/machines`においたcontiner image(dir)をmachinectlで呼び出します。
これは、`systemctl`の`systemd-nspawn@arch`でも同じようなことができます。
```sh
# archというcontinerをstart
$ sudo systemctl start systemd-nspawn@arch
$ sudo machinectl start arch
# archというccontinerをPC起動時に立ち上げる
$ sudo systemctl enable systemd-nspawn@arch
$ sudo machinectl enable arch
$ sudo systemctl daemon-reload
```
machinectl, systemd-nspawn, systemctlのどれを使ってもいいですが、個人的にはmachinectlをおすすめします。しかし、それぞれが使い方に微妙な違いを含んでいます。
machinectlは主にvm操作で、pacstrapはarchの構築、systemctlはホスト環境の構築、systemd-nspawnはdir(chroot)操作です。
```sh
# イメージのダウンロード
$ sudo machinectl pull-tar --verify=no http://localhost:8000/arch.tar.gz arch
# アーカイブ
$ sudo machinectl export-tar --format=[gz, bzip2, xz] [コンテナ名] [ファイル名]
# xz でマルチスレッド圧縮をする例 (一番お勧め!)
$ maxz() { machinectl export-tar $1 $1.tar && nice -n 20 xz -z -f -T $(nproc) -vv $1.tar; }
$ maxz gbase
# インポート
$ sudo machinectl import-tar [ファイル名] [コンテナ名]
# docker imgをインポート
$ sudo docker export $(docker create debian:latest) | machinectl import-tar - debian
# hostのnetworkを使う, VirtualEthernetもconfiguredにすると有効
$ networkctl
IDX LINK TYPE OPERATIONAL SETUP
1 lo loopback carrier unmanaged
2 eth0 ether routable configured
3 ve-arch ether no-carrier configuring
$ sudo vim /etc/systemd/nspawn/arch.nspawn
```
```sh:/etc/systemd/nspawn/arch.nspawn
[Network]
VirtualEthernet=no
```
```sh
# ssh接続
$ ssh-keygen -f ~/.ssh/test
$ sudo cat ~/.ssh/test.pub >> /var/lib/machines/arch/root/.ssh/authorized_keys
$ sudo machinectl shell arch
$ pacman -S openssh
$ vim /etc/ssh/sshd_config
$ systemctl enable sshd
$ systemctl start ssh
$ exit
$ ssh root@localhost -p xxx -i ~/.ssh/test
```
```sh
$ sudo machinectl clone arch backup
$ sudo machinectl poweroff arch
$ sudo machinectl remove arch
$ sudo machinectl clone backup arch
```
## test
```sh
# sound
$ sudo pacman -S sof-firmware
```