Chienomi

FM2+KillerのLinuxセットアップ: 既存のManjaro Linux (Arch Linux系)環境をクローンする

yaourt

  • TOP
  • Old Archives
  • FM2+KillerのLinuxセットアップ: 既存のManjaro Linux (Arch Linux系)環境をクローンする

あらまし

元々、メインのLinux環境はFM2+Killerだったが、Z400に移行したことで位置づけが変わった。

メインの作業環境はZ400上にあり、既に構築済みだ。 FM2+Killerは冗長環境として、同様にLinuxを構築し、いつでも使えるようにしておくのが望ましい。

可能であれば、ハードウェアも全く同じものを用意すれば、簡単にクローンできる。 だが、Z400とFM2+Killerでは色々と違いがある。特に大きいのはグラフィックスカードの種類と、ディスプレイの数の違いだ。

さらに、FM2+Killerは

  • 障害時にメインと同様に使うことができるアカウント
  • サテライト的に使う一時作業用アカウント
  • 彼女がうちにいる時に作業に使うアカウント

の3つをセットアップする

インストール

私が使っているのはManjaro Linuxである。当然ながら同じManjaro Linuxを導入する。

既にManjaro Linux 15.09がリリースされているが、15.09はUEFIにインストールすることができないバグがある。特に

0.8.13 XFceをインストールし、アップグレードする。 違いはあとから埋める。

通常どおり、yaourt -Syuuでアップグレードした上で、新しいカーネル(4.1)を導入する。4.2でないのは、AMDユーザーに勧めない、ということなので。

インストーラで作るユーザーはメイン環境と同じユーザーにすること。 でないと、UID/GIDの違いでディスクを差し替えただけでは動かなくなる。

パッケージを揃える

メイン環境と同じパッケージが入っていればもし作業環境を作るにしても、少ない手間で可能だ。

Arch Linuxにパッケージを揃える機能はなさそうだったので、スクリプトを書いた。

#!/usr/bin/ruby
# -*- mode: ruby; coding: UTF-8 -*-


PLIST = File.exist?(".previous_autoyaourt_target_list") ? File.open(".previous_autoyaourt_target_list", "r").each.map {|i| i.strip[/^\S+/] } : nil 
TLIST = ARGF.each.map {|i| i.strip[/^\S+/] }
EXCLUDE = [ /nvidia/i, /^linux/, /^libva/, /catalyst/, /maxthon/, /^opencl/, /^ocl-/, /^libcl/ ]

File.open(".previous_autoyaourt_target_list", "w") {|i| i.puts(TLIST) }


loop do
  clist = IO.popen("pacman -Q", "r") { |io| io.each.map {|i| i.strip[/^\S+/] } }
  to_install = ( TLIST - clist ).delete_if {|i| EXCLUDE.any? {|r| r === i } }
  
  if to_install.empty?
    break
  end
  
  system("yaourt", "-S", *to_install[0, 15]) or abort "Yaourt failed!!!"
end

if PLIST && ! ( dlist = PLIST - TLIST ).empty?
  
  puts "*******************************************"
  puts "CLEAN UP PHASE"
  puts "*******************************************"
  
  
  
  system("yaourt", "-R", *dlist)
end

Manjaro Linuxは標準でyaourtは入れているが、Rubyが入っていない。 Rubyをインストールし、元となる環境で

pacman -Q > target-paclist

のようにした上でこれを持ってくる必要がある。そして

ruby yaourtsyncer.rb target-paclist

のようにするわけだ。

--noconfirmオプションはつけていない。問題が発生することがあり、またひとつずつ確認したほうが安全だからだ。

別にパッケージデータそのものを持ってきて(/var/cache/pacman/pkg/以下にある)インストールする方法もあるのだが、今回は1台クローンするだけの話だし、健康にビルドしていく。

事前にsudoのタイムアウトを外しておいたほうが良いが、visudoはあるのにviがない。先にviをインストールしておく。gvimをインストールしてリンクしておいても構わない。

もし手間を短縮するなら--noconfirmをつけてもいいのだが、いずれにせよ手をかけねばならない状態になったり、失敗した時にいちいち外したりしないといけなかったりする。

これでうまくいかないのが、旧リポジトリからいれているパッケージ、失われたパッケージ、壊れてしまったパッケージだ。

旧リポジトリから入れているのがxcursor-lcd-*、なくなってしまったのがjoyutils、などなど。 これらはmakepkgでビルドしたものに関してはパッケージを持っているだろうし、pacmanやyaourtで入れたのなら/var/cache/pacman/pkg以下にある。これを導入する。

グラフィックスドライバに関連するものについては個別の環境によるため、除外している。 カーネルは元々yaourtでいれるようにはなっていないので、これも除外。

ちなみに、fcitx-mozc-utやJava関連、inkscape-gtk3-bzrはビルドが非常に長いので流用したほうが良い。

ユーザー

残り2つのユーザーを追加し、設定する。

これらユーザーはこのコンピュータのローカルなものなので、好きなように設定して構わない。

サテライト環境ではsshfsを用いてマウントすることで、UID/GIDの差を吸収できる。

冗長環境

当然ながらユーザーの設定も、元のPCに合わせたものにしたい。

私の環境ではホームディレクトリの下のディレクトリにbtrfsサブボリュームがマウントされており、また別のディレクトリがEncFSのマウントポイントにもなっている。

単純に持ってきてしまうと、btrfsの膨大なデータをコピーしてしまうし(5TB近い)、EncFSのデータを復号化したまま持ってきてしまう。

これを避けるため、マスター環境のサブボリュームマウントポイントを同様に作り、sshfsでマウントし、

$ rm -rf (^(.mountpoint))(#qD)

して

$ rsync -avH -x --exclude=/.cache -e ssh "$HOSTNAME":./ ~/

これはなるべく、コンソール上で作業したほうがよい。rootでは、FUSEを使うため支障がある。

~/.cacheは特に同期する必要がなく、同期するととても時間がかかるので省略。--delete-afterなどはとても危険。

私の場合、~/.sshがシンボリックリンクなので失敗する。 この状態で削除とリンクを同時に行えばよい。リンク自体は別にsshfsを解除していても-fオプションで可能。

なお、これで気がついたのだが、こうしてまっさらにしてコピーしても、Cinnamonの壁紙とテーマはなぜか反映されず、ローカルの設定が保たれる。ローカルで設定した後に吹き飛ばしてもだ。

なお、このテストの家庭で全データを吹き飛ばしかけた。 幸い気づくのが早く、重要なデータの損失はなかった。

rsyncのファイルシステムをこえない-xオプションは非常に便利。

なお、autostart関連は除外したかったのだが、うまくいかなかった。 これは--excludeの書き方の問題。