再インストールせずにアーキテクチャを移行

提供: ArchWiki
2023年3月10日 (金) 21:28時点におけるKgx (トーク | 投稿記録)による版 (→‎トラブルシューティング: 2017年以前の旧システムからの移行を翻訳して追加)
ナビゲーションに移動 検索に移動

このページではインストール済みの環境を i686 (32ビット) から x86_64 (64ビット) アーキテクチャに移行する2つの方法を解説しています。どちらの方法でもシステム全体の再インストール (ハードドライブの消去など) は行いません。片方はライブ CD を使い、もう片方はシステムの中から移行を実行します。

ノート: 技術的には以下のセクションで説明していることは、システムの全てのパッケージを「再インストール」することであると言い換えることができます。以下の方法では既存環境をできるだけ壊さずに維持します。
警告: 特に断りがない限り、以下の方法を使うことによってシステムに不可逆的なダメージを与える可能性があります。移行は自己責任で行ってください。

準備

64ビットアーキテクチャの確認

64ビットのソフトウェアを動かすには64ビット対応の CPU を使用する必要があります。最近のほとんどの CPU は64ビットソフトウェアの実行に対応しています。次のコマンドを使って CPU を確認できます:

$ grep --color -w lm /proc/cpuinfo

x86_64 をサポートしている CPU の場合、lm フラグ (“long mode”) が返ってきます。lahf_lm は別のフラグであり64ビット対応とは関係ないので注意してください。

ディスク容量

移行を行うと /var/cache/pacman/pkg のサイズが約2倍になるので、十分な容量を確保してください。ただし、pacman -Sc を最近実行していて、インストールしているパッケージしかキャッシュに存在しない場合です。それぞれのパッケージの i686 バージョンと x86_64 バージョンが重複するのでディスク容量が増えます。

ディスクに十分な容量がない場合は、gparted を使って適切なパーティションをリサイズするか、他のパーティションに /var/cache/pacman をマウントしてください。

システムが新しいアーキテクチャで完全に動作するようになるまでは、古いアーキテクチャのパッケージをキャッシュから削除するのは止めてください。急いでパッケージを削除してしまうと、変更を元に戻せなくなってしまいます。

電源

移行には大変時間がかかります。バッテリー不足で移行中に電源が切れてしまう可能性もあります。インストールしているパッケージの量やインターネット接続の速度にもよりますが、最低でも1時間は見積もっておいてください (実際に移行を始める前にパッケージをあらかじめダウンロードしておくことは可能です)。安定した電源に接続してください。できればフェイルオーバーやバッテリーのバックアップがあると良いでしょう。

フォールバックパッケージ

移行が途中で失敗したときに、役に立つパッケージがあります。ただし、メインのパッケージの移行を行う前にインストールする必要があります。詳しくは下の #トラブルシューティング を見てください。

一つは busybox であり、変更を戻すのに使うことができます。静的リンクされるのでライブラリには全く依存しません。32ビット (i686) バージョンをインストールしてください。

もう一つは Multilib x86_64 リポジトリの lib32-glibc です。32ビットから移行するときだけ役に立ちます。64ビットから移行する場合はこのパッケージは必要ありません。このパッケージを使って /lib/ld-linux.so.2 を呼び出すことで32ビットのプログラムを実行することが可能です。

方法 1: Arch LiveCD を使う

  1. 最新の Arch Linux ISO を ダウンロード してメディアに書き込んでください。
  2. x86_64 モードで Arch LiveCD を起動してください。
  3. LiveCD の中でネットワークを設定してください。
  4. 既存環境をマウントしてください。例: mount /dev/sda1 /mnt
  5. LiveCD の /etc/pacman.conf のリポジトリを編集して既存の /mnt/etc/pacman.conf のリポジトリと同じに設定してください。
  6. 以下のコマンドを使ってローカルの pacman データベースを更新してキャッシュディレクトリを消去してください:
# pacman --root /mnt -Syy
# pacman --root /mnt -Scc
7. 最初に base グループだけを再インストールして、それからインストールエラーが発生したパッケージをインストールしてください。エラーの発生したパッケージは pacman --root /mnt -Qo <error file> で確認できます。エラーが出なくなるまで base グループのインストールを繰り返し実行してください:
# pacman --root /mnt -S base
8. 以下のコマンドを使ってインストールされているパッケージのリストを取得して、再インストールしてください:
# pacman --root /mnt -Qnq | pacman --root /mnt -S -
9. 多くのパッケージは post-install スクリプトの実行に最初は失敗するため、上記のコマンドは2回実行することになります。sed, grep, perl などのパッケージが該当します。もしくは、エラーが出力されるパッケージを個別にメモして、アップグレードを完了した後に再インストールしてもかまいません。また、ディスク容量が足りないとエラーが表示される場合、パッケージリストをアルファベット順で順に分けることができます。例えば ...| grep '^[a-k]' |... で a から k のパッケージを再インストールした後に '^l''^[m-z]' で残りのパッケージを再インストールします。再インストールが問題なく完了したら pacman --root /mnt -Scc を実行してディスク容量を開けてください。
10. 最後に、以下のコマンドを実行してください:
# arch-chroot /mnt 
# mkinitcpio -p linux
11. また、ブートローダーの移行が必要かどうか確認してください。例:
# grub-install --recheck /dev/sda
12. 新しい64ビット環境で再起動したら、/etc/makepkg.conf.pacnew/etc/makepkg.conf に移動して cpu アーキテクチャを移行します。それから AUR からインストールした "foreign" パッケージを再ビルドしてください。
再ビルドする前に、孤児となっている外部パッケージを削除したい場合、以下のコマンドを実行することで32ビットのバイナリが確認できます:
$ pacman -Qo `find /usr/bin -type f -exec bash -c 'file "{}" | grep 32-bit' \; | cut -d':' -f1` | cut -d' ' -f5 | sort | uniq | tee list

方法 2: 既存のシステムから

先に進む前にシステムが完全にアップデートされていることを確認してください:

# pacman -Syu

パッケージの準備

古いパッケージをキャッシュ

ノート: AUR やサードパーティのリポジトリからパッケージをインストールしていて移行先のアーキテクチャに対応するパッケージがない場合、pacman は適切な代替パッケージが見つからないと表示します。そういったパッケージのリストを作成しておいてアップデートが終わってから再インストールしたり pacman -Rsn package_name で削除することができます。

インストールしているパッケージをキャッシュに保存していない場合は、フォールバック用にダウンロードしてください (前のアーキテクチャ)。

# pacman -Qqn | pacman -Sw -

もしくは pacman パッケージの bacman を使ってキャッシュを生成してください。

busybox のインストール

32ビットから64ビットに移行する場合は、ここで32ビットの busybox をインストールします。

# pacman -S busybox

Pacman のアーキテクチャを変更

/etc/pacman.conf ファイルを編集して Architectureauto から x86_64 に変更してください。

/etc/pacman.conf/etc/pacman.d/mirrorlist のサーバーリストで i686x86_64 といった文字列ではなく $arch が使われていることを確認してください。確認できたら pacman で新しいリポジトリに同期してください:

# pacman -Syy                     # force sync new architecture repositories

新しいパッケージのダウンロード

現在インストールしているパッケージの新しいアーキテクチャのバージョンを全てダウンロード:

# pacman -Sw $(pacman -Qqn|sed '/^lib32-/ d')  # download new package versions

32ビットに移行する場合は、Pacman が32ビットアーキテクチャに設定されている今ここでフォールバック用の32ビットの busybox をインストールしてください。

警告: まだ lib32-glibc パッケージはインストールしないでください。ldconfig の後、linux のインストール時に生成されたイメージは librt.so などのライブラリを /usr/lib32 に保存するため、起動時にバイナリが検索できなくなり起動できなくなります。

パッケージのインストール

カーネルのインストール (64ビット)

カーネルを64ビット (x86_64) にアップグレードすることは簡単です。64ビットカーネルでは32ビット・64ビット両方のアプリケーションが実行可能だからです。

linux パッケージをインストールしてください:

# pacman -S linux

lib32-glibc のインストール

lib32-glibc フォールバックをインストールしてください。インストールするには /etc/pacman.confmultilib リポジトリを有効にする必要があります。

# pacman -S lib32-glibc
ノート: 別の名前のパッケージに存在するファイルによってインストールに失敗する場合、pacman の --force オプションを使ってください。

再起動

x86_64 アーキテクチャで動作していることを確認してください:

$ uname -m
x86_64

コンソール端末に切り替え

可能であれば、テキストモードの仮想端末に切り替えてください (例: Ctrl+Alt+F1)。1番目のコンソールを使おうとするとエラーが表示される場合、2番目のコンソールを使ってください (Ctrl-Alt+F2)。SSH などの疑似端末でも問題ありませんが、直接アクセスできる方法を使うことを推奨します。アップデートによって削除・置換されるパッケージの中には X11 デスクトップを不安定にするものがあり、システムが起動できなくなってしまう可能性があります。

Pacman のインストール

警告:
  • pacman と依存パッケージのアップデートを開始したら途中で止めてはいけません。Pacman と依存パッケージは一度にインストールする必要があります。
  • 以下のコマンドを実行すると、他のパッケージを移行するまで Busybox, Bash, Pacman だけしか実行できなくなります。sudo を使用する場合、以下のコマンドを実行する前に root 権限を得ておいてください。

pactree を使って Pacman と依存パッケージをインストールしてください:

# pactree -l pacman | pacman -S -

エラーが出力されるかもしれませんが、pacman が動作するのであれば問題ではありません。

警告: 以下のコマンドを実行するまでは、システムを再起動してはいけません。間違って再起動してしまった場合、他の Linux 環境 (インストールメディアなど) から chroot してインストールを続行する必要があります。

残りのパッケージのインストール

新しいアーキテクチャ用にダウンロードしておいたパッケージを全てインストールしてください (お酒を取りに行ってサンドイッチを作りましょう、このコマンドは時間がかかります):

# pacman -Qqn | pacman -S -

一部のパッケージが正しくインストールできなかった場合、この時点で問題なく再インストールできるはずです。どれが問題のあったパッケージが見分けるのが面倒な場合、上記のコマンドを再度実行すれば全てを再インストールできます。

再インストールが完了したら移行は完了です。コンピュータを再起動しても問題ありません。

ただし、AUR のパッケージをインストールしている場合、全てのパッケージを再インストールする必要があります。AUR パッケージのリストは以下のコマンドで確認できます:

$ pacman -Qqm

仕上げ

移行できたら busyboxlib32-glibc は削除してかまいません。

Makepkg コンパイラフラグ

アップグレードで /etc/makepkg.conf の新しいバージョンが /etc/makepkg.conf.pacnew に保存されます。後で makepkg を使ってコンパイルしたときに問題が起こらないように古いバージョンを置き換えてください:

# mv /etc/makepkg.conf /etc/makepkg.conf.backup && mv /etc/makepkg.conf.pacnew /etc/makepkg.conf

また、/etc の新しいファイルのリストを確認すると良いでしょう。以下のコマンドでリストを表示できます:

# find /etc/ -type f -name \*.pac\*

トラブルシューティング

アップグレードの際、glibc が新しいアーキテクチャのバージョンで置き換えられると、古いアーキテクチャのバージョンのプログラムが動作しなくなります。問題が発生した場合、busyboxlib32-glibc で解決できるかもしれません。

Busybox

Arch では BusyBox は静的リンクされています。実行するのに何のライブラリも必要ありません。様々なコマンドを使うことができます。例えばキャッシュされたパッケージから Pacman の i686 版を抽出するには:

# busybox tar xf /var/cache/pacman/pkg/pacman-3.3.2-1-i686.pkg.tar.gz -C <some folder>

Lib32-glibc

32ビットの /bin/ls を実行する例:

# /lib/ld-linux.so.2 /bin/ls

2017年以前の旧システムからの移行

2017 年に Arch Linux が i686 のサポートを終了したため、古い 32 ビット システムの更新で問題が発生する可能性があります。その更新を安全に行うには、Arch Linux Archive を使用することをお勧めします。つまり、リポジトリのスナップショットを修正し、現在のシステムを更新してから、同じバージョン に対応する 64 ビットフレーバーのパッケージに切り替えます。

パッケージの署名に使用されたすべての GPG キーがまだ有効であるとは限らないため、pacman.conf で必要な信頼レベルを下げる必要がある場合があることに注意してください (PackageTrustAll のように、marginal trust を含めるようにします) ただし、HTTPS を使用して、少なくともパッケージが archlinux.org ドメインからのものであることを確認することをお勧めします。

32ビットから64ビットに移行後 KDE が起動しない

32ビットから64ビットに移行した後、KDE がクラッシュするようになることがあります。原因は32ビットの KDE パッケージによって作成されたキャッシュファイルが /var/tmp に残っているためです。以下のコマンドで kdecache フォルダを消去することで解決します:

# rm -rf /var/tmp/kdecache-*

キャッシュが存在する場合の Mutt の問題

移行後、メールフォルダを開こうとすると mutt がフリーズする場合、キャッシュディレクトリの名前を変更してください。mutt は新しいキャッシュディレクトリを作成するため元のディレクトリは消去してかまいません。

参照