usbにarchをインストールする方法

2021/04/30

基本的には、macbookでもbootできるarch usbの作成方法です。

grub

まずbootですが、私はmacbook-airの内蔵diskにarchをインストールしてることもあって、そこから持ってくることになりました。

grub-installは成功するんだけど、なぜかうまく動かない。また、archのインストールディスクからgrubがなくなってるのと、現在のインストールディスクがmacbookで認識しなくなってました。supportはずされたのか、それ以外の問題か。なんにせよ最新のgrub-installで作成されるefiではbootできないし、最新のインストールディスクはmacbookから起動できません。(私の環境では)

なので、基本的には、usbにlinuxをインストールして、archが動いてるdiskの/boot(linux-img以外)及び/dev/sda1のディレクトリ構成をコピーすればokです。

$ pacman -S linux

$ mount /dev/sdb2 ./mnt
$ cp -rf /boot/efi ./mnt/boot/
$ cp -rf /boot/grub ./mnt/boot/

$ mount /dev/sdb1 ./boot
$ mount /dev/sda1 ./boot2
$ cp -rf ./boot2/* ./boot/

$ grub-mkconfig -o /boot/grub/grub.cfg

ちなみに、grub-installは以下のコマンドで成功(動かないけど)。

$ arch-chroot ./mnt
$ mount /dev/sdb1 ./boot/efi

$ grub-install --efi-directory=/boot/efi /dev/sdb

linux

macbookは2台あるんですけど、archがすんなり起動したやつとしなかったやつがありました。

macbookによってはlinux起動時に以下のようなerrorが出てlinuxが起動しない場合があって、uuidが見つからないと言われてるんだけど、普通にusbのuuidは一致してるので、fstab, grubの問題ではなく、linux kernelの問題でした。

ERROR: device ‘UUID=xxx’ not found. Skipping fsck. mount: /new_root: can’t find UUID=xxx. You are now being dropped into an emergency shell. sh: can’t access tty: job control turned off

これは、kernel更新する際、blockautodetectの前に置くと起動するようになりました。

HOOKS="base udev block autodetect modconf filesystems keyboard fsck"
$ mkinitcpio -p linux

icns

macのbootloaderはosを読み込む際にアイコンを設定できます。boot領域の/に.volumeicon.icnsを置きます。

$ mount /dev/sdb1 ./boot
$ cp .volumeicon.icns ./boot/

ちなみに、同じアイコンでも表示されないことがあって、権限等の可能性があるかも。正直、よくわかりませんし、icnsもめんどくさすぎる。

https://qiita.com/syui/items/76aebb2e39f40d8cd1e9

wifi

wifi-deviceがない状態なのでdrive, kernelあたりの問題だと思われます。

b43などmodprobeのblacklistに入れてkernelを更新すると、wifi-deviceが立ち上がりました。

blacklist b43
blacklist b43legacy
blacklist bcm43xx
blacklist bcma
blacklist brcm80211
blacklist brcmfmac
blacklist brcmsmac
blacklist ssb
$ pacman -Syu linux-headers broadcom-wl-dkms
$ mkinitcpio -p linux

https://bbs.archlinux.org/viewtopic.php?pid=1862759#p1862759

network

ip固定するので伝統的な名前、eth0とかにする。

$ ln -s /dev/null /etc/systemd/network/99-default.link

今回はnetworkmanagerを入れることにしたんだけど、便利。ただ、自動設定とかは接続は、systemd-networkで書いてる。

xorg

ディスプレイがoffにならないようにする設定。よく忘れる。xset dpms force offが効かないことある。ただ、これらの設定によってi3が起動しなくなる事があるので注意。

Section "Monitor"
    Option "DPMS" "false"
EndSection

Section "ServerLayout"
    Identifier "ServerLayout0"
    Option "StandbyTime" "0"
    Option "SuspendTime" "0"
    Option "OffTime"     "0"
    Option "BlankTime"   "0"
EndSection

https://wiki.archlinux.jp/index.php/Display_Power_Management_Signaling

keyboard

xmodmapとかで設定するといいです。xevを使います。訳あってmacbook-airのusを使ってます。本当はjisのほうがいい。

xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Delete (0x3e)
lock      
control     Control_L (0x25),  Control_L (0x42),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Zenkaku_Hankaku (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

gtk

gtk-themeはnumixを採用。

$ yay -S numix-gtk-theme numix-icon-theme-git
$ vim /usr/share/gtk-x.0/

$ cp /usr/share/gtk-2.0/gtkrc ~/.gtkrc-2.0
# GTK+ 2 : ~/.gtkrc-2.0
# GTK+ 3 : ~/.config/gtk-3.0/settings.ini)

https://wiki.archlinux.jp/index.php/GTK

その他の環境

その他の環境としては、i3, xterm, tilix, pcmanfm, chromium, fcitx, yayなどを採用。

xtermも設定が面倒だけど、アイコンとかもフォントを指定すれば使える。

.Xdefaults,.Xresourcesに書く。

XTerm*termName:            xterm-256color
XTerm*locale:              true
XTerm*selectToClipboard:   true
XTerm*saveLines:           2000
XTerm*background:          black
XTerm*foreground:          white
xterm*faceName:            ricomoon
XTerm*faceSize:            13

terminalの透過は、picomで実現します。

$ sudo pacman -S picom
$ sudo cp /etc/xdg/picom.conf ~/.config/picom/
$ sudo vim ~/.config/picom/picom.conf
opacity-rule = [
  "90:class_g = 'URxvt' && focused",
  "60:class_g = 'URxvt' && !focused",
  "90:class_g = 'xterm' && focused",
  "60:class_g = 'xterm' && !focused",
  "90:class_g = 'tilix' && focused",
  "60:class_g = 'tilix' && !focused"
];
$ picom &

あとは、~/.xinitrcにでも書けばいいでしょう。

vpn

usbを外のパソコンに挿して、ssh先でvpnを起動し、local networkに入ってリモートすることはよくあるので、vpnの構築方法とclientでの接続方法を紹介。

vpnはserverもclientもpritunlが便利すぎるので、そちらを使います。

https://github.com/Fridus/docker-pritunl

$ sudo systemctl start docker
network:
  image: busybox
  ports:
    - "9700:443"
    - "1194:1194/udp"
  restart: always
  tty: true

mongo:
  image: mongo
  volumes:
    - ./mongo:/data/db
  restart: always
  net: container:network

pritunl:
  image: fridus/pritunl
  privileged: true
  environment:
    - MONGO_URI=mongodb://127.0.0.1:27017/pritunl
  restart: always
  net: container:network

https-portal:
  image: steveltn/https-portal:1
  ports:
    - '443:443'
  environment:
    STAGE: 'local'
    DOMAINS:  'localhost => https://0.0.0.0:9700'
$ sudo docker-compose up -d

で、設定方法は、https://localhost:9700にアクセスしてwebから行います。user,passwordはpritunlです。

基本的にはorg,userを作成して、start serverすればokです。userからはprofile(example.vpn)をダウンロードできますが、それを使います。これはopenvpnでも使用できる形式のものです。ただし、localで構築してることもあって、使用する際はdefaultのip,portが異なります。settingから変更した上で、profileをダウンロードすればいいのですけど、.vpnを修正したほうが早いです。

ここでは、vpn serverのlocal ipを192.168.11.4とし、global ipを207.97.227.253とします。wan(外部)からserverにアクセスするにはrouteでポートフォワーディングなどを設定すればいいでしょう。

- remote 192.168.1.4 1194 udp
+ remote 207.97.227.253 ${routeで設定した192.168.11.4:1194に繋がるwan側のport} udp

次に、pritunl clientの話になります。mac,linux,windowsがあります。cliもありますが、cliはちょっと壊れている気がするし、そこまで柔軟でもないので、gotunlを使います。

https://client.pritunl.com/

https://docs.pritunl.com/docs/command-line-interface

基本的には、GUIでprofileをimportしたあと、gotunlで接続操作すればいいでしょう。

$ sudo tee -a /etc/pacman.conf << EOF
[pritunl]
Server = https://repo.pritunl.com/stable/pacman
EOF
$ sudo pacman-key --keyserver hkp://keyserver.ubuntu.com -r 7568D9BB55FF9E5287D586017AE645C0CF8E292A
$ sudo pacman-key --lsign-key 7568D9BB55FF9E5287D586017AE645C0CF8E292A
$ sudo pacman -Sy
$ sudo pacman -S pritunl-client-electron
$ sudo pacman -S pritunl-client-electron-numix-theme
$ pritunl-client-electron
# ここでprofile(example.vpn)をimport

$ git clone https://github.com/cghdev/gotunl.git
$ cd gotunl
$ go install
$ ./${GOPATH}/bin/gotunl -l
$ ./${GOPATH}/bin/gotunl -c 1
tag: arch