xhyve で mikutter

xhyve 用の仮想マシンFreeBSD インストールして mikutter 使えるようにした日記 (結構前にやったから記憶があやふやかも) (というか酒飲みながら書いてるので余計あやふや)

環境

xhyve のインストール

% brew install xhyve

で多分おっけー

FreeBSD のインストール

適当なディレクトリを用意する (僕は $HOME/.xhyve/FreeBSD/ を作った)

% mkfile 16g storage.img

で 16GB の仮想マシン用ファイルを用意 (ddコマンド使ってもなんでもいいしサイズも適当でいい)

FreeBSD の公式サイトから最新の bootonly とかの iso をダウンロードしてくる

% uuidgen > uuid

とかして UUID を用意しておく

% mkdir boot
% ln -s /usr/local/share/xhyve/test/userboot.so boot/userboot.so

のようにして /usr/local/share/xhyve/test/userboot.so をとりあえず近くに持ってきた (あとで FreeBSD から userboot.so 持ってくるかもな〜的な)

#!/usr/bin/env bash

DIR=$(dirname $0)
ISO=$DIR/FreeBSD-11.2-RELEASE-amd64-bootonly.iso
STORAGE=$DIR/storage.img
USERBOOT=$DIR/boot/userboot.so
BOOTVOLUME=$ISO

UUID=$(cat "$DIR/uuid")

MEM=2G
SMP=2
PCI=0:0,hostbridge
NET=2:0,virtio-net
IMG=3:0,ahci-cd,$ISO
HDD=4:0,virtio-blk,$STORAGE
LPC=31:0,lpc
DEV=com1,stdio

KERNELENV=""

xhyve -A -U $UUID \
  -c $SMP \
  -m $MEM \
  -s $PCI \
  -s $NET \
  -s $IMG \
  -s $HDD \
  -s $LPC \
  -l $DEV \
  -f fbsd,$USERBOOT,$BOOTVOLUME,"$KERNELENV"

のようなスクリプト (僕は isoboot って名付けました) を用意して sudo で立ち上げ、いつものようにインストール

ifconfig で IP アドレスを控えておくのと sshd 有効にしておくことは一応やっておく (後で X11 Forwarding したいので)

UUID を固定しているので dhcp 云々でも IP アドレスは固定されるらしい (わからん)

インスコその他が終わったら

#!/usr/bin/env bash

usage() {
    cat << EOS >&2
Usage: $(basename $0) [-h,--help] [-s, --stdio]
  Up the VM.
Options:
  -s,--stdio    Run the VM, connecting console to STDIO.
  -h,--help     Show this message and exit.
EOS
    exit 1
}

DIR=$(dirname $0)
STORAGE=$DIR/storage.img
USERBOOT=$DIR/boot/userboot.so
BOOTVOLUME=$STORAGE

UUID=$(cat $DIR/uuid)

SMP=2
MEM=2048
PCI=0:0,hostbridge
NET=2:0,virtio-net
HDD=4:0,virtio-blk,$STORAGE
LPC=31:0,lpc
DEV=com1,stdio

KERNELENV=""

for opt in $@; do
    case $opt in
        '--stdio'|'-s')
            SIO=1
            ;;
        '--help'|'-h')
            usage
            ;;
    esac
done

if [[ -n $SIO ]] ; then
    xhyve -A -U $UUID \
          -c $SMP \
          -m $MEM \
          -s $PCI \
          -s $NET \
          -s $HDD \
          -s $LPC \
          -l $DEV \
          -f fbsd,$USERBOOT,$BOOTVOLUME,"$KERNELENV"
else
    xhyve -A -U $UUID \
          -c $SMP \
          -m $MEM \
          -s $PCI \
          -s $NET \
          -s $HDD \
          -f fbsd,$USERBOOT,$BOOTVOLUME,"$KERNELENV" > /dev/null 2>&1 &
fi

のようなスクリプト (これは up って名前にした) を用意して sudo ./up --stdio で標準入出力をどうたらで仮想マシンを立ち上げられるようになりました

この時点でのディレクトリの中身はこんな感じ

% tree -l
.
├── FreeBSD-11.2-RELEASE-amd64-bootonly.iso
├── boot
│   └── userboot.so -> /usr/local/share/xhyve/test/userboot.so
├── isoboot
├── storage.img
├── up
└── uuid

1 directory, 6 files

VM 内での準備

まず下準備として VM 内で

% sudo pkg install xauth git ruby devel/ruby-gems libidn

しておきます (xauthX11 Forwarding のために必要だったはず)

そして mikutter のインストール

% sudo gem install rake bundler
% git clone git://toshia.dip.jp/mikutter
% cd mikutter
% git checkout develop
% bundle install --path vendor/bundle

怒られたらググって解決します

完全に好みなんですがこの後 mikutterディレクトリを /opt/ に移しました

日本語環境

ここからは GUI 使うかもなので X11 Forwarding 云々でログインしてる前提です

% sudo pkg install ja-fcitx-mozc zh-fcitx-configtool
% sudo pkg install ja-font-migu ubuntu-font

fcitx-mozc とフォントを用意しておく (フォント云々はお好みで)

で 一回ログアウトしてもう一回ログイン

そしたら

% fcitx-config-gtk

して

fcitx を適当にこういう風にいい感じに設定しておく

f:id:d_flat_aug7:20181023033610p:plain

そして ~/.zshrc やらの *rc

#X11 forwarding: IM config

if [[ -z $FCITX_ENABLED ]] ; then
    if [[ -n $DISPLAY ]] && [[ -n $SSH_CLIENT ]] ; then
        export GTK_IM_MODULE=fcitx
        export QT_IM_MODULE=xim
        export XMODIFIERS=@im=fcitx

        mozc start > /dev/null 2>&1
        fcitx -r -d > /dev/null 2>&1

        export FCITX_ENABLED=1
    fi
fi

みたいなのを追記しておく

ついでに FreeBSD ではデフォルトで $HOME/bin にパスが通ってるので

#!/usr/local/bin/bash

LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
/opt/mikutter/mikutter.rb $@

こういうのを $HOME/bin/mikutter として用意しておく (僕はロケールen_US.UTF-8 にしてあるので)

終わったら再ログインなりなんなりして mikutter で起動するかどうか確認しておきます (ログイン時に fcitx 起動してなかったら fcitx -r -d しましょう)

その他

上で書いた up はデフォルトではバックグラウンド起動的な感じで ssh でログイン前提です

これから困るぞ〜ってときのために --stdio 用意してる的な (bash の簡単なオプション解析書く練習だったんだけど)

Gtk のテーマとかフォントとかの設定したいなら lxappearance とかインストールして設定するといいと思います (僕はさらに bzrbzr branch lp:ubuntu-themes して ubuntu のテーマ持ってきたりしてます) (ubuntu のテーマ綺麗じゃないですか?)

mikutter -d で mikutter は daemon で起動します

おわりに

さわやかておくれライフ!