ArchWSLの構築

> \- _ArchWSLの使い方及びインストール方法です。_
> \- _現在(2021-03-22)の時点では**Outdateしていません**。_

# はじめに
Insider Previewを使っていること前提です｡
~~Windows InsiderのDevリングで運用すると3ヶ月に一回OSが壊れるのでSlowにしたほうがいいですよ｡まじで｡~~(←最近はDevリングも安定してきました)
~~でもスリルと新機能がたまんねぇよな!~~

### ドキュメント
#### オフィシャルドキュメンテーション
公式のドキュメンテーションです。
分からないことがあったら、下記のどちらかに飛んで、検索機能を使うといいと思います。

- ___wsldlのドキュメンテーション___
  - https://wsldl-pg.github.io/docs/
- ___ArchWSLのドキュメンテーション___
  - https://wsldl-pg.github.io/ArchW-docs/
  - https://wsldl-pg.github.io/ArchW-docs/locale/ja-JP/ (日本語)

# 最初に知っておきたいこと

#### Shellとは
Shellでシェルと読みます｡
ターミナルなどからの入力をコンパイルして､ OSに命令をする役割に当たります｡
また､OSからの出力も受信します｡

#### Terminalとは
Terminalでターミナルと読みます｡
これはシェルにアクセスするためのものです｡
ユーザーからの入力をシェルに入力したり､シェルからの出力を表示したりします｡

#### WSLとは
`Windows Subsystem For Linux` 略してWSL(ダブリュー エス エル)です｡
WSLで勘違いしやすいのが､あくまでもWSLはWindows上でLinuxを動かす機能だということです｡
OSのことを指しているのではありません｡
##### WSL1
WSL1(WSLと呼ばれていた) はLinuxカーネルをエミュレート､つまりLinuxカーネルのふりをしてOSを動かします｡
そのためパフォーマンスが悪かったり､使えないシステムコールがあります｡
まあ､Linuxのふりをするのにも限度があったわけですね｡
##### WSL2
そこで誕生したのが WSL2 です｡
これでLinuxカーネルをWindows上で動かせるようになりました｡
パフォーマンスが劇的に向上しています｡

# 下準備
### まずWSLのインストール
PowerShellを管理者権限で開き
`Win+R` ___`;`___ `powershell` `or` `pwsh`

```PowerShell:PowerShell-AsAdmin
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
## Press keyboard "N" key at all times
```
再起動をしたら

```PowerShell:cmd
wsl.exe --set-default-version 2 # デフォルトでWSL2をインストールするようにする
```

###### カーネルを更新
[wsl_update_x64.msi](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)をインストール
また、設定のアップデートにカーネルの更新がないかも確認してください。
もし更新が可能なら更新をしてください。

### Wingetのインストール
[`github.com`/`microsoft`/`winget-cli`/`releases`](https://github.com/microsoft/winget-cli/releases/) から`.appxbundle`をダウンロードして開き、インストール。または再インストール。


### Terminal

- [Alacritty](https://github.com/alacritty/alacritty/releases)
- [Windows Terminal](https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701?rtc=1&activetab=pivot:overviewtab) `or` [Windows Terminal Preview](https://www.microsoft.com/en-us/p/windows-terminal-preview/9n8g5rfz9xk3?rtc=1&activetab=pivot:overviewtab)
- [PowerShell](https://github.com/PowerShell/powershell/releases)

```json:add-to-winget-setting
{
    "$schema": "https://aka.ms/winget-settings.schema.json",

    // For documentation on these settings, see: https://aka.ms/winget-settings
    "source": {
      "autoUpdateIntervalInMinutes": 1
    },
    "experimentalFeatures": {
        "experimentalMSStore": true,
        "experimentalCmd": true,
        "experimentalArg": true,
        "list": true,
        "upgrade": true
    }
}
```

```powershell:install
# Winget Config
winget settings

# Winget Install
## Windows Terminal Preview
winget install Microsoft.WindowsTerminalPreview -s msstore
## PowerShell-Preview
winget install powershell-preview
## Alacritty (Stale)
### Wingetのマニフェストが少し古いです
winget install alacritty
```

これらは推奨ではありません｡｡必須なんだよなぁ｡｡なので入れます
Preview版のほうが新しいって感じでいいですよね?胸が躍リマスね!

>- RegistoryのLxssを使ってる系(Win-Terとか)は不具合を起こすことがあります｡そのときは再起動をします｡
>大抵は治るのですが､治らなかった場合はWindowsUpdとかのきっかけで治る場合もあります｡早まってクリーンインストール繰り返してWindows構築何回もしたくないですよね^^

[Alacrittyのせっていのれい](https://gist.github.com/koumaza/5ed0250d4fef1ed1dd981e083e0b16d7)


### フォント
__木漏れ日フォント`+`Firacode`+`Nerd__ をみっくすして使っています｡｡｡みっくす､､~~えろい~~えっち
![fontex](https://github.com/koumaza/Ecchi-fFont/raw/master/preview.png)
みっくす方法､リリースはここ！
https://git.io/ecchi

# インストール
[ArchWSL](https://github.com/yuk7/ArchWSL/releases)`or`[ArchWSL2](https://github.com/yuk7/ArchWSL2/releases)から､Arch(2).zipをDL
ArchWSLと2の違いはSystemd関連です。
どっち??ってなったらArchWSLを試してみましょう｡こっち使わないと2の恩恵がわからないしね!

 まずzipの中身を見るとわかるのですが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387170/82b847c2-ed21-c562-4008-9d7365cdcb0f.png)

このように`Arch.exe`と`rootfs.tar.gz`が入っています。

- `Arch.exe`はリネームすればWSLに登録するディストリ名を変えられます。([`Arch.exe`ランチャーのソース](https://github.com/yuk7/wsldl))
- `rootfs.tar.gz`はリネームしたらいけない。(詳しくはソース)

>ソースの`main`より
>https://github.com/yuk7/wsldl/blob/6e191a1876a4cdec8d47467b5f6baa2c78680a7b/main.c#L62
> `install.tar` ***,*** `install.tar.gz`
> `rootfs.tar` ***,*** `rootfs.tar.gz`
> これらがインストールするソースボールの名前に使えます。
> Gentooなどは`.txz`なのでTarに解凍すればインストールできます。

私はArcherと言う名前にしてます。

### WSLで動かすOSの場所
###### 何処においてもいいんです。ｻｲｺｰ

ただ、分かりやすい位置に置いとくのがベターだと思います。
例 : `C:\Users\Username\WSL\Arch\Ver2`
例 : `Z:\WSL\Zarch\`

**あとはターミナルでArch.exe起動しましょう｡それだけでインストールされる｡すき❤////**
エラー出たらまずは再起動してみるといいです｡
>`0x80370102`エラーが出たらBIOSで仮想化を有効化してください。

### デフォルトターミナル
これは任意ですが､`Arch.exe`から起動するのはデフォルトでは`Windows Terminal`ではないので変えることができます｡
`Arch.exe`をリネームしていたら代入してください｡

```powershell:pwsh
### Arch.exeがあるディレクトリで実行
Arch.exe config --default-term wt
```

# 初期設定
※インターネット環境がある前提です＾＾

### Pacman
```bash:shell
vim /etc/pacman.d/mirrorlist;vim /etc/pacman.conf
```
`pacman.conf`と`mirrorlist`の**書き方は[ArchWiki/Pacman](https://wiki.archlinux.jp/index.php/Pacman) と [ArchWiki/Mirror](https://wiki.archlinux.jp/index.php/%E3%83%9F%E3%83%A9%E3%83%BC)を参照してください｡**



```bash:shell
pacman-key --init;pacman-key --populate;pacman -Syy archlinux-keyring
```

keyringの初期設定;keyringのインストール;keyringの更新


#### パッケージのインストール+アップグレード

```bash:shell
pacman -Syyuu --needed base-devel fish vim neovim git progress python go repo tmux
```

WSL2では`SYSV IPC`が動作するため`fakeroot-tcp`である必要はありません。うそついてごめんなさい。
>~~最初に`fakeroot`をインストールするか Y/n で聞かれるので n と打ち Enter を押しましょう｡ Y だと一部システムが動かなくなります｡ 
`fakeroot-tcp`をもし置き換えてしまった場合は､やり直すかコンパイル済みのものをインストールします。~~

>```shell:Install<div></div><b><code>fakeroot-tcp</code></b>
tmp_fakeroottcp=$(mktemp) && \
curl -L "https://mirror.lesviallon.fr/arch4edu/$(uname -m)/fakeroot-tcp-1.25.3-2-$(uname -m).pkg.tar.zst" > ${tmp_fakeroottcp} && \
pacman -U ${tmp_fakeroottcp} && rm -f ${tmp_fakeroottcp} && unset tmp_fakeroottcp
```

#### 非ルートユーザーの作成

ルートユーザーだと`yay`が使えないのですy。
`$Ur_Favo_Name` に作りたいユーザーの名を代入してください

```bash:shell
# 代入
export Ur_Favo_Name=''
## or
set -gx Ur_Favo_Name ''

# 作成
useradd -md /home/$Ur_Favo_Name $Ur_Favo_Name
# sudoの設定
$EDITOR /etc/sudoers
### Or
  echo -e "\n##\n## Manually defining privilege user specification\n##\n${Ur_Favo_Name} ALL=NOPASSWD:ALL" \
  >> /etc/sudoers
# パスワードの設定
passwd $Ur_Favo_Name
```

ユーザー名に代入してください。
viの場合、保存するときに`:wq!`を使います。

```configuration:sudoers
...
ユーザー名 ALL=NOPASSWD:ALL
```

#### yay

```bash:shell
git clone https://aur.archlinux.org/yay-git.git;sed -i -e /exit\ \$E_ROOT/d /bin/makepkg;cd yay-git;makepkg;pacman -U yay-git-*.pkg.tar.*
```

#### Genie
このままだとSystemdが使えないので(2ではない場合)

```bash:shell
sudo -u $Ur_Favo_Name yay -S genie-systemd-git
```

#### その他

Shellの起動時にGenieが実行されるようにすると便利

```bash:config.fish
genie -s
```

Genieを使いたくない場合FishならこうすることでConfを読み込まずにシェルを起動できる

```shell:fish_without-config
wsl -- env HOME=(mktemp -d) fish
```

例えば、Tmuxすぐ起動したいなら

```cmd:arw.cmd
@REM e.g. locate in ${env:USERPROFILE}\bin etc....
@wsl.exe -d ArchV2 -- genie -c tmux
```

Xserverを使うには`$DISPLAY`にIPアドレスを入れないといけないです。
これは`ipconfig`でもできる~~らしい~~けどやらない、、

```shell:GetIP
set -gx DISPLAY (pwsh.exe -c 'Get-NetIPAddress -AddressFamily IPv4 | Where{$_.InterfaceAlias -eq "vEthernet (WSL)" } | select -ExpandProperty IPAddress' | perl -pe 's/\015\012/\012/g' | sed -e "s/\$/:3/" ) > /dev/null &
```
(絶対.NETのほうが速い、、、)

WindowsのPATHをLinux側で消したいとき

```shell:fish_remove-windows_path
set PATH (echo $PATH|tr ' ' '\n'|grep -v /mnt/|grep -E '^/')
```

# トラブルシューティング等
### fishが`/mnt`上で動かない
別シェルを使うしかないね、、、、、
### Xを使うとdbusが応答しない
##### -> aur`dbus-x11`に置き換える｡
### Dockerが使えない
##### -> podmanを使う (monoとかでも動くと思います。)
daemonレスで使えますが､rootレスで使うには別途作業が必要です｡
##### -> ubuntuを使う
https://cloud-images.ubuntu.com/ から `xxxxxx-server-cloudimg-amd64-wsl.rootfs.tar.gz` をDLして`rootfs.tar.gz`にリネーム
https://github.com/yuk7/wsldl/releases/download/19111602/icons.zip から `icons.zip`/`ubuntu.exe` (Ubuntuのバージョン番号を加えてリネームしたほうがわかりやすいかと)
この2つを同じディレクトリに置けばUbuntuがインストールできます｡

# あきかんはリサイクル
お問い合わせは､
お客様相談室(体言止め)
ピラミッド
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>![image.png](https://www.kankyobika.or.jp/images/rec-aluminum-steel-002.png)

<font color="white">知らんけど</font>