CentOS7からAlmaLinuxへProxy環境下での移行(ELevate)

## TL;DR

追記:
leappをインストールしたら、次の様にproxy設定してから実際のコマンドを実行。

```sh
$ echo $https_proxy
https_proxy=http://proxy.example.co.jp:8080
$ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" \
  /etc/leapp/files/leapp_upgrade_repositories.repo
```

## はじめに

CentOS7.xから各種RHEL8.xベースのOSへインプレースアップグレードするには、ELevateというツールで可能。

https://almalinux.org/elevate

Qiitaの記事で見つけたのはこちら、

https://qiita.com/pjam1x4/items/b1712eb264b801355db0

## 問題点(Proxy環境下)

動作中のCentOS7上でまずパッケージ環境を`/var/lib/leapp`にダウンロードして準備を行い、再起動で適用していく動作の様だが、このパッケージ群をdnfでダウンロードできなかった。

```sh
====> * target_userspace_creator
        Initializes a directory to be populated as a minimal environment to run binaries from the target system.
AlmaLinux 8 - BaseOS                            0.0  B/s |   0  B     00:00
AlmaLinux 8 - AppStream                         0.0  B/s |   0  B     00:00
AlmaLinux 8 - HighAvailability                  0.0  B/s |   0  B     00:00
AlmaLinux 8 - Extras                            0.0  B/s |   0  B     00:00
AlmaLinux 8 - PowerTools                        0.0  B/s |   0  B     00:00
AlmaLinux 8 - ResilientStorage                  0.0  B/s |   0  B     00:00
No match for argument: dnf
No match for argument: dnf-command(config-manager)
```

結果、`sudo leapp preupgrade`の段階でエラー終了する。

```sh
============================================================
                           ERRORS
============================================================

2022-05-05 10:10:10.123456 [ERROR] Actor: target_userspace_creator
Message: Unable to install RHEL 8 userspace packages.
Summary:
    Details: Command ['systemd-nspawn', '--register=no', '--quiet', '-D', '/var/lib/leapp/scratch/mounts/root_/system_overlay', '--setenv=LEAPP_NO_RHSM=0', '--setenv=LEAPP_EXPERIMENTAL=0', '--setenv=LEAPP_COMMON_TOOLS=:/etc/leapp/repos.d/system_upgrade/el7toel8/tools', '--setenv=LEAPP_COMMON_FILES=:/etc/leapp/repos.d/system_upgrade/common/files:/etc/leapp/repos.d/system_upgrade/el7toel8/files', '--setenv=LEAPP_UNSUPPORTED=0', '--setenv=LEAPP_EXECUTION_ID=5cf5ff2a-ddd2-40eb-8824-32809de9a6bc', '--setenv=LEAPP_HOSTNAME=centos7.internal.example.co.jp', 'dnf', 'install', '-y', '--nogpgcheck', '--setopt=module_platform_id=platform:el8', '--setopt=keepcache=1', '--releasever', u'8.4', '--installroot', '/el8target', '--disablerepo', '*', '--enablerepo', u'almalinux8-baseos', '--enablerepo', u'almalinux8-powertools', '--enablerepo', u'almalinux8-resilientstorage', '--enablerepo', u'almalinux8-extras', '--enablerepo', u'almalinux8-highavailability', '--enablerepo', u'almalinux8-appstream', 'dnf', 'dnf-command(config-manager)', '--disableplugin', 'subscription-manager'] failed with exit code 1.
    Stderr: Failed to create directory /var/lib/leapp/scratch/mounts/root_/system_overlay//sys/fs/selinux: Read-only file system
            Failed to create directory /var/lib/leapp/scratch/mounts/root_/system_overlay//sys/fs/selinux: Read-only file system
            Host and machine ids are equal (cc44730a6e0347cb8d7e5d87a0c496bb): refusing to link journals
            Failed to synchronize cache for repo 'almalinux8-baseos', ignoring this repo.
            Failed to synchronize cache for repo 'almalinux8-appstream', ignoring this repo.
            Failed to synchronize cache for repo 'almalinux8-highavailability', ignoring this repo.
            Failed to synchronize cache for repo 'almalinux8-extras', ignoring this repo.
            Failed to synchronize cache for repo 'almalinux8-powertools', ignoring this repo.
            Failed to synchronize cache for repo 'almalinux8-resilientstorage', ignoring this repo.
            Error: Unable to find a match: dnf dnf-command(config-manager)

============================================================
                       END OF ERRORS
============================================================
```

## 確認

### ログ

`sudo leapp preupgrade --verbose`にて詳細表示するとcurlがProxyを使わず直接アクセスしようとしている。

```sh
repo: downloading from remote: almalinux8-baseos
AlmaLinux 8 - BaseOS                            0.0  B/s |   0  B     00:00
Cannot download 'https://mirrors.almalinux.org/mirrorlist/8/baseos': Cannot prepare internal mirrorlist: Curl error (7): Couldn't connect to server for https://mirrors.almalinux.org/mirrorlist/8/baseos [Failed to connect to 2600:1f18:448e:8a30:1553:55e7:ad8b:f77c: Network is unreachable].
```

### 設定確認

- 一般的な`https_proxy`,`HTTPS_PROXY`などが一通り設定してあってもダメ。
- curlが使われている様なので、`.curlrc`を設定してもダメ。
- `/etc/dnf/dnf.conf`のことは忘れてました…(後述)(leappのインストールとともにdnfもCentOS7にインストールされる) →追記 `preupgade`は成功するが実際の`upgrade`時に失敗する。

## 対応

leappは環境変数を見てくれないので、次の様にアップグレード用リポジトリーの設定にproxy設定を加える。

```sh
$ echo $https_proxy
https_proxy=http://proxy.example.co.jp:8080
$ sudo sed -i "/^enabled=.*/a proxy=$https_proxy" \
  /etc/leapp/files/leapp_upgrade_repositories.repo
```

### 後で調べる→やってみた

RHEL8系を触ったことがなくdnf環境は始めたなので、`/etc/dnf/dnf.conf`にproxyを加える確認はしていなかった。まだまだCentOS7環境が残っているので、後日確認して見る予定。
↓追記
何度かのフェーズでアップグレードが行われるようで、まずはCentOS7上に入ったdnfが実行され、この時点では、`/etc/dnf/dnf.conf`が参照される模様、その後、`/var/lib/leapp/el8userspace/`をルートにAlmaLinuxなりのEL8のイメージが展開され、そのフェーズでは、`/var/lib/leapp/el8userspace/etc/dnf/dnf.conf`が参照される。ここは設定するタイミングなく実行されるので、この時にダウンロードに失敗していた。なので結局あらかじめ`/etc/leapp/files/leapp_upgrade_repositories.repo`にproxy設定を入れておくのが確実っぽい。