にへるつおるぐ | src | ブログ | コンタクト | 統計 | 御串 | 小束 | 裏ミク | つ痛 | 顔本 |

10年ぶりに部屋に入るとコウモリや猫の巣窟だった

Debian -- ユニバーサルオペレーティングシステム

2011-09-08 16:08:01 JST-9 | akebia | Debian | コメント | トラックバック | 履歴

あけび猫は今まで、Debianのアーキテクチャがi386のものを使っていたのですが、しだいにamd64に対応したCPUが増えてきたので、Debianのアーキテクチャもamd64にしてみることにしました。その際、今までの設定をそのまま引き継ぎたいので、その方法を考えてみました。以下は、Debian「squeeze」で試したものです。

下記の手順を実行する前に、必ず既存のシステムのバックアップを取っておきましょう。また、別のマシンやVirtualBox等で事前に練習しておくのがおすすめです。

  1. アーキテクチャを変更しようとしているシステム(ターゲット)に存在しているデータベースファイル等で、アーキテクチャに依存している形式のものがあれば、それをアーキテクチャに依存しない形式に変換しておきます。
  2. ターゲットにインストールされているパッケージの一覧を作ります。
  3. 適当なディスクの空いている領域にパーティションを作り、そこにamd64版のシステムを新規にインストールします。この作業は、ターゲットのマシンとは別のマシンで行うとターゲットを使用しながら行えて快適です。
  4. 新規にインストールしたシステムにインストールされているパッケージの一覧を作ります。
  5. 2と4の一覧を比較し、2に有って4に無いパッケージを新規にインストールしたシステムにインストールします。この時、linux-imageやlinux-headersといったアーキテクチャに依存するものについては、インストールしないようにします。
  6. 再び4と同様にパッケージの一覧を作り、それと2の一覧を比較し、2には無いパッケージを新規にインストールしたシステムから削除します。この時にも、linux-imageやlinux-headersといったアーキテクチャに依存するものを削除してしまわないようにします。
  7. 念のため、再び4と同様にパッケージの一覧を作り、2の一覧と同じになっているか確認し、なっていない場合には、どうにかしてなるようにします。この時にも、linux-imageやlinux-headersといったアーキテクチャに依存するものについては違いを無視します。
  8. ターゲットの入っているパーティションを新規にインストールしたシステムにマウントし、ターゲットの残したいファイルが入っているディレクトリを除くディレクトリに、新規にインストールしたシステムの対応するディレクトリをミラーリングコピーします。この時、ターゲットに個別に残したいファイルがある場合には、それが削除されないようにコピーコマンドの設定をどうにかします。これらの作業はターゲットをシャットダウンして行わないといけないので、amd64版のシステムのインストール作業を別のマシンで行った場合には、そのディスクをターゲットのマシンに取り付けなおして起動させるか、逆にターゲットのディスクを作業マシンの方に取り付けなおすかして行う必要があります。
  9. ターゲットに、1の手順によりアーキテクチャに依存しない形式に変換されたファイルがある場合には、それを新しいシステムのアーキテクチャに依存する形式に変換します。
  10. これで、ターゲットのアーキテクチャは新規にインストールしたシステムと同じになっているはずなので、ターゲットを起動し、動作に問題ないこと確認すれば完了です。

大まかな手順は以上のとおりですが、詳細は以下のとおりです。

アーキテクチャに依存している形式のファイル

これは、あけび猫が気がついたのはrrdファイルです。これは、取りあえず、/varディレクトリにて、「find -name *.rrd」とタイプしてみて下さい。あと、外に心当たりのあるディレクトリがある場合には、そこもチェックしてみて下さい。発見された場合には対処が必要で、下記のリンク先のページが参考になりました。

パッケージの一覧を作る

これは、「dpkg --get-selections」とタイプすれば出てきます。シンプルな一覧にするには、先ず「dpkg -l | grep ^[^i]」とタイプしてみて、状態が「ii」以外になっているパッケージを調べ、不要なパッケージであることが分かったら、それを「dpkg -P …」で全てパージしておくとよいです。「dpkg --get-selections」の各行末には、「install」という文字列が付いてきますが、これはテキストエディタの置換機能とかキーボードマクロで消せると思います。たとえば、perlを使った場合には、「dpkg --get-selections | perl -e "while(<>){s/\s+\S*//;print;}"」とするとよいです。

aptitudeを使っていて、その設定をなるべく反映させたい場合には、「aptitude search *」の出力結果をどうにか加工すればよいと思いますが、長年使っているシステムでは、恐らく、apt-getやらdpkgやらで入れたパッケージが混在していたりしてなんだかよく分からない状態になっていると思うので、少しやってみて面倒になってきたら、dpkgの結果で妥協するのがよいと思います。

一覧を比較する

たとえば、一覧「a」と一覧「b」を比較するには「diff a b」とタイプするとよいです。aに有ってbに無いものを表示させたい場合には「diff a b | grep "^<"」とタイプします。bに有ってaに無いものの場合には、単にaとbを入替えてもよいですし、「diff a b | grep "^>"」としてもよいと思います。各行の頭に付いた記号はテキストエディタの置換機能とかキーボードマクロで消せると思います。たとえば、perlを使った場合には、「diff a b | grep "^<" | perl -e "while(<>){s/^..//;print;}"」とするとよいです。

ちなみに、最終的に出来た一覧をインストールやらパージのコマンドに与えるには、たとえば、一覧が「c」だとすると「aptitude install `cat c`」とするとか、テキストエディタの機能で、各行の後ろに「 \」を付けて、それをターミナルに打ち込んだ目的のコマンドの引数部分にコピペするという手があります。

i386のシステムとamd64のシステムでパッケージの一覧が同じにならない場合の対処方法

  • 「/etc/apt」の中の設定ファイルでたとえば、「sources.list」の内容が異なってないか確認してみます。
  • 両方のシステムのパッケージをそれぞれ最新のものに更新してみます。
  • 不要なパッケージを削除してから必要なパッケージを入れるという手順ではなく、先に必要なパッケージを入れておいてから、不要なパッケージを削除するという手順にしてみます。これは、あるパッケージを入れることで、いままで依存関係の問題で削除できなかったパッケージが問題なく削除できるようになることがあるからです。
  • i386の方でインストールできてamd64の方でインストールできないパッケージがある場合には、そのパッケージについて調べて、不要なものであればi386の方からも消してしまいましょう。長年使っているシステムでは、そういう不要なパッケージがいつのまにか増えていってしまうことがありがちです。
  • 「aptitude search …」の結果が変な場合には、「aptitude update」を実行してから、再度、「aptitude search …」を実行するとうまくいったりするみたいです。

i386のシステムが入ったパーティションにamd64のシステムのファイルをコピーする

先ず、amd64のシステム(i386のシステムにインストールしてある全てのパッケージと同じパッケージが全て(アーキテクチャ依存のものは除く)インストール済みのもの)が入ったパーティションを「/mnt/a」にマウントし、i386のシステムが入ったパーティションを「/mnt/b」にマウントします。そして、下記のシェルスクリプトを実行します。(実際に実行する前に、各自の環境に合わせてスクリプトを修正しておきます。)

rsync -av --delete \
 --exclude "/etc/"\
 --exclude "/var/"\
 --exclude "/home/"\
 --exclude "/tmp/"\
 --exclude "/root/"\
 --exclude "/mnt/"\
 --exclude "/swap"\
 --exclude "/opt/"\
 /mnt/a/ /mnt/b

rsync -av --delete /mnt/a/var/cache/apt/    /mnt/b/var/cache/apt
rsync -av --delete /mnt/a/var/lib/apt/      /mnt/b/var/lib/apt
rsync -av --delete /mnt/a/var/lib/dpkg/     /mnt/b/var/lib/dpkg
rsync -av --delete /mnt/a/var/lib/aptitude/ /mnt/b/var/lib/aptitude

シェルスクリプトは、たとえば、「c」というファイルに保存したとしたら、「sh c」とタイプすれば実行されます。

シェルスクリプトの中のrsyncのオプション「--exclude」にてコピーしたくないファイルやディレクトリを指定できます。「/swap」というのは、あけび猫は、スワップパーティションは使わずにルートディレクトリにスワップファイルを置く癖があるので、そういう癖のない人の場合には、この行は要らないと思います。上に記述してあるものの外にアーキテクチャ変更後に残しておきたりファイルやディレクトリがある場合にはそれを書き足し、逆にamd64のシステムのものと置き換えたいファイルやディレクトリがある場合には、それに該当する行を削除して下さい。

シェルスクリプトの最後の4行はapt関係のデータをi386のものからamd64のものにするための記述です。あけび猫は、「apt-xapian-index」は使っていないので、もしもこれがインストールされていた場合の結果は謎です。もしかすると、これのデータをコピーするための記述を書き加えないといけないかもしれませんが、よくわからない場合には、このパッケージを削除してしまえばよいかもしれません。

i386からamd64に変更したシステムを起動して問題があった場合の対処方法

  • 全く起動しない場合には、「Super Grub2 Disk」を使ってみましょう。こちらを参考にして下さい。
  • 起動が途中で止まる場合には、取りあえず新規にインストールした方のamd64のシステムを立ち上げ、initrdを再作成してから、そのinitrdを既存のシステムの方へコピーします。このinitrdを再作成する時には、fstabとmdadm.confの内容を既存のシステムのものと似たような設定にしておきます。fstabは特にルートデバイスの設定を同じにしておかないといけないでしょう。mdadm.confは、RAIDを使っていない場合には関係無いです。RAIDを使っている場合には、既存のシステムのものと同じ内容にしておきましょう。こちらも参考にして下さい。
  • ブートメニューに出てくる項目が以前と違う場合や、各項目の編集画面を見て、なんか設定が以前と違う場合には、「update-grub」を実行してから、システムを再起動させてみましょう。特にgrub関係の設定ファイルを過去に修正したことがあるような気がする場合には、これは重要かもしれません。
  • カーネルのモジュールや、モジュール構成になっているアプリケーションの動作を確認し、今までロードされてたはずのモジュールがロードされてなかったりして動作が変な場合には、そのモジュールのインストール時にコンパイルを必要としてなかったか否かを思い出してみましょう。そういう心当たりがある場合には、モジュールをコンパイルしなおしてみましょう。モジュールのインストールにdkmsを使っていて、dkmsの動作が変な場合には、一旦dkmsをパージし、/var/lib/dkmsディレクトリを削除してから、もう一度dkmsをインストールし、dkmsを使う全てのモジュールのインストールをやりなおすとうまくいくかもしれません。
  • 以前は動作していたのに、今は動作している気配がしないサービスがある場合には、そのサービスのログを確認するとか、サービスからエラーのメールが届いてないか確認します。エラーメッセージがあれば、それに対処します。もしかすると、そのサービスが使っているデータの形式がアーキテクチャ依存だったりするのかもしれません。

MyMiniCity 人気ブログランキングへ

  1. debian amd64 i386 違い (5)
  2. amd64 i386削除方法 (4)
  3. debian amd64 i386 変更 (4)
  4. debian amd64 i386 (3)
  5. debian i386 amd64 (3)

Comments

No comments yet

Add Comment

Trackback

このトラックバックURL(右クリックして、リンクのURLをコピー)を使ってこの記事にトラックバックを送ることができます。もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。トラックバックの手動送信に失敗したり、拒否された場合には、あけび猫が入力しますので、こちらまでご連絡下さい。重複したトラックバックは、自動的に1つにまとめられるようなので、気軽に色々試してみて下さい。


http://2hz.org/akebia/