Archlinux の Vagrant Box (VirtualBox) を一から作る

目的

作業

仮想マシンの作成

Virtualbox仮想マシンを作成する。

  • 名前は vagrant-archlinux
  • メモリは 256MB
  • ディスクは VDI で約 40GB
  • 接続には NAT

ArchLinux のインストール

ここからイメージを落としてくる。 マウントし、起動。

  • パーティションは分けない。 swap もめんどいからなし
  • ホスト名は vagrant-archlinux
  • /etc/localtime/usr/share/zoneinfo/UTC
  • passwd: vagrant
  • その他 Installation guide - ArchWiki に書かれている普通の手順を踏む

ここで再起動し、ハードディスクから起動し直す

  • ネットワークは dhcpcd で設定
  • # useradd -m -G wheel -s /bin/bash vagrant; passwd vagrant する。パスワードはvagrant
  • sudo を設定する
    • %wheel ALL=(ALL) NOPASSWD: ALL を uncomment
    • Defaults env_keep += "SSH_AUTH_SOCK" という行を加える
  • ここを見つつ、 virtualbox-guest-utils をインストールする
  • ruby, rubygems, puppet, openssh をインストールする。 sudo gem install chef する。
  • ssh鍵を https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub からコピーし、 /home/vagrant/.ssh/authorized_keys に置く。 chmod 700 /home/vagrant/.ssh をついでにする。
  • /etc/ssh/sshd_configUseDNS no を追記する
  • sshd を立てる

マシンを終了する。

box の作成

$ vagrant package --base vagrant-archlinux

仮想マシンの名前を使って package を実行する。

この時点で、 .box のサイズは 545M だった。 大きすぎるので、 WEB の情報も参考にサイズを減らすことを試した。

サイズを縮める

  • パッケージのキャッシュを削除する。 pacman -Scc
  • gem install chef に必要だった gcc と make を削除。 pacman -Rs gcc make
  • ディスクの空き部分をゼロで埋める? dd if=/dev/zero of=/empty bs=1M; rm /empty

結果

サイズは 288M になった。

縮める前に比べれば予想以上に減った。ここまで減ったのはゼロで埋めたのが大きいのかも? もしかしたら既存の http://www.vagrantbox.es/ のものもゼロで埋めるだけで減るかも??

一番初めの考えではもっと小さくなると思っていたけれど、最終的には 300M 程度になった。 virtualbox-guest-utils の依存で xorg 系のパッケージが軒並み入ったりしてそれが容量を増やしているような印象を受けたけど、正直分からない。

参考

Cygwin のパッケージを管理する pac-cyg

作りました。

10sr/pac-cyg

apt-cyg の fork です。 apt-cyg のコマンドオプションが長くて面倒だったので、 Arch Linuxpacman に似たオプションを使えるようにしました。その他少しリファクタリングをしたりしました。

インストール

現在まともなインストール方法はありません。 ここ からダウンロードしてパスの通った場所において chmod +x してください。

かんたんな使い方

パッケージをインストールするには、

$ pac-cyg -S tmux

します。

$ pac-cyg -R tmux

でパッケージを削除します。また、

$ pac-cyg -Q

でインストールされたパッケージのリストが見られたりします。

その他、パッケージの検索、ファイルからのパッケージの逆引きができたりします。 詳しくは、 README.md を参照するか pac-cyg -h, pac-cyg -Sh とかしてみてください。

USB メモリにインストールした Arch Linux を別のへコピーする

目的

元々ある USB メモリにインストールしてあった Arch Linux を別の USB にブート可能な形で移動する。 コピー先の方が容量が小さいので、 dd は使えない気がする(?)。

登場人物

UUID を知るには lsblk -f, サイズを知るには lsblk -m

  • コピー元USBメモリ : sdc

    • 名前 マウントポイント, フォーマット, UUID, サイズ
    • sdc1 /boot, ext2, d3e1cf..., 100M
    • sdc2 /, ext4, baa04a..., 7.5G
  • コピー先 : sdb

    • sdb1: , fvat, 226A-xxxx, 3.8G

    全削除する

方針

  1. sdb を普通インストールするときと同じようにパーティション分けする
  2. 両方を mount し、 rsync か何かを使って全パーティションをコピーする
  3. /boot 以下のファイル、 /etc/fstab でディスクの UUID を新しいものに書き換える

ログ

  1. パーティション分け、フォーマット

     # gdisk /dev/sdb
    

    o で新たにパーティションテーブルを作り、 n でパーティションを作る。 先頭から 100M とそれ以外の全部に分ける。 あと一応 c でラベルをつけておく (Boot_ArchLinux, Root_ArchLinux)。 w で書き込んで終了。

     # mkfs.ext2 /dev/sdb1
     # mkfs.ext4 /dev/sdb2
    
  2. ファイルのコピー

     # mkdir usbcp && cd usbcp
     # mkdir src
     # mkdir dst
     # mount /dev/sdc1 src
     # mount /dev/sdb1 dst
     # rsync -aAXv src/ dst
     ## 動いてるシステムのコピーじゃないので exclude は不要
     # umount src dst
    
     # mount /dev/sdc2 src
     # mount /dev/sdb2 dst
     # rsync -aAXv src/ dst
     # umount src dst
    
  3. ファイルの書き換え

     # mount /dev/sdb2 dst
     # vi dst/etc/fstab
     ## UUIDを書き換える
     # umount dst
    
  4. ブートローダのインストール

     # mount /dev/sdb2 /mnt
     # mount /dev/sdb1 /mnt/boot
     # arch-chroot /mnt
     # syslinux-install_update -i -a -m
     # exit
     # umount -R /mnt
    

参考

Arch Linux インストール後の MacBook 固有っぽい設定とか

参考

キーボードとか

F キーを fn なしで使えるようにする(Apple Keyboard - ArchWiki

# echo 2 >/sys/module/hid_apple/parameters/fnmode

pommed を使ってみる。 macbook 用のキーボード設定らしい。 aur から。 /etc/pommed.conf.mactel を pommed.conf としてコピーし、 general で fmmode = 2 とする。 systemctl enable pommed で有効にする。

無線LANの設定

wifi-menu を使うと、たまに画面がどうしようもなくなって動けなくなる(dialog の問題?)。 しかたがないので networkmanager を使ってみる。 cli ツールnmcli

# nmcli device wifi list # list ssid
# nmcli device wifi connect <ssid> password <password>

alsa-utils をインストールする。 alsamixer で音量調節をする。 Master がはじめミュートになってることに注意する。

X

ビデオカードを調べる

lspci | grep VGA すると NVIDIA なのがわかるので、 NVIDIA - ArchWiki を見る。

lspci | grep -A 2 -i VGA すると GeForce 320M の文字が見えるので、 CodeNames を見るとコードネームは NVAF っぽい。ということは、 nvidia-304xx を入れれば良い?

なんかうまくいかない(真っ暗になる(電源が落ちる?))ので、 nvidia は諦めて xf86-video-nouveau を入れる。 これを入れる前に、 aur から mesa-git を入れる。

KMS を有効にするという指示があるが、 KMS のページを見ると自動で有効になるという記述があるので気にしない。

nvidia-bl を aur から入れるかも。

xf86-input-synaptics を入れる。

あと xorg-server とかもろもろ入れて、以上で startx がまともに動くことを確認。

その他

TODO

MacBook Air に Arch Linux を入れる

参考

CD ブート

インストールディスクをもらってきて焼く。 2014.02.01-dual 使った。

/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBVideoSupport.kext/Contents/MacOS/AppleUSBVideoSupport と /Library/ColorSync/Profiles/Displays/をバックアップしておく。 その他必要なファイルをバックアップ。

MacOSX が存在するうちに音量をミュートにしておく、ソフトウェア・アップデートをしておく。

alt/options を押しながら再起動して cd からブートする。

ディスクのセットアップとか

ともかくまずは loadkeys i386/qwerty/jp106.map.gz

cgdisk /dev/sda でパーティションをいじる。

1 200MiB EFI System
2 100MiB Linux filesystem BootArch
3 rest Linux filesystem RootArch

partition type ってなんだかわかんないんだけど Linux filesystem でいいのかしら。

ディスクをフォーマットする。 lsblk が便利。

# mkfs.vfat /dev/sda1
# mkfs.ext2 /dev/sda2
# mkfs.ext4 /dev/sda3

マウントする。

# mount /dev/sda3 /mnt
# mkdir /mnt/boot
# mount /dev/sda2 /mnt/boot
# mkdir /mnt/boot/efi
# mount /dev/sda1 /mnt/boot/efi

ネットワークの設定を確認する。 wifi-menu 使ったらなんか簡単にできた。netctl から来たものらしい。

# pacstrap /mnt base
# genfstab -pU /mnt >> /mnt/etc/fstab

chroot

# arch-chroot /mnt
# vi /etc/hostname
# ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# vi /etc/locale.gen # uncomment ja_JP.UTF-8 and ja_JP.EUC-JP
# locale-gen
# vi /etc/locale.conf
LANG=ja_JP.UTF-8
LC_TIME=C

# vi /etc/vconsole.conf
KEYMAP=jp106

## /etc/mkinitcpio.conf の設定は不要?
# mkinitcpio -p linux

# passwd

無線lanを設定するためのパッケージを入れる。 dialog は wifi-menu に必要。

# pacman -S dialog wpa_supplicant

ブートローダ(正確には boot manager?)のインストール。

# pacman -S refind-efi
# refind-install

/boot/refind_linux.conf を編集するらしいがそのままにしておく?

exit で chroot 環境を抜け、 umount -R /mnt して reboot する。

TODO

rsync を使った簡単なディレクトリ同期ツール synk

作った。

https://github.com/10sr/script/blob/master/synk.sh

予め同期先のディレクトリを決めておけば、 synk {pull|push} によってそのディレクトリと現在のディレクトリを同期できる。

まず、同期したいディレクトリに、 .synk.conf というファイルを作る。 これはシェルスクリプトであり、例えば次のような変数定義を書く。

remote=user@host:/home/user/documents
rsync_opts="--delete --backup --suffix=.bak"

この .synk.conf を置いたディレクトリかその下のディレクトリで synk を実行すると、 .synk.conf があるディレクトリをルートとして $remote と同期する。 synk pull なら remote の内容をローカルにコピーし、 synk push はその逆をする。

emacs の minibuffer にホスト名を書く

リモートで作業しているときは、今いるマシンのホスト名がわからないとかなり困る。

普段は tmux を使っているので、そのステータスラインにホスト名を表示すれば十分だったりする。 でも、例えば多段に ssh してたりしてわざわざ tmux を張るほどじゃない場合もあって、そういう時に emacs を起動してそこがどこだかわからなくなることが意外とある。

なので、 emacs 上のどこかでホスト名を表示したいと思った。 表示する場所の候補の一つとしては mode-line とかあるけど、もう日付加えてるしあんまり色々書いても読みづらくなる。 その上 mode-line は window 毎に用意されるので無駄が多い感じが強い。

そこで、 advice を使って minibuffer に書くことにした。 find-file とか minibuffer を使った対話的な入力のときに、 [USER@HOST] が一緒に表示される(M-x での表示には emacs24 から対応してる)。

(defvar my-system-info
  nil
  "System info in the form of \"[user@host] \".")
(setq my-system-info
      (concat "["
              user-login-name
              "@"
              (car (split-string system-name
                                 "\\."))
              "] "))

(defadvice read-from-minibuffer (before info-in-prompt activate)
  (ad-set-arg 0
              (concat my-system-info
                      (ad-get-arg 0))))

(defadvice read-string (before info-in-prompt activate)
  (ad-set-arg 0
              (concat my-system-info
                      (ad-get-arg 0))))

(when (< emacs-major-version 24)
  (defadvice completing-read (before info-in-prompt activate)
    (ad-set-arg 0
                (concat my-system-info
                        (ad-get-arg 0)))))