Featured image of post 結局、開発機のOSはWindowsに戻った話

結局、開発機のOSはWindowsに戻った話

目次

概要

  • 10年以上プログラマーをやると開発環境も色々と遷移してきた
  • 最初はWindowsから入り、Linuxに移行し、Macに移行し、その後Linuxを使い続け、最後にWindowsに帰ってきた
  • なぜ最終的にWindowsに帰って来たのかの理由を残す
  • おそらく自分と同じように自由を追い求めてPCのOSを彷徨う人が出ると思うから

3つのこだわり

開発用PCのこだわり

開発用PCのOSの結論は、WindowsとWSL(Ubuntu)でいい。
さらに、MSが開発したOSSのVSCodeとVIMバインドで操作するのが数年安定している。
特にLinuxやMacを開発用PCとして結局やめたのは次の理由になる。

  • Mac
    • 長らく開発機として愛用したが、Appleの殿様商売に嫌気が差した
    • MacBookが壊れた際に、修理費が日本の2倍になった
    • なぜなら、発展途上国だとAppleの認定がなく、ぼったくり価格で直すしかないため
  • Gentoo
    • アプリをインストールするたびにコンパイルをする必要があり不便だった
    • 特にC++系のコンパイルはかなり長く、intelのCPUのバイナリをDLするArchに移行した
  • Fedora / Redhat
    • 1年は使ったが、バージョンアップデートが速く遊び用とだった
  • Puppy Linux
    • UIが貧弱だったので、そこまで節約する必要がなかった
  • Arch
    • インストールするのがめんどくさく、ロングタームリリースなのでpacmanのコマンドをミスると全部やり直しになり、現実的ではなかった
    • 特に新しいソフトをローカル(ホスト環境)で動かす際に問題が色々発生した
  • Manjaro
    • 長く開発用PCとして利用した
    • しかし、KindleやPrinterなどWindowsにしか動かないアプリケーションに嫌気が差した
  • Ubuntu
    • 長らく利用している、Ubuntu 8の頃からCompiz Fusionで遊んでいたし、今でもWSLで愛用のOS

他にもNVIDIA Jetsonや色々なLinux派生のOSがあるが、ここでは全ては述べない。

マウスレスへのこだわり

結論、マウスを使わない事へのこだわりの間違いだった。

Linux+キーボード至上主義時代のi3

  • 上の画像はキーボード至上主義時代のThinkpad上のArch Linuxとi3の画面
  • 一時期、タイル型ウィンドウマネージャのi3やxmonad、polybarの設定にこだわっていた
  • これらのマウスレス開発のLess is more的な思想はおそらくVIMがきっかけだろう
  • しかし、生産性が著しく低く、キーボードのみで開発するのは断念した
  • 特にタイル型ウィンドウマネージャーはその特性上複数のウィンドウを重ねて使わない
  • 重ねるには自分で調整する必要があり、あまりに煩わしかった
  • そして、画面が小さいノートPCとのタイル型ウィンドウマネージャーとの相性は最悪だった
  • また、MacやWindowsでもAlt + Tabでアプリケーション一覧をでき、タイルはこれで十分という結論に至った
  • 最終的には今は、トラックパッドを愛用している

ターミナルへのこだわり

ターミナルのこだわりは大正解だった

  • Tmux, Screen, Vim, Emacs, Zsh, Fish, Bash, Fzfなどを10年以上利用している
  • またエディタにもこだわった
    • 1行の編集はEmacs、複数行の編集はVimという使い分けが最強である
    • 最近はVSCodeがないと生きていけない体になってしまった
  • ターミナルマルチプレクサもこだわっている
    • prefix
      • Ctrl-qはTmux
      • Ctrl-zはScreenに捧げている
    • fish in tmux in screenで上にtmux下screenのタブを出している
  • shellのこだわり
    • 煩わしいZshは最近は捨ててしまった
    • Posix互換がないものの今はFishで快適Lifeを送っている
    • 必要に応じてBashも使っている
  • このTerminalやDotfilesの設定はWSLでも十分に生きている
  • なお、FontはEmoji付きのHack Nerdを愛用している

Fish in Tmux in Screen in WSL on Windows

自由とは何か

Linxuを使う事によって自由を追い求めてきたが、本当の自由について10年かけて知ることとなった。

  • これまで、大まかに開発用PCはWindows -> Mac -> Linuxと遷移した
  • 背景には、OSS上で開発したいというマインドがあった
    • 最初の仕事の開発でWindowsとVisual Studioを使ってC#で開発をしていた反動から、反MSの反骨心があったのかもしれない
  • そこで、自由を追い求めてLinux、とりわけGentooやArchに走った
  • しかし、途中で、自由を得るために、自由を失っている矛盾に気が付いた
    • なぜなら、KindleアプリもExcelもPowerPointも動かないLinuxで、不便な環境で作業をしていたからである
    • つまり、LibreOfficeやWineで無理やり必要なソフトウェアを動かしていたのである
    • 自由の為にLinuxを使っているのに、全然自由になっていなかった
    • そして、自己目的化していた事に気が付いた
    • また、そのころに、WindowsのローカルでWSLが動くようになった
    • つまり、LinuxとTerminalの設定(dotfiles)が、cygwinなしでちゃんと動くようになった
  • そのため、Windows + WLSに移行する事にした
  • つまり、無料でOSSでソフトウェアを使うより、多少おカネを払ってでもWindowsで動かした方が、色々なソフトウェアが動くので真に自由だったのである

Microsoft PowerToys

  • また、Microsoft PowerToysの存在もかかせない
  • 痒い所に手が届く神機能が満載なのでこれ抜きではWindowsは使えない
  • 特に次の機能
    • Awake
      • MacのCaffeineというアプリのように起動しっぱなしにできる
    • 常に手前に表示
      • Win + Ctrl + TであるWindowを常に手前にピン止めする
    • Fancy Zone
      • Shift + Windowのホバーで、Windowをレイアウトにセットできる
    • Keyboard manager
      • AltでMacライクに日本語と英語の切り替え
      • Shortcut
        • Lalt => IME Non-Convert
        • Ralt => IME Convert

あとがき

  • OSSで自由のためにLinuxを使ったが、もっと高次元の自由のためにWindowsでよい事に気が付いた
  • また、Linuxの設定であるdotfilesはWSLで完璧に動作するため、Linuxの時の資産はWindwsでも利用できる
  • また、Terminalにはまり、マウスを使わない生活で開発をするのは自己満足でしかなかった
  • ノートパソコンを買っても、ベアボーンでもない限りWindows OSもくっついてくるのでそのままそれを利用すればいい
  • 本当の自由はLinuxをそのまま使う事ではなく、Windowsの中でLinuxを使うことだった
  • メタ的にはPCやOSなどはあくまで道具なので、道具にこだわりすぎない方がいい

以下、5年前にArchをインストールしてThinkpadをLinux化した時の作業ログの断片を残す。

Archインストールログ

arch liveのusbメモリからThinkpad x1 carbon 6genにarchをインスコした時の備忘録(UEFIブート)。なお、winは消す。

live USBメディアの作成

公式サイト( https://www.archlinux.org/download/ )からISOのDL 焼くのめんどくさいときはEtcherを使う https://www.balena.io/etcher/

ISOのチェックサム

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ gpg --keyserver pgp.mit.edu --keyserver-options auto-key-retrieve --verify archlinux-2019.01.01-x86_64.iso.sig
gpg: assuming signed data in 'archlinux-2019.01.01-x86_64.iso'
gpg: Signature made Wed 02 Jan 2019 12:23:53 AM JST
gpg:                using RSA key 4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC
gpg: requesting key 7F2D434B9741E8AC from hkp server pgp.mit.edu
\gpg: key 7F2D434B9741E8AC: 31 signatures not checked due to missing keys
gpg: key 7F2D434B9741E8AC: public key "Pierre Schmitz <pierre@archlinux.de>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
gpg: Good signature from "Pierre Schmitz <pierre@archlinux.de>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 4AA4 767B BC9C 4B1D 18AE  28B7 7F2D 434B 9741 E8AC

デバイスの確認(sdb1が今回のターゲット) マウントされていた場合はアンマウントする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part /media/mike/Ubuntu 18.04.1 LTS amd64
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

dev/sdb1 をアンマウントする

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ umount /dev/sdb
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

ISOを書き込む

1
2
3
4
5
$ sudo dd bs=4M if=archlinux-2019.01.01-x86_64.iso of=/dev/sdb status=progress && sync                                                        
[sudo] password for mike:
150+1 records in
150+1 records out
631242752 bytes (631 MB, 602 MiB) copied, 105.399 s, 6.0 MB/s

BIOSの設定

  • セキュアブートをオフにする
    Security > Secure boot > Secure boot > Disabled
  • USBメモリの起動優先順位を変更する

そしてLive USBから起動する。

Archのインスコ

ミラーサーバーの国の優先順位を変更 日本とアメリカだと10倍ぐらい速度の差があった

1
2
3
4
5
# vim /etc/pacman.d/mirrorlist # 日本を最上位に移動する
# head /etc/pacman.d/mirrorlist
...
# Japan
# pacman -Syu # Wifiの設定後でもOK

WiFiの設定

まずインターフェイスの確認 wから始まっているのが往々にして無線のネットワークインターフェイス

1
2
3
4
5
6
7
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s31f6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether e8:6a:64:86:78:38 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 20:79:18:d2:ca:1c brd ff:ff:ff:ff:ff:ff

wlp2s0が対象のI/F ore_oreという名前(任意)のプロファイルを作る

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# cp /etc/netctl/examples/wireless-wpa /etc/netctl/ore_ore
# cat /etc/netctl/ore_ore
Description='A simple WPA encrypted wireless connection'
Interface=wlan0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='MyNetwork'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='WirelessKey'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10

ore_ore プロファイルを修正する 変更するのは次の3点

  1. Interface: WifiのI/F(この場合はwlp2s0)
  2. ESSID: wifiのSSID
  3. Key: WifiのPW
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# vi /etc/netctl/ore_ore # ゴニョゴニョ
# cat /etc/netctl/ore_ore
Description='A simple WPA encrypted wireless connection'
Interface=wlp2s0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='XXX'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='XXX'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10

Wifiに接続する pingが通れば成功

1
2
3
4
5
6
7
# netctl start ore_ore # 数秒かかる
# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=121 time=8.90 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=121 time=10.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=121 time=10.4 ms
...

パーテーションの設定

(U)EFIかどうか確認 ディレクトリが存在すればOK

1
2
# ls /sys/firmware/efi/
config_table  efivars  esrt  fw_platform_size  fw_vendor  runtime  runtime-map  systab

ドライブを探す ThinkPad X1 carbonはPCIe SSDなのでインターフェイスの名前はnvme0n1で、後ろにp1のようにパーテーション番号がつく。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0    13M  1 loop /snap/gnome-characters/124
loop1         7:1    0  14.5M  1 loop /snap/gnome-logs/45
loop2         7:2    0  15.1M  1 loop /snap/aws-cli/135
loop3         7:3    0    13M  1 loop /snap/gnome-characters/139
loop4         7:4    0  42.1M  1 loop /snap/gtk-common-themes/701
loop5         7:5    0  87.9M  1 loop /snap/core/5662
loop6         7:6    0   2.3M  1 loop /snap/gnome-calculator/238
loop7         7:7    0 147.3M  1 loop /snap/skype/66
loop8         7:8    0   2.3M  1 loop /snap/gnome-calculator/260
loop9         7:9    0  34.6M  1 loop /snap/gtk-common-themes/818
loop10        7:10   0  89.5M  1 loop /snap/core/6130
loop11        7:11   0 140.7M  1 loop /snap/gnome-3-26-1604/74
loop12        7:12   0   3.7M  1 loop /snap/gnome-system-monitor/57
loop13        7:13   0 140.9M  1 loop /snap/gnome-3-26-1604/70
sdb           8:16   1   7.5G  0 disk
├─sdb1        8:17   1   1.8G  0 part /media/mike/Ubuntu 18.04.1 LTS amd64
└─sdb2        8:18   1   2.3M  0 part
nvme0n1     259:0    0   477G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0 476.4G  0 part /

UEFIブートなので、GPTパーテーションを作る 下のような感じで書き換える

EF00はEFIパーテーションHEX 8E00は linux LVM (logical volume manager) のHEX なお、空欄ではEnterキーを押している

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ gdisk /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.4

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):  
First sector (34-1000215182, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-1000215182, default = 1000215182) or {+-}size{KMGTP}: +512MB
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

Command (? for help): n
Partition number (2-128, default 2): 
First sector (34-1000215182, default = 1050624) or {+-}size{KMGTP}: 
Last sector (1050624-1000215182, default = 1000215182) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8E00
Changed type of partition to 'Linux LVM'

Command (? for help): w
# 最後のコマンドはy、全部書き換える

パーテーションの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: LENSE30512GMSP34MEAT3TA                 
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: gpt
Disk identifier: 07E88104-29C7-41AE-91AD-379E474EA1C7

Device           Start        End   Sectors   Size Type
/dev/nvme0n1p1    2048    1050623   1048576   512M EFI System
/dev/nvme0n1p2 1050624 1000215182 999164559 476.4G Linux LVM

LVMパーテーションの暗号化

LVMパーテーションの暗号化する 暗号はデフォのLUKSを使用する パスフレーズは覚えておく

1
# cryptsetup luksFormat /dev/nvme0n1p2 # ※p1ではない

LVMの中に論理ボリュームを作成する

まずは、LVMを復号化して開く main_partは任意のデバイスマッパーネームをつける

1
# cryptsetup open --type luks /dev/nmve0n1p2 main_part

LVMの中に物理ボリューム(PV)を作成

1
# pvcreate /dev/mapper/main_part

PVの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# pvscan 
  PV /dev/mapper/cryptlvm   VG main_group      lvm2 [476.43 GiB / 0    free]
  Total: 1 [476.43 GiB] / in use: 1 [476.43 GiB] / in no VG: 0 [0   ]
# pvdisplay
  --- Physical volume ---
  PV Name               /dev/mapper/cryptlvm
  VG Name               main_group
  PV Size               <476.44 GiB / not usable <3.32 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              121967
  Free PE               0
  Allocated PE          121967
  PV UUID               D9rfJy-SqUn-I6Ca-PzzO-eb79-E61t-fHkwmu

ボリュームグループ(VG)を作成 main_group はVG名 (任意)

1
vgcreate main_group /dev/mapper/main_part

VGの確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# vgscan
  Reading volume groups from cache.
  Found volume group "main_group" using metadata type lvm2
# vgdisplay
  --- Volume group ---
  VG Name               main_group
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               476.43 GiB
  PE Size               4.00 MiB
  Total PE              121967
  Alloc PE / Size       121967 / 476.43 GiB
  Free  PE / Size       0 / 0   
  VG UUID               LiXnT1-xe6V-dmpZ-r7fs-HZF4-14wT-VrFTy5

論理ボリュームを(LV)作成 swapはメモリの半分(8GB)割り当てる rootは64GB割り当てる homeは残り全部

1
2
3
lvcreate -L8G main_group -n swap
lvcreate -L64G main_group -n root
lvcreate -l 100%FREE main_group -n home

LVの確認

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
# lvscan
  ACTIVE            '/dev/main_group/swap' [8.00 GiB] inherit
  ACTIVE            '/dev/main_group/root' [64.00 GiB] inherit
  ACTIVE            '/dev/main_group/home' [404.43 GiB] inherit
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/main_group/swap
  LV Name                swap
  VG Name                main_group
  LV UUID                79nm1Z-BCbW-Rhra-tryB-7lR9-XsCv-1jHiQD
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:18 +0000
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1
   
  --- Logical volume ---
  LV Path                /dev/main_group/root
  LV Name                root
  VG Name                main_group
  LV UUID                FqcEYQ-0cUp-BMul-VxND-42Es-BHsE-Yj4zdB
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:50 +0000
  LV Status              available
  # open                 1
  LV Size                64.00 GiB
  Current LE             16384
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2
   
  --- Logical volume ---
  LV Path                /dev/main_group/home
  LV Name                home
  VG Name                main_group
  LV UUID                VlSY7x-8Q0O-UFQL-rnQT-05xp-inTH-QLCieR
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:15:09 +0000
  LV Status              available
  # open                 1
  LV Size                404.43 GiB
  Current LE             103535
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3
  --- Logical volume ---
  LV Path                /dev/main_group/swap
  LV Name                swap
  VG Name                main_group
  LV UUID                79nm1Z-BCbW-Rhra-tryB-7lR9-XsCv-1jHiQD
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:18 +0000
  LV Status              available
  # open                 2
  LV Size                8.00 GiB
  Current LE             2048
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:1
   
  --- Logical volume ---
  LV Path                /dev/main_group/root
  LV Name                root
  VG Name                main_group
  LV UUID                FqcEYQ-0cUp-BMul-VxND-42Es-BHsE-Yj4zdB
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:14:50 +0000
  LV Status              available
  # open                 1
  LV Size                64.00 GiB
  Current LE             16384
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:2
   
  --- Logical volume ---
  LV Path                /dev/main_group/home
  LV Name                home
  VG Name                main_group
  LV UUID                VlSY7x-8Q0O-UFQL-rnQT-05xp-inTH-QLCieR
  LV Write Access        read/write
  LV Creation host, time archiso, 2019-01-22 13:15:09 +0000
  LV Status              available
  # open                 1
  LV Size                404.43 GiB
  Current LE             103535
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3

フォーマットとマウント

LVをフォーマットする マッピングされているので、次のような名前になる /dev/mapper/VG名-LV名

1
2
# mkfs.ext4 /dev/mapper/main_group-root
# mkfs.ext4 /dev/mapper/main_group-home

スワップも

1
# mkswap /dev/mapper/main_group-swap

LVをマウントする /mnt/にマウントする

1
2
3
4
# mount /dev/mapper/main_group-root /mnt/
# mkdir /mnt/home
# mount /dev/mapper/main_group-home /mnt/home
# swapon /dev/mapper/main_group-swap

ブートローダーをマウントする

1
2
# mkdir /mnt/boot/
# mount /dev/nvme0n1p1 /mnt/boot

設定し終えるとブロックデバイスはこんな感じ

1
2
3
4
5
6
7
8
9
# lsblk
NAME                  MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1               259:0    0   477G  0 disk  
├─nvme0n1p1           259:1    0   512M  0 part  /boot
└─nvme0n1p2           259:2    0 476.4G  0 part  
  └─cryptlvm          254:0    0 476.4G  0 crypt 
    ├─main_group-swap 254:1    0     8G  0 lvm   [SWAP]
    ├─main_group-root 254:2    0    64G  0 lvm   /
    └─main_group-home 254:3    0 404.4G  0 lvm   /home

Archのインスコ

baseとbase-develをインスコする https://www.archlinux.jp/groups/x86_64/base/ https://www.archlinux.jp/groups/x86_64/base-devel/ このpacstrapコマンドでboot以外のフォルダも作られる

1
# pacstrap /mnt/ base base-devel 

マウントの設定ファイルを修正 システム起動時に自動的にマウントするため

1
# genfstab -p /mnt >> /mnt/etc/fstab

Archのインスコ (中で作業)

チェンジルートする

1
# arch-chroot /mnt

32bitのインテルのドライバーを入れるため Miltilibを有効化。下の2行をコメントアウトする

1
2
3
# vi etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

インテルのマイクロコードをインスコ

1
# pacman -Sy intel-ucode

マイクロコードを確認 (のちのち再起動後確認できる)

1
2
3
# dmesg | grep microcode
[    1.703624] microcode: sig=0x806ea, pf=0x80, revision=0x9a
[    1.703917] microcode: Microcode Update Driver: v2.2.

Linuxカーネルのコピーをインスコ

1
# pacman -S linux-headers linux-lts linux-lts-headers

initrdの設定

mkinitcpioはinitrd(initramfs)のイメージを作るためのスクリプト 下の様に修正する

1
2
# vi /etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 filesystems fsck)

initramfsを生成する

1
2
# mkinitcpio -p linux
# mkinitcpio -p linux-lts # linux-lts をインスコした場合は

ブートローダーの設定

ローダーを作る GRUBを使わずsystemd-bootを使用する

1
bootctl --path=/boot/ install

ローダーの設定をする 下のように編集する

1
2
3
4
# vi /boot/loader/loader.conf
default arch
timeout 3
editor 0 

arch.confを作成する arch.confのXXXの伏せ字をblkidのコマンドのUUIDのIDの結果で埋める PARTUUIDではないので注意する、またクォーテーションは含めない vi だったらコマンドで (:r !blkid) で結果を読み込める

1
2
3
4
5
6
7
8
# blkid
/dev/nvme0n1p2: UUID="XXX" TYPE="crypto_LUKS" PARTLABEL="Linux LVM" PARTUUID="XXX2"
# vi /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img # intel マイクロコードを読み込む
initrd /initramfs-linux.img # mkinitcpioで作成したimgを読み込む
options cryptdevice=UUID=XXX:cryptlvm root=/dev/mapper/main_group-root quiet rw

起動

1
2
3
4
# umount -R /mnt
# shutdown -r now
# # ~起動後~
# # rootでログインできればOK

再起動後のArchの設定

WiFi

live USBと同じ

ミラーリスト

ミラーリストで日本の優先度を一番にする

1
# vi /etc/pacman.d/mirrorlist

言語

localeの設定

1
2
3
# vi /etc/locale.gen
en_US.UTF-8 UTF8 # ←をアンコメントアウト
# localectl set-locale LANG=”en_US.UTF-8”

時間

time zone を日本に設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa                                                            7) Europe
2) Americas                                                          8) Indian Ocean
3) Antarctica                                                        9) Pacific Ocean
4) Asia                                                             10) coord - I want to use geographical coordinates.
5) Atlantic Ocean                                                   11) TZ - I want to specify the timezone using the Posix TZ format.
6) Australia
#? 4
Please select a country whose clocks agree with yours.
1) Afghanistan             9) China                 17) Iraq                  25) Kyrgyzstan            33) Oman                  41) Sri Lanka             49) Vietnam
2) Armenia                10) Cyprus                18) Israel                26) Laos                  34) Pakistan              42) Syria                 50) Yemen
3) Azerbaijan             11) East Timor            19) Japan                 27) Lebanon               35) Palestine             43) Taiwan
4) Bahrain                12) Georgia               20) Jordan                28) Macau                 36) Philippines           44) Tajikistan
5) Bangladesh             13) Hong Kong             21) Kazakhstan            29) Malaysia              37) Qatar                 45) Thailand
6) Bhutan                 14) India                 22) Korea (North)         30) Mongolia              38) Russia                46) Turkmenistan
7) Brunei                 15) Indonesia             23) Korea (South)         31) Myanmar (Burma)       39) Saudi Arabia          47) United Arab Emirates
8) Cambodia               16) Iran                  24) Kuwait                32) Nepal                 40) Singapore             48) Uzbekistan
#? 19

The following information has been given:

        Japan

Therefore TZ='Asia/Tokyo' will be used.
Selected time is now:   Sat Feb  9 16:34:35 JST 2019.
Universal Time is now:  Sat Feb  9 07:34:35 UTC 2019.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
        TZ='Asia/Tokyo'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Tokyo

ハードウェアクロックの時間のズレを調整

1
# hwclock --systohc --utc

hostname

host名の追加

1
echo archer > /etc/hostname

Pacman

pacman.confにColorILoveCandyを追加 プログレスバーがpacmanに変わる

1
2
3
4
5
6
7
8
# vi/etc/pacman.conf
# Misc options
#UseSyslog
Color
#TotalDownload
CheckSpace
#VerbosePkgLists
ILoveCandy

ユーザーの追加

rootのPW変更

1
# passwd

Sudoerの設定 wheelグループはどんなコマンドも許可

1
2
3
4
5
# pacman -S sudo
# visudo # 下の2行のコメントを外す

## Uncomment to allow members of group wheel to execute any command
# wheel ALL=(ALL) ALL

一般ユーザー追加

1
2
3
# useradd -m -G wheel -s /bin/bash mike
# passwd mike
# reboot # 一応mikeユーザーでログインできることを確認する

一応仮想コンソール用ユーザーも追加する mikeはGUI用のユーザーでnekoはCUI用 万が一mikeで問題が発生した時用に

1
2
# useradd -m -G wheel -s /bin/bash neko
# passwd neko

ルートユーザーでログインすることを無効化する

1
$ sudo passwd -l root

Yayのインスコ

1
2
3
4
5
$ sudo pacman -S git
$ sudo pacman -S make fakeroot # NOTE: これが依存PKG
$ git clone https://aur.archlinux.org/yay.git
$ cd yay
$ makepkg -si

Virtual Console

keymap

capslockをctrl化する 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%E7%89%B9%E5%88%A5%E3%81%AA%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%82%AD%E3%83%BC もとのキーマップをコピーして新しい設定を作る

1
2
3
# mkdir -p /usr/local/share/kbd/keymaps
# cp /usr/share/kbd/keymaps/i386/qwerty/us.map.gz /usr/local/share/kbd/keymaps/
# gunzip /usr/local/share/kbd/keymaps/us.map.gz

capslockをctrlに変更

1
2
3
# vi /usr/local/share/kbd/keymaps/us.map
...
keycode 58 = Control

読み込み

1
# loadkeys /usr/local/share/kbd/keymaps/us.map

起動時に読み込みにする場合 下を追記する

1
2
3
# vi /etc/vconsole.conf
...
KEYMAP=/usr/local/share/kbd/keymaps/us.map

X

タッチパッドのドライバー

libinputをインスコする

1
$ pacman -S xf86-input-libinput

Install

インテルドライバーのインスコ

1
# pacman -S xf86-video-intel lib32-intel-dri lib32-mesa lib32-libgl

Xのインスコ

1
# pacman -S xorg-server xorg-xinit xorg-apps mesa xterm

Xが起動するか確認

1
# startx 

Font

元ネタ https://www.reddit.com/r/archlinux/comments/5r5ep8/make_your_arch_fonts_beautiful_easily/

フォントインスコ

1
$ sudo pacman -S ttf-dejavu ttf-liberation noto-fonts

プリセットの作成

1
2
3
$ sudo ln -s /etc/fonts/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d
$ sudo ln -s /etc/fonts/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d
$ sudo ln -s /etc/fonts/conf.avail/11-lcdfilter-default.conf /etc/fonts/conf.d

/etc/fonts/local.confに下のように設定フィアルを作成する 再起動するとフォントがきれいになっている

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <match>
        <edit mode="prepend" name="family"><string>Noto Sans</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>serif</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Serif</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>sans-serif</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Sans</string></edit>
    </match>
    <match target="pattern">
        <test qual="any" name="family"><string>monospace</string></test>
        <edit name="family" mode="assign" binding="same"><string>Noto Mono</string></edit>
    </match>
</fontconfig>
    

IME

日本語フォントをインスコする

1
$ pacman -S otf-ipafont

Fcitxをインスコする

1
$ pacman -S fcitx fcitx-mozc fcitx-configtool

下のように.xinitrcを作成する

1
2
3
4
$ cat .xinitrc 
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=”@im=fcitx” 

Fcitx configurationで下のように設定して、 再起動するとIMEが使えるようになる

1
2
3
4
5
add mozc and prioritize it more over Keyboard English
change default keyboard layout to to English(US)
Global config > show advance options
    active input method = lart
    inactive input method = ralt

ファンクションキー

Fnキーの挙動をインバートするにはFn+Escを押下すればOK 参考 https://bbs.archlinux.org/viewtopic.php?id=233368

Keymap

capslockを無効化する ログイン中かえたいなら setxkbmap -option ctrl:nocaps でもOK 恒久的に変えたいので、X configuration fileを修正する /etc/X11/xorg.confを変更せず、自分で設定ファイルを追加する xorg.confはHWを変更すると壊れやすいため なお、ファイルの頭の数字は2桁で読み込み順番に関係する 再起動すればXで反映されている

1
2
3
4
5
6
7
# vi /etc/X11/xorg.conf.d/20-keyboard-layout.conf
Section "InputClass"
    Identifier       "keyboard_layout"
    MatchIsKeyboard  "on"
    Option           "XkbLayout"  "us"
    Option           "XkbOptions" "ctrl:nocaps"
EndSection

Thinkpad X1 carbon 6gen用の設定

休止状態の設定

もう一度 mkinitcpio.confを編集してresume を追加する

1
2
# vi /etc/mkinitcpio.conf
HOOKS=(base udev autodetect keyboard keymap modconf block encrypt lvm2 resume filesystems fsck)

initramfsのイメージを生成する

1
2
mkinitcpio -p linux
# mkinitcpio -p linux-lts

arch.confを以下のように修正する。 resume=/dev/mapper/main_group-swap の設定を追加する

1
2
3
4
5
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options cryptdevice=UUID=XXX:cryptlvm root=/dev/mapper/main_group-root resume=/dev/mapper/main_group-swap quiet rw

サスペンドの設定

サポートされているサスペンドの設定の確認

1
2
# dmesg | grep -i "acpi: (supports"
[    0.979007] ACPI: (supports S0 S4 S5)

再起動しBIOSからSleep StateをLinuxに変更する Config > Power > Sleep State > Linux

Sleep StateをLinuxに変更後 S3が追加されている

1
2
# dmesg | grep -i "acpi: (supports"
[    1.053591] ACPI: (supports S0 S3 S4 S5)

CPUのクロックスロットリングの問題

パッチを当てる CPUのクロック数がおかしいときがあるため

1
2
# aurman -S lenovo-throttling-fix-git
# sudo systemctl enable --now lenovo_fix.service

BIOS更新

現状のバージョン確認 最近買ったので最新だった

https://pcsupport.lenovo.com/us/zh/products/laptops-and-netbooks/thinkpad-x-series-laptops/thinkpad-x1-carbon-6th-gen-type-20kh-20kg/downloads/ds502281

1
2
# dmidecode -s bios-version
N23ET59W (1.34 )

もし、上げる場合は、ファームウェアを更新する fwupdをインスコする

1
# pacman -S fwupd

Laptopが電源につなぐ。 BIOSのバージョンあげるのは自己責任で

1
2
3
# fwpudmgr refresh 
# fwpudmgr get-updates
# fwupdmgr update

Trim SSD

SSDのTRIMとはHDDでいうデフラグ的なもの できるか確認。SSDの1行目か2行目に0でない値があれば可能

1
2
3
4
5
6
7
8
9
# lsblk --discard
NAME                  DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
nvme0n1                      0      512B       2T         0
├─nvme0n1p1                  0      512B       2T         0
└─nvme0n1p2                  0      512B       2T         0
  └─cryptlvm                 0        0B       0B         0
    ├─main_group-swap        0        0B       0B         0
    ├─main_group-root        0        0B       0B         0
    └─main_group-home        0        0B       0B         0

定期的なトリミングを有効化する Ubuntuでもしていないらしいので、する必要もないのかもしれない?

1
2
# pacman -S utils-linux
# systemctl enable fstrim.timer

その他

pacmanのメモ

1
2
3
4
5
6
7
8
9
# pacman -S <word> # パッケージインスコ
# pacman -R <word> # パッケージ削除
# pacman -Syy # パッケージリストの更新 (`apt update`)
# pacman -Syyu # パッケージリストの更新とパッケージ更新
# pacman -Ss <word> # wordでパッケージを検索する
# pacman -Qs <word> # wordでローカルでローカルのパッケージを検索する
# pacman -Qsi <word> # Qsの詳細
# pacman -Ql # ローカルのパッケージ一覧
# pacman -Syu # パッケージのアップグレード

論理ボリュームの用語

  • LVM (Logicl Volume Manager) はブロックデバイスを仮想化する機能。
    • PV(物理ボリューム): ようするにハードディスクそのもの
    • VG(ボリュームグループ): ようするにRAIDでいうJBOD(スパニング)
    • LV(論理グループ): ようするにパーテーション
  • ループデバイスは通常のファイルをブロックデバイスとして読み書きできるようにする機能

openしたLVMをクローズする

1
# cryptsetup close /dev/mapper/main_part

write error failed: No space left on device のエラーが出た時

きれいに

1
2
3
4
5
6
# lsblk
# fdisk /dev/nvme0n1 # 全部のパーテーション消すまで繰り返す
d # delete a partition
w
y
# mkfs -t /dev/nvme0n1 # フォーマット

また作りなおす

1
2
# partition bootableは上述の処理と同じ
# 次はカラのパーテーションを作る

References

Built with Hugo
テーマ StackJimmy によって設計されています。