ubuntu

インストール

WSL を入れる

WSL を有効にする。PC 再起動が求められる。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Ubuntu 18.04 の appx ファイルをダウンロードする。

cd ~/Downloads
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing

aapx ファイルをインストールする。

Add-AppxPackage ./Ubuntu.appx

最初の起動

Win+S で"ubuntu"と入力して Ubuntu を起動する。 するとコンソールが開くのでインストール完了まで待つ。

好きなユーザ名とパスワードを入力する。

ここでターミナルを閉じるとデフォルトが root になってしまうので注意。


::: tip
デフォルトでは`/mnt/c`でWindowsのCドライブにアクセスできるが、それだとやりにくいので`/c`になるように設定している。
:::

ユーザのホームディレクトリをWindows上のパスに変更する。
```bash
sudo vim /etc/passwd

自分のユーザ名を探してホームディレクトリを/c/linux_homeなどに変える。

リポジトリを国内サーバーに切り替える。

sudo sed -i -e 's%http://.*.ubuntu.com%http://ftp.jaist.ac.jp/pub/Linux%g' /etc/apt/sources.list

パッケージマネージャのアップデートをする。

sudo apt update
sudo apt upgrade

/home/<user name>にもともとある.bashrcを変更先のホームディレクトリにコピーしないとターミナルの色が消えたりする。

Docker を入れる

ref: https://medium.com/@XanderGrzy/developing-for-docker-kubernetes-with-windows-wsl-9d6814759e9f

Docker を WSL にインストールする。

sudo apt-get install apt-transport-https \
ca-certificates \
curl \
software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get update && sudo apt-get install docker-ce

ホストを設定する。

echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc

WSL の設定ファイルを作成する。

sudo touch /etc/wsl.conf

ボリュームマウントが正しく動くように、以下をwsl.confに書く。

[automount]
root = /
options = "metadata"

Kubernetes を入れる

WSL に Kubernetes をインストールする

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update && sudo apt-get install -y kubectl

設定ファイルをのシンボリックリンクを貼る。

WIN_USER=$(/c/windows/system32/cmd.exe /c 'echo %USERNAME%' | sed -e 's/\r//g')
mkdir ~/.kube
cd ~/.kube
ln -snfv `realpath --relative-to=. /c/Users/${WIN_USER}/.kube/config` config

jdk

sudo apt-get install openjdk-8-jdk

Ruby

apt install -y ruby

gemインストール時はsudoを付ける。

sudo gem install ruby-kafka

nodejs を入れる

sudo apt install -y nodejs

yarnを入れる

先にcmdtestをアンインストールする必要がある。

sudo apt remove cmdtest
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt install -y yarn

ref: ERROR: There are no scenarios; must have at least one.

yarn global addするときは、自動でパスを通してくれないので以下のようにパスを通す。

export PATH="$PATH:`yarn global bin`"

ref: yarn global addしたパッケージのパスを通す

brew

https://docs.brew.sh/Homebrew-on-Linux

インストール。

# brewの依存関係を入れる
sudo apt-get install -y build-essential curl file git
# brew本体を入れる
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

.bashrcでパスの設定をする

export PATH=$PATH:'/home/linuxbrew/.linuxbrew/bin'

dos2unix を入れる

sudo apt install -y dos2unix

Helm

brew install kubernetes-helm

インストール後に以下コマンドでサーバーのバージョンをアップグレードする。

helm init --upgrade

Git の設定

.gitignoreを有効化する。

git config --global core.excludesfile ~/.gitignore_global

Gradleを入れる

先にjdk8以上を入れておく必要がある。

brew install gradle

ubuntu コマンド

C:\Users\hatak\AppData\Local\Microsoft\WindowsAppsにあるのでパスを通す。

FluentTerminal

https://github.com/felixse/FluentTerminal

インストール

スタート->設定->更新とセキュリティで、開発者モードを ON にする。

開発者モードを有効にしないと次の choco install に失敗します。

管理者権限の PowerShell で実行する。

choco install fluent-terminal

改行(\)つきのコマンドが正常に貼り付けられるように Settings -> Profiles -> Line ending translation modeをLFに設定する。

デフォルトユーザを変える

ユーザを作成する。

sudo adduser <user_name>

# sudoグループに追加
sudo gpasswd -a <user_name> sudo

ref: ubuntu ユーザを追加して sudo 権限をつける

Powershell で以下のコマンドを実行する。

ubuntu1804 config --default-user <username>

sc stop LxssManager
sc start LxssManager

Windows のユーザ名を取得する

WIN_USER=$(cmd.exe /c 'echo %USERNAME%' | sed -e 's/\r//g')
# WSLからcmd.exeをフルパスで実行する場合は以下cmd.exeのパスは以下
WIN_USER=$(/c/windows/system32/cmd.exe /c 'echo %USERNAME%' | sed -e 's/\r//g')

VSCodeをWSLから起動する

Windowsのユーザ名を取得する必要がある。 .bashrcで以下のエイリアスを設定しておくといい。

WIN_USER=$(/c/windows/system32/cmd.exe /c 'echo %USERNAME%' | sed -e 's/\r//g')
alias code="/c/users/${WIN_USER}/AppData/Local/Programs/'Microsoft VS Code'/code.exe"

パイプでクリップボードにコピー

clip.exeを叩くとコピーできる。

cat hoge.txt | "/c/windows/system32/cmd.exe /c 'clip.exe'"

.bashrcでエイリアスに設定しておくと楽

alias clip="/c/windows/system32/cmd.exe /c 'clip.exe'"

# 使用例
cat hoge.txt | clip

ref: Copy to clipboard using Bash for Windows

localhost の MYSQL に接続する

mysql --host=127.0.0.1 --user=root --password=password

ref: https://stackoverflow.com/questions/41819064/i-cant-use-mysql-in-windows-linux-subsystem

WSL 独自のコマンド

WSLの再起動

/etc/wsl.confでマウントパスを変更した場合などは再起動が必要。

net stop LxssManager
net start LxssManager

ref: Rebooting Ubuntu on Windows without rebooting Windows?

wsl.exe

PowerShell から WSL 上のコマンドを実行する。

wsl.exe echo hoge

# ユーザを指定して実行
wsl.exe -u root echo hoge

# ユーザのホームディレクトリを変更
wsl.exe -u root usermod -m -d /c/linux_home hako1912

パイプする場合は以下のようにする。

wsl.exe /bin/bash -c "echo hello | wc"

# これだとダメ。wcが見つかりませんエラーがでる
wsl.exe echo hello | wc

ref: Quoting pipe commands with wsl.exe

wslpath

Win-WSL でパスの変換ができる。

# Winの相対パスに変換
wslpath -w .

# Winの絶対パスに変換
wslpath -aw .

制約

ln -sでシンボリックリンクを作成するときは、第一引数を相対パスにしないといけない。 第一引数のパスはシンボリックリンクに登録されるパスになるから Ubuntu のパスだとうまく動かない?

# NG
ln -s /mnt/c/hoge/fuga/aaa.txt /mnt/c/hoge/fuga/bbb.txt

# OK
cd /mnt/c/hoge/fuga
ln -s aaa.txt bbb.txt

# OK
cd /mnt/c/hoge/fuga
ln -s aaa.txt /mnt/c/hoge/fuga/bbb.txt

# OK: リンクURLがカレントディレクトリ
ln -snfv ../a .

# NG: リンクURLが親ディレクトリ
ln -snfv a ..
ln -snfv a ../

# NG: リンクURLが子ディレクトリ
ln -snfv a dir
ln -snfv a dir/
ln -snfv a dir/a
  • 第一引数が相対パスでないといけない。
  • 第二引数(リンクを置くパス)がカレントディレクトリでないといけない。

realpathコマンドで絶対パスを相対パスに変換できるので、これを利用すると解決できる。

SOURCE='/mnt/c/hoge.txt'
# カレントディレクトリを基点に、実ファイルの相対パスを第一引数に指定する
cd `dirname $0`
ln -snfv  `realpath --relative-to=. ${SOURCE}` /mnt/c/fuga.txt

やり直す

管理者権限で PowerShell を開いて以下を実行する。

# アンインストール
Get-AppxPackage *ubuntu* | Remove-AppxPackage

# .appxをダウンロード
cd ~/Downloads
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing

# 再インストール
# HRESULT: 0x80073CF6 で失敗したらもう一回実行するとうまくいった
Add-AppxPackage ./Ubuntu.appx

# これは古いコマンド。
# lxrun /uninstall /full
# lxrun /install

再インストールに失敗する場合は管理者権限の PowerShell で以下のコマンドを実行する。

# WSLを無効化(実行後にPC再起動すること)
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
# WSLを有効化(実行後にPC再起動すること)
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

その後、Add-AppxPackage ./Ubuntu.appxし直す。

ネットが遅い

Windows Defenderのリアルタイム保護を無効にする。

Set-MpPreference -DisableRealtimeMonitoring 1

VSCodeで使うgitをwslのgitにする

バッチファイルを作成する。

@echo off
wsl wslpath -aw $(git %*) 2> nul
if not %errorlevel% == 0 (
    wsl git %*
)
@echo on

VSCodeの設定にgit.pathを追加する。

{
    "git.path": "C:\\tools\\git.bat",
}

ref: VSCodeでWSLのGitを使う(Ubuntu 18.04)

Error: ENOSPC: System limit for number of file watchers reached

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

Ref: https://github.com/gatsbyjs/gatsby/issues/11406#issuecomment-458769756