Gentooをインストールして、XmonadでGUI環境を整える

Gentooをインストールして、XmonadでGUI環境を整える
=============================================

はじめに
-------

この記事は未完です。自分用のメモです。僕の個人的な環境での作業例です。現在はKVM上のゲストOSの環境を調整中です。

ゆくゆくは、もっと細かに内容にわけて、それぞれ独立した記事にする予定です。

何をするか
---------

長年、Gentooを使ってきて、どのような環境にするのかが、ほぼ、かたまってきた。その「自分用の環境」を作成するための、やりかたをここにメモする。

この記事の書きかた
----------------

Gentooをインストールして、環境を整えるという作業を何度もくりかえしてきた。そこで、だいたい、どのようにするかは覚えている。ただし細部は忘れている。そこで、まずは作業の前に、だいたいの流れを書く。そして、作業しながら細かい点をうめたり、修正したりしていく。

実際の作業がどこまで進んでいるのかは「**!!ここまでやった!!**」というラベルで表示する。

どのような環境にするか
-------------------

つぎのような環境にする。

* ディスクはMBRではなくGPTで初期化する
* LVMを使って、パーティションの容量をフレキシブルにする
* SWAP領域はメモリ容量の2倍
* bootパーティションは自動ではマウントしない
* x86_64用のGentooをインストールする
* ...

インストールCDの作成
------------------

GentooのミラーサイトからISOイメージを落としてくる。つぎのアドレスから、ミラーサイトを選ぶ。

https://www.gentoo.org/downloads/mirrors/

つぎのようにリンクをたどる。

* releases/
* amd64/
* autobuilds/
* current-install-amd64-minimal/

install-amd64-minimal-201XXXXX.isoをダウンロードする。

それをCDに焼く。

    % cdrecord install-amd64-minimal-201XXXXX.iso

起動
----

GentooをインストールするマシンにインストールCDをいれ、起動する。つぎのように表示されたらエンターキーを押す。

    boot:

ここでエンターキーを押さないと、ハードディスクから起動してしまう。

ネットワークの確認
----------------

ここではDHCPサーバが動いているネットワーク内にいることを前提とする。その場合pingが通るはずだ。

    % ping foo.bar.com -c 3

foo.bar.comのところは適当なアドレス(PINGを受け付けてくれるところ)に置き換えること。

パーティションの作成
------------------

### パーティションの計画

まずは、パーティションの切りかたの計画を立てる。LVMが使えるようになってから、この作業はずいぶんと楽になった。LVM上に作ったパーティションは、あとから容量を変えることができるからだ。

#### ハードディスクとメモリの容量を調べる

とりあえず、ハードディスク容量とメモリの大きさを調べよう。

    # parted /dev/sda
    (parted) print
    ...
    Disk /dev/sda: 2000GB
    ...
    (parted) quit

ハードディスク容量は2TBくらいだ。

    # free -m
              total ...
    Mem:      15951 ...
    Swap:         0 ...

このマシンは16GBのメモリを積んでいる。

#### パーティションの構成

* grub: 2MiB
* boot: 1GiB - 3MiB
* root: 5GiB
* swap: 32GiB
* lvm2: 1TiB - 32GiB
* space: 約1TiB

だいたい、こんな感じにする。多少のずれはあるかもしれない。これをMiB単位での開始位置と終了位置とに直す。

* grub: 1 - 3
* boot: 3 - 1024
* root: 1024 - 6144
* swap: 6144 - 38912
* lvm2: 38912 - 1048576
* space: 1048576 - -1

#### LVM上の論理パーティションの構成

* usr:  10GiB
* home: 10GiB
* opt:   5GiB
* var:   5GiB
* tmp:   2GiB

### GPTラベルをつける

つぎのようにしてGPTラベルをつける。これで、もとのデータにはアクセスできなくなるので注意すること。

    # parted /dev/sda
    (parted) mklabel gpt
    (parted) print

### パーティションを作成する

パーティションを作成するときの単位をMiBにする。

    (parted) unit mib

GRUBが使用するパーティションを作成する。

    (parted) mkpart grub 1 3
    (parted) set 1 bios_grub on
    (parted) print

bootパーティションを作成する。

    (parted) mkpart boot 3 1024
    (parted) set 2 boot on
    (parted) print

rootパーティションを作成する。

    (parted) mkpart root 1024 6144

swapパーティションを作成する。

    (parted) mkpart swap 6144 38912

lvm2パーティションを作成する。

    (parted) mkpart lvm2 38912 1048576

予備のパーティションを作成する。

    (parted) mkpart space 1048576 -1
    (parted) print
    (parted) quit

### 論理パーティションを作成する

#### dm-modモジュールを読みこむ

    % modprobe dm-mod

#### パーティションの準備

    % pvcreate /dev/sda5

#### ボリュームグループの作成

    % vgcreate vg /dev/sda5

#### 論理パーティションの作成

    # lvcreate -L10G -nusr vg
    # lvcreate -L10G -nhome vg
    # lvcreate -L5G -nopt vg
    # lvcreate -L10G -nvar vg
    # lvcreate -L2G -ntmp vg

ファイルシステムを作成する
-----------------------

### Swap領域の作成と有効化

    # mkswap /dev/sda4
    # swapon /dev/sda4
    # free -g

### ファイルシステムの作成

    # mkfs.ext4 /dev/sda2
    (UEFIのシステムの場合には、mkfs.vfat -F32 /dev/sda2)
    # mkfs.ext4 /dev/sda3

    # mkfs.ext4 /dev/vg/usr
    # mkfs.ext4 /dev/vg/home
    # mkfs.ext4 /dev/vg/opt
    # mkfs.ext4 /dev/vg/var
    # mkfs.ext4 /dev/vg/tmp

パーティションをマウントする
-------------------------

まずはrootパーティションを/mnt/gentoo/ディレクトリにマウントし、そのしたに、ほかのパーティションをマウントするためのディレクトリを作成する。

    # mount /dev/sda3 /mnt/gentoo/
    # mkdir /mnt/gentoo/boot
    # mkdir /mnt/gentoo/usr
    # mkdir /mnt/gentoo/home
    # mkdir /mnt/gentoo/opt
    # mkdir /mnt/gentoo/var
    # mkdir /mnt/gentoo/tmp

root以下に、それぞれのパーティションをマウントする。

    # mount /dev/sda2 /mnt/gentoo/boot
    # mount /dev/vg/usr /mnt/gentoo/usr
    # mount /dev/vg/home /mnt/gentoo/home
    # mount /dev/vg/opt /mnt/gentoo/opt
    # mount /dev/vg/var /mnt/gentoo/var
    # mount /dev/vg/tmp /mnt/gentoo/tmp

### /tmp/のパーミッションを修正する

    # chmod 1777 /mnt/gentoo/tmp

stage3
------

### 時間を合わせる

時間を合わせる。

    # date
    # rc-service ntp-client start
    # date

ハードディスククロックも合わせる。

    # hwclock
    # hwclock --systohc
    # hwclock

### ディレクトリを移動する

    # cd /mnt/gentoo/

### stage3のtarボールをダウンロードする

    # links https://www.gentoo.org/downloads/mirrors/

ミラーサイトを選び。つぎのように、ディレクトリをたどる。

* releases
* amd64
* autobuilds
* current-stage3-amd64

stage3-amd64-201XXXXX.tar.bz2をダウンロードする(最近では\*.tar.bz2ではなく、\*.tar.xz。

### 解凍し展開する

    # tar xvjpf stage3-amd64-201XXXXX.tar.bz2 --xattrs
    (*.tar.xzでは、tar xvJpf stage3-amd64-201XXXXX.tar.xz --xattrs)

### コンパイルオプションを設定する

ファイルmake.confからCFLAGS="..."という行を見つけ、つぎのようにする。

    # vi /mnt/gentoo/etc/portage/make.conf
    ...
    CFLAGS="-march=native -O2 -pipe"
    ...

おなじファイルの末尾に、MAKEOPTSからはじまる、つぎのような行を追加する。

    # vi /mnt/gentoo/etc/portage/make.conf
    MAKEOPTS="-j5"

MAKEOPTSに-j5としたのは、コンパイルを5個並列で行うということ。この数字は、だいたいコア数(スレッド数?) + 1くらいが目安だと言う。今回インストールするマシンは4コア(4スレッド)なので5とする。

/mnt/genoo/ディレクトリ以下の環境にはいる
-------------------------------------

### DNS情報のコピー

    # cp -L /etc/resolv.conf /mnt/gentoo/etc/

### ファイルシステムのマウント

    # mount -t proc proc /mnt/gentoo/proc
    # mount --rbind /sys /mnt/gentoo/sys
    # mount --make-rslave /mnt/gentoo/sys
    # mount --rbind /dev /mnt/gentoo/dev
    # mount --make-rslave /mnt/gentoo/dev

最近では、さらに/run/udevもマウントしておかないと、あとあとのgrub-configにすごい時間がかかる(2時間くらい)。

    # mkdir -p /mnt/gentoo/run/udev
    # mount -o bind /run/udev /mnt/gentoo/run/udev
    # mount --make-rslave /mnt/gentoo/run/udev

### /mnt/gentoo/下の環境にはいる

    # chroot /mnt/gentoo /bin/bash
    # source /etc/profile
    # export PS1="(chroot) $PS1"

インストール作業を進めるための準備
------------------------------

### Portageツリーの取得と更新

    # emerge-webrsync
    # emerge --sync

### プロファイルの選択

つぎのようにして、プロファイルを選択する。今回はdefault/linux/amd64/13.0/desktopを選んだ。これが3番目だったのでset 3とした。

    # eselect profile list
    # eselect profile set 3

### TmuxとVimのインストール

まず、Tmuxをインストールする。そうすると、複数の画面を持てるので、作業がしやすくなる。

    # emerge -av tmux
    # tmux

Ctrl-b "で画面を分割しておこう。分割したそれぞれの領域間の移動はCtrl-b oだ。新しい画面を作るにはCtrl-b cとする。画面間を移動するにはCtrl-b 0やCtrl-b 1のようにする。

いろいろとファイルを編集するので、使いやすいエディタをインストールしておく。

    # USE="-X" emerge -av vim

まだXは入れないのでUSEを-Xとしておく。

### cpuid2cpuflags

    # emerge -av cpuid2cpuflags
    # echo "*/* $(cpuid2cpuflags)" > /etc/portage/package.use/00cpu-flags

### USE変数の設定

    # vi /etc/portage/make.conf
    ...
    USE="...\
            cjk m17n-lib nls unicode git postgres zsh-completion vim-syntax"
    ...

    # vi /etc/portage/make.conf
    ...
    LINGUAS="ja"
    L10N="ja"
    ...

### タイムゾーンの決定

    # ls /usr/share/zoneinfo
    # echo "Japan" > /etc/timezone
    # emerge --config sys-libs/timezone-data

### ロケールの設定

    # vim /etc/locale.gen
    ja_JP.UTF-8 UTF-8
    # locale-gen

    # eselect locale list
    # eselect locale set 3

カーネルの作成
-------------

### カーネルとpciutilsを取得する

    # emerge -av gentoo-sources
    # emerge -av pciutils

### カーネルの設定

カーネルの設定は以下のようにして、設定ツールを立ち上げて、行う。

    # cd /usr/src/linux
    # make menuconfig

#### 走っているカーネルからの設定の入手

走っているカーネルから設定を入手できるようにする。

    General setup --->
        <*> Kernel .config support
            [*] Enable access to .config through /proc/config.gz

一度、設定ツールを、保存終了させる。

#### 有線LANのドライバ

つぎに有線LANのカーネルモジュールを確認する。

    # lspci -k | grep -A 2 -i ethernet
    Kernel driver in use: alx
    # grep -i alx .config
    # CONFIG_ALX is not set

結果がis not setだったので、つぎのように、設定を有効化する。

    # make menuconfig
    Device Drivers --->
        [*] Network driver support --->
            [*] Atheros devices
                .
                .
                <*> Qualcomm Atheros 816x/AR817x support

#### プロセッサファミリー

プロセッサファミリーでCore 2 / newer Xeonを選択する。

    Processor type and features --->
        Processor family (Core 2 / newer Xeon)

#### LVM2

Device mapper supportが有効になっていることを確認する。

    Device Drivers --->
        Multi-device support (RAID and LVM)
            Multiple devices driver support (RAID and LVM)
                <*> Device mapper support

### ビルドとインストール

    # make && make modules_install
    # make install

### initramfsの作成

    # emerge -av genkernel
    # genkernel --install initramfs
    # ls /bool/initramfs*

### LVM2ツールをインストール

    # emerge -av lvm2

パーティションにラベルを設定する
----------------------------

ext4ファイルシステムに対してはe2labelコマンドを使う。

    # e2label /dev/sda2 boot
    # e2label /dev/sda2
    boot
    # e2label /dev/sda3 root
    # e2label /dev/vg/usr usr
    # e2label /dev/vg/home home
    # e2label /dev/vg/opt opt
    # e2label /dev/vg/var var
    # e2label /dev/vg/tmp tmp

swapパーティションにはmkswapを使う。

    # swapoff /dev/sda4
    # mkswap -L swap /dev/sda4
    # swapon LABEL=swap

fstabの設定
----------

    # vi /etc/fstab
    LABEL=root      /            ext4   noatime        0 1
    LABEL=boot      /boot        ext4   noauto,noatime 0 2
    LABEL=usr       /usr         ext4   noatime        0 2
    LABEL=home      /home        ext4   noatime        0 2
    LABEL=opt       /opt         ext4   noatime        0 2
    LABEL=var       /var         ext4   noatime        0 2
    LABEL=tmp       /tmp         ext4   noatime        0 2
    LABEL=swap      none         swap   sw             0 0
    /dev/cdrom      /mnt/cdrom   auto   noauto,ro      0 0

hostnameの設定
-------------

とりあえず、名前はchassisにしておく。

    # vim /etc/conf.d/hostname
    hostname="chassis"

ドメイン名も適当に設定しておく。

    # vim /etc/conf.d/net
    dns_domain_lo="local.hogehoge.jp"

local.hogehoge.jpのところは、適当に置き換えること。

/etc/hostsにも自分の名前を設定しておく。

    # vim /etc/hosts
    127.0.0.1 chassis chassis.local.hogehoge.jp localhost
    ::1 chassis chassis.local.hogehoge.jp chassis

ルートパスワードの設定
-------------------

ルートパスワードを設定する。

    # passwd

いくつかのシステムツールを導入する
------------------------------

metalogを導入する。

    # emerge -av metalog
    # rc-update add metalog default

fcronを導入する。

    # emerge -av fcron
    # rc-update add fcron default
    # crontab /etc/crontab

mlocateを導入する。

    # emerge -av mlocate

DHCPクライアントを導入する。

    # emerge -av dhcpcd

LVM2デーモンを登録
----------------

    # rc-update add lvm boot

ブートローダの設定
----------------

### BIOSの場合

    # emerge -av grub
    # grub-install /dev/sda
    # grub-mkconfig -o /boot/grub/grub.cfg

### UEFIの場合

    # emerge -pv grub
    (GRUB_PLATFORMSのefi-64が有効になっていることを確認)
    # emerge -av grub
    # grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=gentoo_grub /dev/sda
    # mkdir /boot/EFI/boot
    # cp /boot/EFI/gentoo_grub/grubx64.efi /boot/EFI/boot/bootx64.efi
    # grub-mkconfig -o /boot/grub/grub.cfg

再起動
-----

さて、ついに、このときがきた。
うまくいくだろうか。

    # exit
    # exit
    # exit
    # reboot

シャットダウンが終わったところでCDをぬいておくこと。

再起動成功
---------

rootユーザでログインする。まずは、ネットワークの確認。

    # ping hoge.co.jp -c 3

hoge.co.jpのところは適当なアドレス(pingを受けつけてくれる)に置き換えること。

これがうまくいったら、とりあえずtmuxに入っておこう。

    # tmux

OpenRCのログを記録する
--------------------

    # vim /etc/rc.conf
    rc_logger="YES"

こうしておくと、次回からは/var/log/rc.logにログが記録される。

ハイバネーション
--------------

カーネルの設定を確認する。

    # zcat /proc/config.gz | grep -i suspend
    # zcat /proc/config.gz | grep -i hibernation

### サスペンド

作業内容をメモリに保存して、省電力モードに入る。

    # echo mem > /sys/power/state

これでコンピュータの電源が落ちる。再度、電源を入れると中断したところから、はじめられる。

### ハイバネート

作業内容をハードディスクのスワップ領域に保存して電源を切る。ハードディスクへの保存なので、完全に電源を落とすことができる。カーネルにオプションとして、スワップ領域を指定してやる必要がある。

    # vim /etc/default/grub
    ...
    GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda4"
    ...
    # mount boot
    # grub-mkconfig -o /boot/grub/grub.cfg
    # echo disk > /sys/power/state

これで、電源が落ちる。電源スイッチを押して、立ち上げると、中断したところから、はじめられる。

### 電源ボタンでハイバネートする

    # emerge -av acpid
    # rc-update add acpid default
    # rc-service acpid start
    # vim /etc/acpid/default.sh
    ...
            case "$group" in
                    button)
                            case "$action" in
                                    power)
                                            case "$device" in
                                                    PBTN)
                                                            echo disk > /sys/power/state
                                                            ;;
                                            esac
                                            ;;

いろいろと試してから設定したいときは、とりあえず、buttonに反応しないようにしてから、どのボタンでどのイベントが発生するのかを試してみる。

    # vim /etc/acpi/default.sh
    ('power)'という行の次の行の先頭に'#'を追加する)
    # acpi_listen
    (電源ボタンを押す)
    button/power PBTN 00000080 00000000
    button/power LNXPWRBN:00 00000080 00000001
    (電源ボタンをもう1回、押す)
    button/power PBTN 00000080 00000000
    button/power LNXPWRBN:00 00000080 00000002
    (ノートPCなら、ディスプレイを開閉する)
    button/lid LID close
    button/lid LID open

電源ボタンなら、たとえば

* $1: button/power
* $2: PBTN
* $3: 00000080
* $4: 00000000

のようになる。

Vimをデフォルトのエディタにする
---------------------------

    # eselect editor list
    ...
        [3] /usr/bin/vi
    # eselect editor set 3
    # . /etc/profile
    # echo $EDITOR
    /usr/bin/vi

一般ユーザの追加とsudoの導入
-------------------------

ユーザを追加してパスワードを設定する。

    # useradd -m -G users,portage,wheel -s /bin/bash yoshio
    # passwd yoshio

yoshioのところは好きなアカウント名に置き換えること。

このアカウントでログインし直して、そのうえでrootユーザになる。

    # exit
    # exit
    login: yoshio
    passwd: ******
    $ tmux
    $ su
    passwd: ******
    #

sudoを導入する。

    # emerge -av sudo
    # visudo
    %wheel ALL=(ALL) ALL
    # exit
    $ sudo echo hoge
    (使っているアカウントのパスワードを入力する)
    hoge

Zshの導入
--------

使っているアカウントのシェルをZshにする。

    $ sudo emerge -av zsh
    $ sudo vipw
    (使っているアカウントの/bin/bashを/bin/zshに変更する)

ログインし直して、いくつかの設定をする。

    $ exit
    $ exit
    login: yoshio
    passwd: ******
    (zshの設定ツールが起動する)
    履歴の保存を1,000,000個に増やす。
    補完システムはデフォルト設定でonにする。
    指づかいにviを選択。
    パターンマッチの拡張と背景ジョブの終了の即時報告を有効にする。
    保存終了
    % vi .zshrc
    ...
    setopt share_history

プロンプトを設定する。^[はCtrl-V Escで入力する。

    % vi .zshrc
    ...
    PROMPT="%{^[[;32;1m%}[%D{%H:%M}] %#%{^[[m%} "
    PROMPT2="%_> "
    RPROMPT="[%40<...<%~]"

ログインし直す。

    % exit
    login: yoshio
    passwd: ******
    % tmux

Xorgのインストールと設定
----------------------

なんとなく、clangをUSEに追加する。また、INPUT_DEVICESを設定する。

    % sudoedit /etc/portage/make.conf
    USE="...\
            ...\
            clang"
    INPUT_DEVICES="evdev"

グラフィックカードの種類を調べる。

    % /usr/sbin/lspci | grep -i graphics
    ...: Intel ...

たぶんintelで良さそうなので、つぎのようにする。

    % sudoedit /etc/portage/make.conf
    VIDEO_CARDS="intel"

xorgをインストールする。

    % sudo emerge -av xorg-server

77パッケージが導入される。とくにllvmあたりがすごく時間がかかるので、お出かけするか眠るか、家に帰るかするほうがいいと思われる。

ちゃんと動くかどうかテストする。

    % sudo emerge -av twm xterm
    % startx

パッケージのアップデート
---------------------

このあたりで、パッケージを最新のものにアップデートしておこう。

    % sudo emerge -av --deep --newuse @system

125パッケージが更新または新規導入される。しばらく、かかるだろう。

    % sudo emerge -av --deep --newuse @world
    % sudo emerge -av --depclean


念のため、もう一度syncしておく。

    % sudo emerge --sync
    % sudo emerge -av --deep --newuse @system
    % sudo emerge -av --deep --newuse @world

Xmonadの導入
-----------

    % sudo emerge -av xmonad

しばらく時間がかかるので、すこし休憩しよう。

    % vim ~/.xinitrc
    exec xmonad
    % startx

画面がまっ黒になるけれど、あわてずに、Alt + Shift + Enterを押す。すると、ターミナルエミュレータが出る。exitして、Alt + Shift + qでXをぬけよう。

rxvt-unicodeの導入
-----------------

ターミナルエミュレータにはrxvtのユニコード版を使うことにする。

    % emerge -pv rxvt-unicode

可能なUSEフラグのなかから、256-color、wcwidth、unicode3、xftあたりを有効にする。また、そのためには-vanillaとする必要がある。

    % sudoedit /etc/portage/package.use/rxvt-unicode
    x11-terms/rxvt-unicode -vanilla 256-color wcwidth unicode3 xft
    % sudo emerge -av rxvt-unicode

Xmonadのデフォルトのターミナルエミュレータとして登録する。

    % mkdir ~/.xmonad
    % vim ~/.xmonad/xmonad.hs
    import XMonad

    main :: IO ()
    main = do
            xmonad defaultConfig {
                    terminal = "urxvt"
                    }

試してみよう。

    % startx

ここで、Alt + Shift + Enterでターミナルエミュレータを立ち上げて、そこに、つぎのように打ち込む。

    % echo $TERM
    rxvt-unicode-256color
    % exit

問題なければ、Alt + Shift + qでXを終了させる。

画面の色などを設定する。

    % vim ~/.Xdefaults
    urxvt*background: black
    urxvt*foreground: snow
    urxvt*color12: #7799FF

    urxvt*saveLines: 0

もう一度、立ち上げて、チェックする。

    % startx

Alt + Shift + Enterとする。環境が整ったので、ここからは、このターミナル上で作業をする。

    % tmux

日本語入力
---------

日本語入力には僕は、TUT-codeを使っている。uimを使う。

    % emerge -pv uim

とりあえずUSEにxftを追加しておく。このフラグは全体に指定してもいい気もするが、とりあえず、あとで検討しよう。

    % sudoedit /etc/portage/package.use/uim
    app-i18n/uim xft

導入する。

    % sudo emerge -av uim

.xinitrcを編集する。

    % vim .xinitrc
    export XMODIFIERS="@im=uim"
    uim-xim --engine=tutcode &
    exec xmonad

ターミナルエミュレータをぬける。

    % exit
    % exit

Alt + Shift + qで1度Xをぬけてから、もう1度Xを立ち上げる。

    % startx

Alt + Shift + Enterでターミナルエミュレータを立ち上げる。Shift + Spaceで日本語入力ができるようになる。もう1度Shift + Spaceでアルファベット入力にもどる。

混ぜ書き辞書をダウンロードする。

    % curl https://raw.githubusercontent.com/YoshikuniJujo/memos/master/mazegaki.dic > ~/.mazegaki.dic
    % exit

Xに入りなおして、混ぜ書き変換ができることを確認する。

uimの設定をする。

    % uim-pref-gtk

「カーソルのそばに入力モードを表示」とTut-codeの「vi協調モードを有効にする」とを設定。

firefoxを導入
------------

    % emerge -pv firefox

pythonパッケージでUSEにsqliteが必要なようだ。

    % sudoedit /etc/portage/package.use/python
    dev-lang/python sqlite
    % sudo emerge -av firefox

Vimperatorを導入する。

    % firefox

vimperatorを検索して導入する。それから、指づかいを変える。以下の記事にしたがう。

http://qiita.com/YoshikuniJujo/items/67236b619fc4e21dc806

ブラウザ上での文字入力で、vi流で、コマンドモードから入るようにする。

    % vim ~/.vimperatorrc
    set noinsertmode

Xの環境を整える
-------------

dmenuの導入。

    % sudo emerge -av dmenu

これで、ターミナルエミュレータからでなくても、Alt + pをしてからfirefoxと打ち込むことでfirefoxが起動できるようになった。

xmobarの導入

    % emerge -pv xmobar

このあたりでxftをグローバルに設定してしまおう。

    % sudoedit /etc/portage/make.conf
    USE="... \
            ... \
            clang xft"
    % sudo emerge -av xmobar

.xmobarrcを作成。ここではgithubからダウンロードしておく。

    % curl https://raw.githubusercontent.com/YoshikuniJujo/memos/master/xmobarrc > ~/.xmobarrc

xmonad-contribを導入する。

    % sudo emerge -av xmonad-contrib

xmonad.hsの編集。

    % vim ~/.xmonad/xmonad.hs
    import XMonad
    import XMonad.Util.Run (spawnPipe, hPutStrLn)
    import XMonad.Hooks.DynamicLog (dynamicLogWithPP, defaultPP, ppOutput)

    import XMonad.Hooks.ManageDocks (avoidStruts, docks)

    import Control.Concurrent

    myLayout = avoidStruts (tiled ||| Mirror tiled ||| Full) ||| Full
            where tiled = Tall 1 (3 / 100) (1 / 2)

    main :: IO ()
    main = do
            h <- spawnPipe "xmobar"
            threadDelay 100000
            xmonad $ docks defaultConfig {
                    terminal        = "urxvt",
                    layoutHook      = myLayout,
                    logHook         = dynamicLogWithPP $ defaultPP { ppOutput = hPutStrLn h }
                    }

ウィンドウがひとつのときには枠を表示しないようにする。

    % vim .xmonad/xmonad.hs
    (import XMonad.Layout.NoBorders (smartBorders)を追加)
    (layoutHook = myLayout,のmyLayoutの前にsmartBordersを追加)

テザリング(スマホからネットにつなぐ)
-------------------------------

ノートパソコンなどでは、スマホからネットにつなげると便利だ。ここで、その設定をする。

```
% zcat /proc/config.gz | grep -i rndis
# CONFIG_USB_NET_RNDIS_WLAN is not set
% cd /usr/src/linux
% sudo make menuconfig
Device Drivers --->
    [*] Network device support --->
        <*> USB Network Adapters --->
            <*> Multi-purpose USB Networking Framework
                <*> CDC Ethernet support (smart devices ...)
                <*> CDC EEM support
                <*> Host for RNDIS and ActiveSync devices
                <*> Simple USB Network Links (CDC Ethernet subset)
                    [*] Embedded ARM Linux links (iPaq, ...)
% grep -i rndis .config
CONFIG_USB_NET_RNDIS_HOST=y
# CONFIG_USB_NET_RNDIS_WLAN is not set
% sudo make && sudo make modules_install
% sudo mount /boot
% sudo make install
```

再起動する。

```
% zcat /proc/config.gz | grep -i rndis
CONFIG_USB_NET_RNDIS_HOST=y
# CONFIG_USB_NET_RNDIS_WLAN is not set
```

テザリング可能なスマホをUSB接続する。

```
% dmesg | tail
...
[  XXX.XXXXXX] rndis_host: 1-1.2:1.0 enp0s29u1u2: renamed from usb0
```

スマホによっては認識されないものもある。そういうときは、(僕の知識の範囲ではどうしようもないので)別の機種を試す。

```
% ifconfig
enp0s29u1u2: ...
...
enp3s0f1: ...
...
% sudo ifconfig enp3s0f1 down
% ping gentoo.org -c 3
...
```

うまくいっていたら、再起動を試す。有線LANのケーブルを抜いておく。

### 参考にしたページ

[Android USB Tethering - Gentoo Wiki](https://wiki.gentoo.org/wiki/Android_USB_Tethering)

KVMの設定
--------

この、インストールしたOSをホストOSとしてKVMを使ってゲストOSを走らせることにする。

### カーネルを設定する

    % zcat /proc/config.gz | grep -i kvm

    % cd /usr/src/linux
    % sudo make menuconfig
    [*] Virtualization --->
    <*> Kernel-based Virtual Machine (KVM) support
    <*> KVM for Intel processors support
    [*] Audit KVM MMU

    Device Drivers --->
    [*] Network device support --->
    <*> Universal TUN/TAP device driver support

    [*] Networking support --->
    Networking options --->
    <*> 802.1d Ethernet Bridging
    <*> 802.1Q VLAN Support

    % sudo make && sudo make modules_install
    % sudo mount /boot
    % sudo make install
    % exit
    % exit

Alt + Shift + qでXをぬける。

    % sudo reboot

    % zcat /proc/config.gz | grep -i kvm

ちょっと、忘れてたがlsのaliasを設定する。

    % vim ~/.zshrc
    alias ls='ls --color=auto'

### bridgeを設定する

bridge-utilsのインストール。

    % sudo emerge -av bridge-utils

br0を設定する。

    % sudoedit /etc/conf.d/net
    bridge_br0=""
    config_br0="192.168.100.254/24"

sysctl.confを編集する。

    % sudoedit /etc/sysctl.conf
    ...
    #
    # Setup bridge interface for KVM
    #
    net.bridge.bridge-nf-call-arptables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-ip6tables = 0

bridge_forwardを作成する。

    % sudoedit /etc/init.d/bridge_forward
    #!/sbin/openrc-run

    depend() {
            need net.br0
    }

    start() {
            ebegin "Turning on forwarding for bridge interface"
            sysctl net.ipv4.conf.br0.forwarding=1 > /dev/null 2>&1
            sysctl net.ipv4.ip_forward=1 > /dev/null 2>&1
            eend $?
    }

    stop() {
            ebegin "Turning off forwarding for bridge interface"
            sysctl net.ipv4.conf.br0.forwarding=0 > /dev/null 2>&1
            sysctl net.ipv4.ip_forward=0 > /dev/null 2>&1
            eend $?
    }

いろいろとやる。

    % sudo ln -s net.lo /etc/init.d/net.br0
    % sudo brctl addbr br0
    % sudo rc-service net.br0 start
    % sudo rc-update add net.br0 default
    % sudo chmod +x /etc/init.d/bridge_forward
    % sudo rc-service bridge_forward start
    % sudo rc-update add bridge_forward default
    % sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE

### DHCPサーバを設定する

DHCPサーバをインストールする。

    % sudo emerge -av dhcp

設定する。ホストの環境で使っているDNSサーバを調べる。

    % cat /etc/resolv.conf
    nameserver 123.456.789.123
    nameserver 987.654.321.987

結果はそれぞれ異なる。

    % sudoedit /etc/dhcp/dhcp.conf
    subnet 192.168.100.0 netmask 255.255.255.0 {
            option routers 192.168.100.254;
            range 192.168.100.100 192.168.100.199;
    }

    option domain-name-servers 123.456.789.123;

123.456.789.123は実際のアドレスに置き換えること。

DHCPサーバを走らせる。

    % sudo rc-service dhcpd start
    % sudo rc-update add dhcpd default

### KVMを導入する

    % emerge -pv qemu

いくつかのフラグを設定する。

    % sudoedit /etc/portage/make.conf
    USE="... \
            ... \
            clang xft virtfs"
    ...
    QEMU_USER_TARGETS="x86_64"

qemuをインストールする。

    % sudo emerge -av qemu

ネットワークのupとdown用のスクリプトを作成する。

    % vim qemu-ifup
    #!/bin/sh
    sudo ifconfig $1 up
    sudo brctl addif br0 $1
    % vim qemu-ifdown
    sudo brctl delif br0 $1
    sudo ifconfig $1 down
    % chmod +x qemu-ifup qemu-ifdown

VNCビューワーを導入する。

    % sudo emerge -av ssvnc

CD-Rからのブートを試す。インストールCDをCDドライブに挿入してから、つぎのコマンドを実行する。

    % sudo qemu-system-x86_64 -enable-kvm -cdrom /dev/cdrom -boot d -m 2047 -net nic,macaddr=00:00:00:00:00:01,model=e1000 -net tap,ifname=tap0,script=qemu-ifup,downscript=qemu-ifdown -vnc :0 -monitor stdio -vga cirrus

別のウィンドウから

    % ssvncviewer 127.0.0.1:5900

次のように表示されたらEnterキーを押す。

    boot:

しばらくして、プロンプトが表示されたら、pingを試そう。

    # ping some.address.com (pingを許可しているアドレス) -c 3

これでpingが通れば、ネットワークの設定は成功しているということだ。

一度、haltし、再起動して、問題なく動くか確認する
------------------------------------------

    % exit
    % exit

firefoxはZZで終了。Alt + Shift + qでXをぬける。

    % sudo reboot

再帰動したら、

    % sudo ln -s net.lo /etc/init.d/net.enp2s0
    % sudo rc-service net.enp2s0 start
    % sudo rc-update add net.enp2s0 default
    % sudo iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
    % sudo qemu-system-x86_64 -enable-kvm -cdrom /dev/cdrom -boot d -m 2047 -net nic,macaddr=00:00:00:00:00:01,model=e1000 -net tap,ifname=tap0,script=qemu-ifup,downscript=qemu-ifdown -vnc :0 -monitor stdio -vga cirrus
    % ssvncviewer 127.0.0.1:5900

で、立ち上げてpingを試す。

qemuを立ち上げるための権限を設定
-----------------------------

    % sudo vigr
    (使用しているアカウントにkvm, cdromグループを追加する)

一度ログアウトして、ログインしなおす。

    % groups

    % sudo emerge -av usermode-utilities
    % sudo tunctl -u yoshio

    % qemu-system-x86_64 ..
    % ssvncviewer 127.0.0.1:5900

起動時に、いくつかの設定をする
--------------------------

    % sudoedit /etc/local.d/masquerade.start
    iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
    % sudo chmod +x /etc/local.d/masquerade.start
    % sudoedit /etc/local.d/tunctl.start
    tunctl -u yoshio
    % sudo chmod +x /etc/local.d/tunctl.start

再起動して、以下を試す。

    % qemu-system-x86_64 ...
    % ssvncviewer 127.0.0.1:5900

ディスクイメージを作成し、qemuにわたす
----------------------------------

    % qemu-img create -f qcow2 gentoo.img 100G
    % qemu-system-x86_64 ... -hda gentoo.img

ゲストOSのインストール
--------------------

### パーティションの用意

    % parted /dev/sda
    (parted) mklabel gpt
    (parted) unit mib
    (parted) print
    (parted) mkpart grub 1 3
    (parted) set 1 bios_grub on
    (parted) mkpart boot 3 1000
    (parted) set 2 boot on
    (parted) mkpart swap 1000 7000
    (parted) mkpart rootfs 7000 -1
    (parted) print

### Swapパーティション

    # mkswap /dev/sda3
    # swapon /dev/sda3
    # free -h

### ファイルシステムの作成とマウント

    # mkfs.ext4 /dev/sda2
    # mkfs.ext4 /dev/sda4
    # mount /dev/sda4 /mnt/gentoo/
    # mkdir /mnt/gentoo/boot
    # mount /dev/sda2 /mnt/gentoo/boot
    # ls /mnt/gentoo
    # ls /mnt/gentoo/boot

### 日付けと時刻の確認

    # date
    # rc-service ntp-client start
    # date

    # hwclock
    # hwclock --systohc
    # hwclock

### Stage3

ディレクトリを移動する。

    # cd /mnt/gentoo/

つぎのようにGentooのミラーにアクセスする。

    # links https://www.gentoo.org/downloads/mirrors/#JP

ここからミラーサイトを選び、つぎのようにディレクトリをたどる。

* releases
* amd64
* autobuilds
* current-stage3-amd64

つぎのファイルをダウンロードする。

    stage3-amd64-201XXXXX.tar.bz2

解凍して設置する。

    # tar xvjpf stage3-amd64-201XXXXX.tar.bz2 --xattrs

コンパイルオプションを設定する。

    # vi /mnt/gentoo/etc/portage/make.conf
    CFLAGS="-march=native -O2 -pipe"
    ...
    MAKEOPTS="-j2"

### 新しいシステムに入る

必要なディレクトリをマウントする。

    # cp -L /etc/resolv.conf /mnt/gentoo/etc/
    # mount -t proc proc /mnt/gentoo/proc
    # mount --rbind /sys /mnt/gentoo/sys
    # mount --make-rslave /mnt/gentoo/sys
    # mount --rbind /dev /mnt/gentoo/dev
    # mount --make-rslave /mnt/gentoo/dev

最近では、さらに、つぎのディレクトリもマウントする必要がある。

    # mkdir -p /mnt/gentoo/run/udev
    # mount -o bind /run/udev /mnt/gentoo/run/udev
    # mount --make-rslave /mnt/gentoo/run/udev

新しいシステムに入る。

    # chroot /mnt/gentoo/ /bin/bash
    # source /etc/profile
    # export PS1="(chroot) $PS1"

### Portage木の取得

    # emerge-webrsync
    # emerge --sync
    # eselect profile list
    # eselect profile set 3

### USEフラグの設定など

TmuxとVimをインストールする。

    # emerge -av tmux
    # emerge -pv vim
    # USE="-X" emerge -av vim

CPUフラグを設定する。

    # emerge -av cpuid2cpuflags
    # cpuinfo2cpuflags-x86
    # cpuinfo2cpuflags-x86 >> /etc/portage/make.conf

USEフラグを設定する。

    # vim /etc/portage/make.conf
    USE="bindist \
            nsplugin xft vim-syntax cjk m17n-lib nls unicode git postgres \
            zsh-complition"

タイムゾーンとロケールを設定する。

    # date
    # echo "Japan" > /etc/timezone
    # emerge --config sys-libs/timezone-data
    # date

    # vim /etc/locale.gen
    ja_JP.UTF-8 UTF-8
    # locale-gen
    # eselect locale list
    # eselect locale set 3

### カーネルを作成する

    # emerge -av gentoo-sources
    # emerge -av pciutils
    # cd /usr/src/linux
    # make menuconfig

一度、保存終了する。

    # lspci -k | grep -A 2 -i ethernet
    ...
            Kernel driver in use: e1000
    # grep -i e1000 .config
    CONFIG_E1000=y

Processor familyは、とりあえずデフォルトのGeneric-x86-64としておく。ここは、そのうちに、ちゃんと調べたい。

    # make menuconfig
    [*] Networking support --->
            <*> Plan 9 Resource Sharing Support (9P2000) --->
    # grep -i p9 . config
    CONFIG_NET_9P=y
    # make menuconfig
    File system --->
            [*] Network File Systems --->
                    <*> Plan 9 Resource Sharing Support (9P2000)
                            [*] 9P POSIX Access Control Lists
    Device Drivers --->
            [*] Virtualization drivers
                    Virtio drivers --->
                            <*> PCI driver for virtio devices
                                    [*] Support for legacy virtio draft 0.9.X and older devices
    [*] Networking support --->
            <*> Plan 9 Resource Sharing Support (9P2000) --->
                    <*> 9P Virtio Transport
    # grep -i 9p .config
    CONFIG_NET_9P=y
    CONFIG_NET_9P_VIRTIO=y
    CONFIG_9P_FS=y
    CONFIG_9P_FS_POSIX_ACL=y

ビルドしてインストールする。

    # make && make modules_install
    # make install

initramfsを作成する。

    # emerge -av genkernel
    # ls /boot
    # genkernel --install initramfs
    # ls /boot

### fstabを作成する

    # e2label /dev/sda2 boot
    # e2label /dev/sda4 root
    # e2label /dev/sda2
    boot
    # e2label /dev/sda4
    root
    # swapoff /dev/sda3
    # mkswap -L swap /dev/sda3
    # swapon LABEL=swap
    # free -h
    # vim /etc/fstab
    LABEL=boot        /boot       ext4    noauto,noatime  1 2
    LABEL=root        /           ext4      noatime         0 1
    LABEL=swap        none        swap      sw              0 0
    /dev/cdrom        /mnt/cdrom  auto      noauto,ro       0 0

### ホスト名などを設定する

    # vim /etc/conf.d/hostname
    hostname="gentoo_2017"
    # vim /etc/conf.d/net
    dns_domain_lo="local.hogehoge.jp"
    # vim /etc/hosts
    127.0.0.1    gentoo_2017 gentoo_2017.local.iocikun.jp localhost
    ::1          gentoo_2017 gentoo_2017.local.iocikun.jp localhost

### ルートパスワードの設定

    # passwd

### システムツールを導入

    # emerge -av metalog
    # rc-update add metalog default

    # emerge -av fcron
    # rc-update add fcron default
    # crontab /etc/crontab

    # emerge -av mlocate
    # emerge -av dhcpcd

### ブートローダを導入

    # emerge -av grub
    # grub-install /dev/sda
    # grub-mkconfig -o /boot/grub/grub.cfg

### 再起動する

    # exit
    # exit
    # halt

ゲスト側で

    パスワード: ****
    # qemu-system-x86_64 -enable-kvm -cdrom /dev/cdrom -boot c -m 2047 -net nic,macaddr=00:00:00:00:00:01,model=e1000 -net tap,ifname=tap0,script=qemu-ifup,downscript=qemu-ifdown -vnc :0 -monitor stdio -vga cirrus -fsdev local,id=hoge,path=/home/tatsuya/hoge,security_model=mappend -device virtio-9p-pci,fsdev=hoge,mount_tag=v_hoge -hda gentoo.img

### ローカライズのためのフラグを設定

    # vim /etc/portage/make.conf
    LINGUAS="ja"
    L10N="ja"

...

virtfsでディレクトリの共有ができるかどうか試す
-----------------------------------------

(virtfsだと、不具合があったので、NFSを使うことにした)

    # mkdir /mnt/free
    # chmod 0700 /mnt/free
    # mount -t 9p -o trans=virtio v_hoge /mnt/free
    # touch /mnt/free/hogera

NFSでディレクトリの共有ができるかどうか試す
---------------------------------

つぎのページを参考にする。

[Gentoo: nfs-utils](https://wiki.gentoo.org/wiki/Nfs-utils)

ハードディスクの暗号化と、そのマウント
---------------------------------

さきに、まちがえて消さないようにgentoo.imgをバックアップしておこう。同じハードディスク内なので、故障などへの防御にはならないが、ケアレスミスへの防御にはなる。実は、リスクとしては、これが一番大きい。

まずはLVM上の論理パーティションを拡大する。

    % sudo lvextend -L +10G /dev/mapper/vg-home
    % sudo resize2fs /dev/mapper/vg-home

コピーしておこう。

    % mkdir backup
    % cp gentoo.img backup/
    % md5sum gentoo.img
    c7c1a7f36d027db6a8982ee453e27131 gentoo.img
    % md5sum backup/gentoo.img
    c7c1a7f36d027db6a8982ee453e27131 backup/gentoo.img

ntfsファイルシステムをマウントできるようにする
-----------------------------------------

    % zcat /proc/config.gz | grep -i ntfs
    # CONFIG_NTFS_FS is not set
    % sudo make menuconfig
    File systems --->
            DOS/FAT/NT Filesystems --->
                    <*> NTFS file system support
                            [*] NTFS write support
    % sudo mount /boot
    % sudo make && sudo make modules_install
    % sudo make install
    % exit
    % exit

Xを落として、再起動する。

    % zcat /proc/config.gz | grep -i ntfs
    CONFIG_NTFS_FS=y
    # CONFIG_NTFS_DEBUG is not set
    CONFIG_NTFS_RW=y
    % sudo mount /dev/sdb1 /mnt/free

ハードディスクイメージを暗号化したディスクにコピーする
------------------------------------------------

### cryptsetupとpartedを導入する

    % sudo emerge -av cryptsetup
    % sudo emerge -av parted

### ハードディスクのパーティションを切る

    % sudo parted /dev/sdb
    (parted) mklabel gpt
    (parted) unit gb
    (parted) mkpart pass1 1 250
    (parted) mkpart pass2 250 -1
    (parted) print
    (parted) quit

### カーネルの設定

    % zcat /proc/config.gz | grep -i dm_crypt
    # CONFIG_DM_CRYPT is not set
    % cd /usr/src/linux
    % sudo make menuconfig
    Device Drivers --->
            [*] Multiple device driver support (RAID and LVM) --->
                    <*> Crypt target support
    Cryptgraphic API --->
            <*> XTS support
    % sudo mount /boot
    % sudo make && sudo make modules_install
    % sudo make install
    % exit
    % exit

再起動する。

    % zcat /proc/config.gz | grep -i dm_crypt
    CONFIG_DM_CRYPT=y
    % sudo cryptsetup luksFormat /dev/sdb1
    % sudo cryptsetup luksOpen /dev/sdb1 pass1
    % sudo mkfs.ext4 /dev/mapper/pass1
    % sudo mount /dev/mapper/pass1 /mnt/free
    % ls /mnt/free
    lost+found
    % sudo e2label /dev/mapper/pass1 pass1
    % sudo e2label /dev/mapper/pass1
    % sudoedit /etc/fstab
    LABEL=pass1    /mnt/pass1    ext4     noauto,noatime 0 2
    % sudo umount /mnt/free
    % sudo mkdir /mnt/pass1
    % sudo chmod 0700 /mnt/pass1
    % sudo mount /mnt/pass1
    % sudo mkdir /mnt/pass1/tatsuya
    % sudo chown tatsuya:tatsuya /mnt/pass1/tatsuya
    % ln -s /mnt/pass1/tatsuya pass1
    % mkdir pass1/guests
    % cp gentoo.img pass1/guests

ホストOS側をすこし整える
---------------------

    % sudo cp qemu-ifup /etc
    % sudo cp qemu-ifdown /etc

ゲストOSを試してみる。

    % qemu-system-x86_64 -enable-kvm -cdrom /dev/cdrom -boot c -m 2047 -net nic,macaddr=00:00:00:00:00:01,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :0 -monitor stdio -vga cirrus -fsdev local,id=hoge,path=/home/tatsuya/hoge,security_model=mapped -device virtio-9p-pci,fsdev=hoge,mount_tag=v_hoge -hda ~/pass1/guests/gentoo.img

    % qemu-system-x86_64 ...(上のコマンドのhogeをpass1に置き換える)
    % echo 'qemu-system-x86_64 ...' > ~/pass1/guests/run_gentoo.sh
    % chmod +x ~/pass1/guests/run_gentoo.sh
    % vim ~/pass1/guests/run_gentoo.sh
    (先頭に#!/bin/shを追加)

ゲストOSの環境を整える
--------------------

    % ~/pass1/guets/run_gentoo.sh
    % ssvnc 127.0.0.1:5900 -scale 1.1
    (rootアカウントでゲストOSにログインする)
    # tmux

### ハイバネーションの設定

    # blkid /dev/sda3
    # vim /etc/default/grub
    GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda3"
    # mount /boot
    # grub-mkconfig -o /boot/grub/grub.cfg
    # echo disk > /sys/power/state

これでゲストOSが終了する。ホストOSから

    % ~/pass1/guests/run_gentoo.sh
    % ssvnc 127.0.0.1:5900 -scale 1.1

中断したところに復帰する。

### 一般ユーザの追加とsudoの導入

    # useradd -m -G users,portage,wheel -s /bin/bash yoshio
    # passwd yoshio

ログアウトして、一般ユーザでログインしなおす。

    $ tmux
    $ su
    # emerge -av sudo
    # eselect editor list
    # eselect editor set 3
    # . /etc/profile
    # visudo
    %wheel ALL=(ALL) ALL
    # exit
    $ sudo echo hoge
    hoge

### 一般ユーザでのハイバネート

    $ echo disk | sudo tee /sys/power/state
    $ . /etc/profile
    $ sudoedit /usr/local/bin/hibernate
    #!/bin/sh
    echo disk | sudo tee /sys/power/state
    $ sudo chmod +x ls /usr/local/bin/hibernate
    $ hibernate

### Zshの導入

    $ sudo emerge -av zsh
    $ sudo vipw
    (使っているアカウントのbashをzshに)

ログインしなおすと、zshの設定ツールが起動するので、履歴の保存を1,000,000にして、補完をデフォルトで設定し、vi流のキーバインドにして、拡張パターンマッチと背景ジョブの終了のリアルタイムでの通知を有効にする。

    % vim .zshrc
    setopt share_history

プロンプトを設定する。

    % vim .zshrc
    PROMPT="%{^[[;32;1m%}[%D{%H:%M}] %#%{^[[m%} "
    PROMPT2="%_> "
    RPROMPT="[%40<...<%~]"

ログインしなおす。

### Tmuxの設定

    % vim ~/.tmux.conf
    set-window-option -g mode-keys vi

    bind-key j resize-pane -D
    bind-key k resize-pane -U
    bind-key J resize-pane -D 8
    bind-key K resize-pane -U 8
    bind-key O select-pane -U
    % tmux

### Xを導入する

Xorgを導入する。

    % sudoedit /etc/portage/make.conf
    USE="... \
            ... \
            zsh-completion clang llvm"
    ...
    INPUT_DEVICES="evdev"
    VIDEO_CARDS="cirrus"
    % sudo emerge -av xorg-server twm xterm xclock
    % exit
    % exit
    % startx

### システムのアップデート

    % sudo emerge -avu --deep @system
    % sudo emerge -avu --deep --newuse @system
    % sudo emerge -avu --deep --newuse @world
    % sudo emerge -av --depclean
    % sudo emerge --sync
    % sudo emerge -avu --deep --newuse @system
    % sudo emerge -avu --deep --newuse @world

### Xmonadの導入

さきにホスト側のキーバインドを変更しておく。まずはxmodmapパッケージを導入する。

    % sudo emerge -av xmodmap

いくつかのファイルを作成/編集する。

    % vim .Xmodmap
    keycode 102 = Meta_L
    keycode 100 = Meta_R

    remove mod1 = Meta_L
    remove mod1 = Alt_L
    remove mod1 = Alt_R

    add mod3 = Meta_R
    add mod3 = Meta_L
    remove mod3 = Alt_L
    remove mod3 = Alt_R
    add mod1 = Alt_L
    add mod1 = Alt_R
    % vim .xmonad/xmonad.hs
    ...
    xmonad defaultConfig {
            ...
            modMask    = mod3Mask
            }
    % vim .xinitrc
    export XMODIFIERS="@im=uim"
    uim-xim --engine=tutcode &
    xmodmap .Xmodmap
    exec xmonad

ゲストを中断する。

    % hibernate

Xを落として、また入りなおす。AltではなくCmdでXmonad上のいろいろな操作ができることを確認する。

ゲスト側にもどる。ホスト側で、つぎのようにする。

    % ~/pass1/guests/run_gentoo.sh
    % ssvncviewer 127.0.0.1:5900 -scale 1.1

ゲストでxmonadを導入する。

    % sudo emerge -av xmonad
    % vim .xinitrc
    exec xmonad
    % exit
    % exit
    % startx

Alt + Shift + Enterでターミナルを立ち上げる。

    % exit

Alt + Shift + qでXを落とす。

    % emerge -pv rxvt-unicode
    % sudoedit /etc/portage/package.use/rxvt-unicode
    x11-terms/rxvt-unicode -vanilla 256-color unicode3 wcwidth
    % sudo emerge -av rxvt-unicode
    % vim .Xdefaults
    urxvt*background: black
    urxvt*foreground: snow
    urxvt*color12: #7799FF

    urxvt*saveLines: 0
    % vim .zshrc
    ...
    alias ls='ls --color=auto'
    alias grep='grep --color=auto'
    % vim .xmonad/xmonad.hs
    import XMonad

    main :: IO ()
    main = do
            xmonad defaultConfig {
                    terminal        = "urxvt"
                    }
    % startx

### firefoxの導入

    % emerge -pv firefox
    % sudoedit /etc/portage/package.use/python
    dev-lang/python sqlite
    % sudo emerge -av firefox

### 問題発生、virtfsはシムリンクを指定するとダメ?

ゲストでつぎのようにコマンドを入力したところ、プロンプトがかえってこなくなった。

    % sudo mount -t 9p -o trans=virtio v_pass1 /mnt/free

どうやら、virtfsではシムリンクを指定してはダメなようだ。run_gentoo.shを書き換える。ホストで、

    % vim ~/pass1/guests/run_gentoo.sh
    qemu-system-x86_64 ...
    (/home/tatsuya/pass1のところを/mnt/pass1/tatsuyaとする)

ゲストOSをシャットダウンして、再度立ち上げる。ログインして、

    % sudo mount -t 9p -o trans=virtio v_pass /mnt/free
    % ls /mnt/free

### 日本語入力

    % sudo emerge -av uim
    % vim .xinitrc
    export XMODIFIERS="@im=uim"
    uim-xim --engine=tutcode &
    exec xmonad
    % uim-pref-gtk

TUT-codeのvi協調モード、入力モードをカーソルの近くに表示するなど。

ホスト側で

    % mkdir pass1/tmp
    % cp .mazegaki.dic pass1/tmp/

ゲスト側で

    % cp ~/pass1/tmp/.mazegaki.dic ~/

一度Xをぬけて再度入る。

    % startx

Shift + Spaceで日本語入力、漢字入力ができることを確認する。

### vimperatorを導入

    % firefox

vimperatorで検索しアドオンを入れる。

    % vim .vimperatorrc
    (あとで書く)

### dmenuを導入

    % sudo emerge -av dmenu

### xmobarを導入する

    % sudo emerge -av xmobar

### 問題発生。virtfs?

virtfsでマウントしているディレクトリにアクセスしようとしたらフリーズした。

security=mappedをnoneにして試してみようか?

    % vim ~/pass1/guests/run_gentoo.sh
    (mappedをnoneにした)

### hibernateをパスワードなしで

    % sudo visudo
    yoshio ALL=(ALL) NOPASSWD: /usr/local/bin/hibernate

### xmobarを導入(続き)

ホストで

    % cp ~/.xmobarrc ~/pass1/tmp/

ゲストで

    % sudo emerge -av xmonad-contrib
    % vim .xmonad/xmonad.hs
    import XMonad
    import XMonad.Util.Run (spawnPipe, hPutStrLn)
    import XMonad.Hooks.DynamicLog (dynamicLogWithPP, defaultPP, ppOutput)

    import XMonad.Hooks.ManageDocks (avoidStruts)
    import XMonad.Layout.NoBorders (smartBorders)

    import Control.Concurrent

    myLayout = avoidStruts (tiled ||| Mirror tiled ||| Full) ||| Full
            where tiled = Tall 1 (3 / 100) (1 / 2)

    main :: IO ()
    main = do
            h <- spawnPipe "xmobar"
            threadDelay 500000
            xmonad defaultConfig {
                    terminal        = "urxvt"
                    layouthook      = smartBorders myLayout,
                    logHook         = dynamicLogWithPP { ppOutput = hPutStrLn h }
                    }

### Muttの導入と設定

まずは、ハードディスクをマウントする場所を決める。

    % sudoedit /etc/fstab
    v_pass1    /home/yoshio/pass1    9p    trans=virtio    0 0
    % sudo umount /mnt/free
    % sudo mount /home/yoshio/pass1

一度シャットダウンして立ち上げなおして、自動でマウントされることを確認する。

#### ツールをインストールする

    % sudoedit /etc/portage/package.use/mutt
    mail-client/mutt gpg imap mbox smtp
    % sudo emerge -av mutt
    % sudoedit /etc/portage/package.use/procmail
    mail-filter/procmail mbox
    % sudo emerge -av fetchmail msmtp procmail

    % vim ~/.fetchmailrc
    (あとで書く)
    % fetchmail -akv -m "/usr/bin/procmail -d %T"
    % vim .procmailrc
    (あとで書く)
    % fetchmail -akv -m "/usr/bin/procmail -d %T"
    % vim ~/.muttrc
    (あとで書く)
    % sudo emerge -av w3m
    % vim ~/.mailcap
    (あとで書く)

#### 古いメールなどを取り込む

backupディレクトリを作成する。ホストで

    % mkdir backup
    % mkdir backup/git
    % vim pass1/guests/run_gentoo.sh
    (あとで書く)

ゲストを再起動する。

    % sudoedit /etc/fstab
    (あとで書く)
    % sudoedit ~/.msmtprc
    (あとで書く)

    % sudo emerge -av urlview

### SSHの設定

    % cp .../id_rsa ~/.ssh/
    % cp .../id_rsa.pub ~/.ssh/

### firefoxでPDFを表示する

とくに何もする必要もなかった。

### firefoxのダウンロードディレクトリの変更

ダウンロードディレクトリを"ダウンロード"から"download"にする。

### HaskellのStackを導入する

    % sudoedit /etc/portage/package.use/ncurses
    sys-libs/ncurses tinfo
    % sudo emerge -av ncurses
    % curl -sSL https://get.haskellstack.org/ | sh
    % vim ~/.zshrc
    ...
    path=($HOME/.local/bin(N-/) $path)
    % stack setup

### yesodでプロジェクトを作成する

    % cd
    % mkdir yesod
    % cd yesod
    % stack new testProject yesod-simple
    % cd testProject
    % stack install yesod-bin cabal-install --install-ghc
    % stack build
    % stack exec -- yesod devel

ブラウザでhttp://localhost:3000 に接続するとYesodのデフォルトのページが見られる。

### keterにまとめる

    % vi config/keter.yml
    user-edited: true
    ...
    hosts:
      ...
      - www.hogehoge.jp
    ...
    # Static files.
    - type: static-files
      hosts:
        - www.hogehoge.jp

    % stack exec -- yesod keter

**!!ここまでやった!!**

### さくらのVPSでketerでまとめたWebアプリを公開してみる