Chienomi

ConoHaとArch LinuxではじめるLinux

windows

ごあいさつ

Hi, there! はるかみです。

この記事はConoha Advent Calendar 2018の7日目として書かれたものだよ。 いままでChienomiを見たことある人もない人も楽しんでいってね。

基本的にChienomiはedgeな記事を書くことが多いけれど、Advent Calendarのときだけは初心者向けの記事を書いたりしているんだ。 Chienomiでは最近で最もアツかったのは高EQ AIに関する記事だよ!

本当はConoHa WINGに関する記事を書こうかと思ったけど、Advent Calendarで書くようなものじゃないと思ったんだ。 考えていたものは検証に5, 6日必要だとわかったから協賛でもしてもらわないと無理だとわかったんだよ。

それにConoHa WINGでConoHa Advent Calendarのハードルも下がって、今年はWINGに関する記事がたくさん載るだろうからね。え?毒が少ないって?さすがに同じAdvent Calendarの記事に毒を吐くのは来年にとっておくよ。

あなたはLinuxを使っているだろうか。

最近はLinuxというとドヤりツールになっていたり、あるいはミーハーなものになっていたりもする。 あとは、仕事のための箔付けだろうか。

それはLinuxのなんたるかがわかっていない…と思うのだが、ここではそんな話はおいて、とりあえずLinuxを触ってみたいという人のお手伝いをしよう。

この記事にかかれていることはかなりの部分、過去の記事や他で書いたことと重複してしまうのだが、Advent Calendarの記事ということでご容赦願いたい。

今回はLinuxを全く使ったことのないWindowser向けにエクスプレスで進めていく。 スキル不足が直接に迷惑になるサーバー構築ではなく、またデスクトップ用途でもない。

なお、Linuxそのものを体験して評したいのならばメインマシンにLinuxをインストールするよりない。 LinuxのUXはWindowsのそれよりはるかに優れているが、それはさすがにVPSでわかるようなものではない。

また、副次的に性能の低いコンピュータを使っている人の場合、月1000円から2000円程度で強力なコンピュータにオフロードできる、という面でも話していこうと思う。

SSHを用意する

Windows 10では2017 Fall Creator UpdateからOpenSSHが標準採用になっている。ちなみに、2018 Aprilではサーバーも入っている。 とりあえずまだWindows 10ですらない、という人のことはあまり考えたくないので、そこから話を進めよう。

まずはcmdを検索、あるいは“プログラムを指定して実行”からcmd

Windowsでcmd.exeを探す

ssh -VでOpenSSHを確認。

C:\Users\Harukamy>ssh -V
OpenSSH_for_Windows_7.6p1, LibreSSL 2.6.4

ssh-keygenで鍵を作成する。 Microsoftが提供するWindowsアプリでありながらUnixスタイルとWindowsスタイルが混在してとてもわかりづらいことになる。 OpenSSHが使うディレクトリは相変わらず%HOME%\.sshなのだが、Explorerでドットファイルが作れないのでコマンドライン上で行う。

>mkdir .ssh

その上でSSH鍵を生成する。

>ssh-keygen -f .ssh/conoha_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in .ssh/conoha_rsa.
Your public key has been saved on .ssh/conoha_rsa.pub.
The key fingerprint is
SGA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX harukamy@HACKMAN
the key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+---[RSA 2048]----+

このパスフレーズは秘密鍵を暗号化しておき、使用するときに解除して使用するためのパスフレーズである。 システムが十分に安全かつ強固に保護され、運用されているのであれば(物理的に盗まれることも、ネットワークごしに盗まれることも、ディスクをコピーされたとしても使われることも)ないのであればパスフレーズはなくても構わないし、まず考えられない程度に強固なのであればほどほどに強固なパスフレーズでも構わないだろう。

これでホームディレクトリ以下.ssh/conoha_rsa(秘密鍵)と.ssh/conoha_rsa.pub(公開鍵)のペアが作成される。

Explorerではとてもホームディレクトリにアクセスしづらいので、そこをなんとかしておこう。 ExplorerでC:\Users\ユーザー名に移動し、“クイックアクセス”を右クリックして“現在のフォルダーをクイック アクセスにピン留め”を選択する。

あと、適切なエディタがないのも困るので、インストールしておくといい。 無難なのはみんな大好きNotepad++。

ConoHaでサーバーを立てる

ConoHaでの契約については公式のページをみてほしい。

それではConoHaにログインし、“サーバー追加”からサーバーを追加しよう。 練習用なら512MBで良いだろうし、パフォーマンスオフロードを期待するなら1GB以上にしよう。 OSはもちろん、Arch Linuxである。

ConohaでArch Linuxインスタンスを立てる

Rootパスワードは本当に強固なものにすること。 ここはあまり心配のない部分だが、それでも24文字以上くらいにはして欲しいところだ。

オプションを開き、接続許可ポートを設定する。 IPv4/IPv6ともSSHのみを許可するように設定する。 IPv6のない環境からアクセスするのであればIPv4のみでも構わないし、IPv6でのアクセスが確実な接続形式をとっているのならIPv6のみのほうが良い。

ConohaでポートとSSHキーの設定

そしてSSH Keyセクションは “キーを新規作成” を選択し、“登録方法”に“インポート”を選択する。 そして“パブリックキー”のところに、作成した~/.ssh/conoha_rsa.pub (.pubファイル!!!)の内容をコピペする。

この時点で鍵登録しておくとSSHのパスワード認証が無効化された状態でインスタンスが立つので安全な状態になる。

インスタンスを作成し、起動したら、ConoHaのサーバー一覧からサーバーを開くと“VPS設定”からI逆引きホスト名を知ることができる。

それでは例えばここがv0-0-0-0.a00a.tyo0.static.cnode.ioだと仮定しよう。

SSHでログインする

ではいよいよWindowsに戻ってログインしよう。 OpenSSHの-iオプションに秘密鍵を指定する。引数はSSHのホストだが、その前にユーザーが必要だ。

>ssh -i .ssh/conoha_rsa root@v0-0-0-0.a00a.tyo0.static.cnode.io

ログインできたらexitして一旦SSHを抜ける

# exit

もう少し楽にログインできるように設定をしておこう。 .sshディレクトリにconfigというテキストファイルを作成する。拡張子はない。 UTF-8+LFで編集してくれるエディタを使うのが良いかもしれない。

このファイルは次のような感じだ。

Host conoha-root
  HostName v0-0-0-0.a00a.tyo0.static.cnode.io
  Port 22
  User root
  IdentityFile .ssh\conoha_rsa

これで

>ssh conoha-root

とするだけでログインできるようになる。

OpenSSHが使えない場合

TeraTermを使う方法が公式で紹介されている。

TeraTermの使い方公開鍵の使い方が紹介されている。

ユーザーを作成する

Windowsでは歴史的経緯から曖昧だが、rootユーザーというのは全権を持つ「神」であり、普段使うべきではない。 それどころか、rootのシェルプロセスがあるだけでも望ましくないくらいだ。

Archはインストール時にユーザーを作成しない。自ら作成する必要がある。

ではログインして作業しよう。 ユーザー作成コマンドはuseraddだが、オプションとしては-U(ユーザープライマリグループを作成する), -G(グループを指定する), -m(ホームディレクトリを作成する)を使用する。 このユーザーは管理ユーザーとなるのでwheelグループに加えておこう。

# useradd -U -G users,wheel -m conohachan

ユーザーのパスワードを設定する。とても強固なものが良い。

# passwd conohachan

ユーザー用の鍵を登録しよう。ここではOpenSSHを前提に進める。 Windowsでもうひとつcmdを立ち上げ、先程と同じ要領でキーを作る。

>ssh-keygen -f .ssh/conoha-user_rsa

configを追加する。今度は鍵とユーザーが異なる。

Host conoha
  HostName v0-0-0-0.a00a.tyo0.static.cnode.io
  Port 22
  User conohachan
  IdentityFile .ssh\conoha-user_rsa

鍵をアップロードする。まだrootでしかログインできないので、rootで送る。

>scp .ssh/conoha-user_rsa.pub conoha-root:.

これでConoHaのrootホームディレクトリにコピーされるので、これをSSHに戻ってセットアップする。 まずはユーザーの.sshディレクトリを作る

# mkdir ~conohachan/.ssh

そして、authorized_keysというファイルとして配置する。

# mv conoha-user_rsa.pub ~conohachan/.ssh/authorized_keys

このままだとrootユーザー所有ファイルになってしまうので、直しておく。

# chown -R conohachan:conohachan ~conohachan

.sshディレクトリはオーナーのみアクセス可能であることが求められるため、パーミッションを修正する。

# chmod 700 ~conohachan/.ssh

これでユーザーとしてログイン可能になったはずだ。

>ssh conoha

初期設定

まだrootのセッションも閉じないでおこう。 この状態では管理作業ができるのはrootだけなので、conohachanにも許すようにしたいところだ。

/etc/sudoersというファイルを編集するのだが、これは直接編集してはならない。 visudoというコマンドを使う。エディタにVIが入っていないのでエディタも指定してあげる必要がある。

# EDITOR=nano visudo

下の方にこんな行がある。

# %wheel ALL=(ALL) ALL

このコメントアウトを外しておく。次のように。

%wheel ALL=(ALL) ALL

オーケー。Ctrl+Oして保存し、Ctrl+Xで終了しよう。

ConoHaでは最近、script側でアップデートするようなので不要に思えるけど、一応アップデートしよう。この作業は定期的にしなければならない。

# pacman -Syu

カーネルパッケージ(linuxというパッケージ)が更新対象に含まれていた場合は再起動する。SSHのセッションは切られる。

# reboot

もう少し使いやすく…

とりあえずここからはLinuxを長年使っている身として「それなりに使いやすい環境を整える」ところをやっておきたいと思う。 特にArch Linuxはミニマルなので足りないと感じるものは色々あるだろう。

パッケージを揃える

まずはユーザーログインする。

>ssh conoha
Enter passphrase for key 'C:\Users\harukamy\.ssh\conoha-user_rsa':

$

ちょっとrootでの作業が続くのでrootになる。

$ sudo bash -l
[sudo] password for conohachan: 
# 

サーバーなら必要ないのだけど、まずはユーザーで電源切ったり再起動したりできるようにしておこう。pacmanはArch Linuxのパッケージ管理ソフトウェアであり、ソフトウェアをインストールしたりアンインストールしたりアップグレードしたりできる。

# pacman -S polkit

これでsystemctl poweroffsystemctl rebootがユーザーでできるようになる。

VI, vim, Zshはなくてはならないソフトウェアだ。あと、ターミナルデュプレクサも欲しいのでtmuxも入れておこう。 Zshはgrml-zsh-configパッケージをインストールするとすごく使いやすくなる。 あと、このあとyayを入れる関係でgoとgitも入れておく。

# pacman -S vi vim vim-plugins zsh grml-zsh-config tmux go git

いい感じになってきた。ここで一旦rootを抜け、tmuxを起動する。

# exit
$ tmux

tmuxはプレフィックスキーを押したあとになにかキーを押すとtmuxに対する指示になるようになっている。 デフォルトのプレフィックスキーはCtrl+bで、?を入力することによりキーバインドの一覧が表示される。

とりあえずcが新しいウィンドウを作成するコマンドなので、Ctrl+b Ctrl+cと入力しよう。

これでわかりにくいがふたつのウィンドウができた。nコマンドによりこのウィンドウを行き来できる。

pacmanが扱うことができるのはArch Linuxの公式パッケージだけだ。 AURという、非公式の(しかし、運営自体は公式に行われている)パッケージも扱いたいので、yayというソフトウェアをインストールする。 手順は

  1. Gitを使ってyayのリポジトリをコピー
  2. yayディレクトリに移動
  3. makepkgでパッケージを作成
  4. pacmanで作成したパッケージをインストール
$ git clone 'https://aur.archlinux.org/yay.git'
$ cd yay
$ makepkg
$ sudo pacman -U *.pkg.tar.xz

これでAURのパッケージもインストールすることができる。 もし、yayに不満ならばついでにもうひとつのAURヘルパーであるtrizenもインストールしておこう。pacmanと違い、AURヘルパーはユーザーとして実行する。

$ yay -S trizen

yayやTrizenは公式のパッケージも扱うことができる。

見やすく、使いやすく

まずはすごく簡単な話として、Bashなど投げ捨ててZshにしよう。 Bashなんてゴミだ。

まずは.zshrcを作っておく。

$ touch .zshrc

オーケー。Zshにしよう。

$ chsh
Changing shell for conohachan.
Password: 
New shell [/bin/bash]
> /bin/zsh

chshはログインシェルを変更するだけなので、今のシェルは変更されない。 一刻も早くBashやZshに変えたいので、Zshでログインしよう。

$ zsh -l
%

Poifect! grml-zsh-configをインストールしているのでとても快適に仕上がっているはずだ。 とりあえず途中でわからなくなったら、わかるところまで打ってからTAB連打で切り抜けられる。オプションやオプション引数なんかもだ。 あと、f/b/b<TAB>foo/bar/bazに展開する、なんてこともできるようになる。

さらにZshを強化して、Zshから離れられない体にしてやろう。

$ yay -S zsh-completions zsh-syntax-highlighting

Syntax Highlightを使用するため、.zshrcに次のような記述を行う。 vimが使えるならvimを使えばいいし、ダメならnanoでもいい。

if [[ -f /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh ]]
then
  source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
fi

grml-zsh-configはヒストリを辿ったときに「既に第一ワードを入力している場合は第一ワードを確定として、途中の場合は第一ワードの検索開始時カーソル位置までを確定として辿り、カーソルは末尾に移動する」という挙動になっているのだが、「常にカーソル位置までを確定として履歴を辿る」という機能も欲しいのではないだろうか。 というわけで、PgUp/PgDownでそのような検索ができるように.zshrcを追記する。

autoload -U history-search
bindkey -M emacs "\e[5~" history-beginning-search-backward
bindkey -M emacs "\e[6~" history-beginning-search-forward

うーん、beautiful!

さて、ここからはちょっと複雑なことをする。 わかりやすく美しいZshプロンプトのPowerlevel9kを使いたいと思うのだが、これはWindowsだとひと手間ふた手間ある感じだ。

とりあえずインストールだけはしておこう。

$ sudo pacman -S zsh-theme-powerlevel9k

ここからは一旦ログアウトして(各シェルのログアウトしたあとSSHからログアウトするのを忘れずに)Windowsだ。まずはGit for Windowsをインストールする。

これで様々な問題を解消できるようになる。別にMSYS2を入れてもらっても構わないのだが、Git Bashが各種設定を済ませてあるので話が早い。

そして、次にCicaフォントをインストールする。 完全なPowerlineグリフを持っているので話が一番てっとりばやい。このフォント、グリフが豊富で見やすく、制限された状況で本当に便利だ。

で、Git Bashを起動して、右クリックからのOptionsで、フォントをCicaにする。ここまでやっておかないと後で困る。 それではGit Bashからログインしてみよう。

$ ssh conoha

通常Git Bashでも.exeは省略できないのだが、sshはGit Bash側で定義されており、省略できる。

minttyになったことでだいぶ見やすくなったのではないだろうか。Cicaフォントだし。 で、powerlevel9kなのだけど、とりあえず私がサーバーで使っている設定を晒そう。

prompt off
POWERLEVEL9K_MODE=awesome-fontconfig
source /usr/share/zsh-theme-powerlevel9k/powerlevel9k.zsh-theme
zle-keymap-select() {
  zle reset-prompt
  zle -R
}
zle -N zle-keymap-select
POWERLEVEL9K_SHORTEN_STRATEGY=truncate_from_right
POWERLEVEL9K_SHORTEN_DIR_LENGTH=5
POWERLEVEL9K_SHORTEN_DELIMITER=".."

# Colorize
POWERLEVEL9K_OS_ICON_BACKGROUND="white"
POWERLEVEL9K_OS_ICON_FOREGROUND="blue"
#POWERLEVEL9K_DIR_HOME_FOREGROUND="white"
#POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND="white"
#POWERLEVEL9K_DIR_DEFAULT_FOREGROUND="white"
POWERLEVEL9K_USER_DEFAULT_BACKGROUND=white
POWERLEVEL9K_USER_DEFAULT_FOREGROUND=111
POWERLEVEL9K_USER_ROOT_BACKGROUND=red
POWERLEVEL9K_USER_ROOT_FOREGROUND=black
POWERLEVEL9K_USER_SUDO_BACKGROUND=051
POWERLEVEL9K_USER_SUDO_FOREGROUND=052
POWERLEVEL9K_USER_ICON="\uF415"
POWERLEVEL9K_ROOT_ICON="#"
POWERLEVEL9K_SUDO_ICON="\uF09C"
POWERLEVEL9K_VI_MODE_NORMAL_FOREGROUND=051
POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=168
POWERLEVEL9K_VCS_CLEAN_BACKGROUND=147
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=174
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=139
POWERLEVEL9K_VCS_CLEAN_FOREGROUND=black
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=black
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=black
POWERLEVEL9K_HOST_REMOTE_FOREGROUND=162
POWERLEVEL9K_HOST_REMOTE_BACKGROUND=223

POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon vi_mode user host dir newline)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs command_execution_time vcs)

これはVIモードで使うことを前提にしているので、一般化すると次のような感じか。

で、powerlevel9kなのだけど、とりあえず私がサーバーで使っている設定を晒そう。

prompt off
POWERLEVEL9K_MODE=awesome-fontconfig
source /usr/share/zsh-theme-powerlevel9k/powerlevel9k.zsh-theme

POWERLEVEL9K_SHORTEN_STRATEGY=truncate_from_right
POWERLEVEL9K_SHORTEN_DIR_LENGTH=8
POWERLEVEL9K_SHORTEN_DELIMITER=".."

# Colorize
POWERLEVEL9K_OS_ICON_BACKGROUND="white"
POWERLEVEL9K_OS_ICON_FOREGROUND="blue"
POWERLEVEL9K_USER_DEFAULT_BACKGROUND=white
POWERLEVEL9K_USER_DEFAULT_FOREGROUND=111
POWERLEVEL9K_USER_ROOT_BACKGROUND=red
POWERLEVEL9K_USER_ROOT_FOREGROUND=black
POWERLEVEL9K_USER_SUDO_BACKGROUND=051
POWERLEVEL9K_USER_SUDO_FOREGROUND=052
POWERLEVEL9K_USER_ICON="\uF415"
POWERLEVEL9K_ROOT_ICON="#"
POWERLEVEL9K_SUDO_ICON="\uF09C"
POWERLEVEL9K_VCS_CLEAN_BACKGROUND=147
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=174
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=139
POWERLEVEL9K_VCS_CLEAN_FOREGROUND=black
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=black
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=black
POWERLEVEL9K_HOST_REMOTE_FOREGROUND=162
POWERLEVEL9K_HOST_REMOTE_BACKGROUND=223

POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon user host dir newline)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status background_jobs command_execution_time vcs)

grml-zsh-configを使っている関係で先にprompt offするのは必須。 FOREGROUNDとBACKGROUNDの色はお好みで、という感じだ。 Zsh上で(つまり、ログインしたConoha上で)

% for i in {000..255}; do print -P "$i %K{$i}     %k"; done

とやれば、番号ごとにどんな色か把握できる。 もちろん、もっと好みに設定を変更しても構わないだろう。

これも.zshrcに記述する。

この設定は作業中のミスをなくすために行っているもので、実のところ私は普段はPowerlevel9kを使っていない。 だが、SSHから入ったときだけPowerlevel9kになるようにしており、ホストごとに色を変えてある。このことにより、「ローカルホストかリモートホストかを間違える」事故を防止している。

実際、普段はgrmlデフォルト

このホストにSSHで入るとこうなる。

フォントが設定されていないcmd.exeから入ると表示が乱れている。右側のウィジットが次行に表示されているので使えないこともないが…

Git Bashなら正しく表示される。

Powerlevel9kの利用は好みの問題だと思うけれど、Git Bash + Cicaという組み合わせはやって損がないのではないだろうか。

Powerlevel9kの利用は好みの問題だと思うけれど、Git Bash + Cicaという組み合わせはやって損がないのではないだろうか。

自動アップグレード

とりあえず毎日朝6時にアップグレードするようにしてみよう。 Arch LinuxのinitであるSystemdというものを利用する。SystemdにはSystemdタイマーというジョブスケジューラがあるので、これを使うのだが、説明はとても難しいのでとりあえず例示にとどめよう。

rootとして/etc/systemd/update.serviceを作成する。

% sudo nano /etc/systemd/update.service
[Unit]
Description=update package
RefuseManualStart=no
RefuseManualStop=yes

[Service]
Type=oneshot
ExecStart=/bin/pacman -Syu --noconfirm
ExecStartPost=/bin/reboot

続いて/etc/systemd/update.timerを作成する。

% sudo nano /etc/systemd/update.timer
[Unit]
Description=Automatic update packages

[Timer]
OnCalendar=*-*-* 06:00:00
Persistent=true

[Install]
WantedBy=timers.target

時は来たれり

バッチリだ。ここまで来れば、 サービスや他者に迷惑をかけない範囲であれば 君が学んだことを存分に発揮できる場が出来上がったはずだ。

例えばvimを練習したいのなら

% vim vim-training-file

とかやればいいし、Pythonでプログラムを書きたいなら

% vim myfirst.py

とかやればいい。

Linuxについて教えると話は無限に長くなるし、そもそもここまでの一連の作業でそれなりにLinuxに慣れる要素もあったので、Advent Calendarの記事としてはこれくらいで良いではないかと思っている。 この記事のソースファイルはこの行が606行目だし。

というわけで、世の中の人がちょっとでもLinuxに、そしてコンピュータに関心を持ってくれれば幸いだ。 ついでに、こんなふうに簡単にサーバーを立てて、練習やアウトソースにも使えるConoHaは素晴らしいサービスです!(おべっか)

Linuxについての突っ込んだ話はこのChienomiでしているから、関心がある人はぜひチェックして欲しい。 コンピュータやLinuxについて学びたい、教えて欲しいという人はぜひMimir Yokohamaへどうぞ。

それでは今年もこのへんで。はるかみ☆でした♪