~xdavidwu/xdavidwu.link

f3ec86723040fdfb88194620ed66bbef1ae1b8e5 — xdavidwu 4 years ago 6774510
posts: add centos-upgrade-attempt
1 files changed, 71 insertions(+), 0 deletions(-)

A _posts/2019-09-25-centos-upgrade-attempt.md
A _posts/2019-09-25-centos-upgrade-attempt.md => _posts/2019-09-25-centos-upgrade-attempt.md +71 -0
@@ 0,0 1,71 @@
---
title: "CentOS 7.7 to 8 upgrade attempt"
categories:
  - CentOS
tags:
  - centos
---

紀錄一下我純手動升級 CentOS 8 的過程

拿來升級的環境有兩個 都是 CentOS 7.7 的 lxc

從 lxc 的 image 下載下來一陣子默默一直升到 7.7

其中一個基本上只額外裝了 gitlab-runner 和 docker

另一個是有 gitlab-ee, nodejs, pgsql, supervisord, vim

RHEL 用的 leapp CentOS 沒包, 而且看 code 只有看到 RHEL 的處理部份, 雖然應該大同小異但還是怕拿來用會有很多東西要修

lxc 在當時也還沒有 8 的 image

所以就憑我的想法實驗了一下

一切開始前先備份 這很重要

首先我嘗試直接改 repo url 去升級, yum 會報錯, 印象中是新的套件用了新 feature 沒辦法直接用舊的 yum, rpm stack 去裝

印象中長的像 `unsupported version 'if'` 之類的

所以我先從 lxc 外裝 yum 蓋過去, 基本上就是 wiki 上從現有系統 bootstrap 的那招, 但只有到裝 yum 的部份

大致流程就是外面裝好 yum, rpm 指定 root 到目標系統裝一下新的 centos-release, 解一下 rpmnew 讓新的 repo 資訊都到位

然後 yum 指定 installroot 和 releasever 去裝 yum

但這樣下去裡面執行 yum 還是會卡一個 dependency 的報錯, 不過 dnf 卻是好的可以用

再來我的作法是先 disable 所有非官方的 repo (我用的都還沒有 el8, 避免 url 有參考到 releasever 和其他其實不太要緊的 dependency 問題先停用)

到裡面下 `dnf upgrade --releasever=8 --allowerasing`, 這一次 releasever 還會抓到 7 所以要覆寫, 裝好後就不用了, allowerasing 是因為他 dependency solving 時會一度說要 remove systemd (我看最後 prompt 的變更倒是沒有)

跑 change test 的時候會報出一些衝突錯, 大多是套件改名造成新舊並存會衝突

改名衝突的我大多先 remove 舊的, 如果 remove 舊的會串到一堆 dependency 我再嘗試先用 rpm 強制裝新的下去, /etc 下的 config 如果衝到印象中我把他移開就能解決

注意追蹤實際上動了哪些套件

折騰完之後 `dnf list installed | grep el7` 之類的來個大掃除 剩下的大多是之前 dependency 的 leftover 刪掉不會牽到什麼

但有些是 7.7 到 8 反而版本號上是降版的所以沒更到 例如 tzdata (2019b vs 2019a), 我撞到的還有 elfutils-\* 系列

這些我也是 rpm 強制降版下去

大掃除完 el7 的套件就差不多了, 把真正需要的第三方 repo 開回來, 把被消失的東西裝回來 (有些可能用了 8 包的新版就不需要其他 repo 了, 例如我的 nodejs 就是從 nodesource 改用 CentOS 8 官方 AppStream repo 內的) (注意有很多東西都還是只有包 el7, 但說不定能拿來用, 例如 gitlab, gitlab-runner, docker)

docker 我撞到了一些 el7 後期的 containerd.io 有標 conflict 到自己 provide 的 containerd, 我用 dnf 看起來新的 rpm 不能這樣搞, 導致 docker-ce 和 containerd.io 都被裝到 2018 年的, 也是用 rpm 手動 --nodeps 下去解決

gitlab-ee 撞到了一個 policycoreutils 相關的 python (2?) 的 dependency 找不到, 我直接 rpm --nodeps 下去目前跑起來看似沒問題, 還撞到了一個 pages 的內部 http server 自動 start 起來時會沒有 listen on ipv6, 造成 pages 的 nginx reverse proxy 吃不到他, 目前我是手動 gitlab-ctl restart 解決

pgsql 從 9 升到了 10, 現有的 db 要轉一下 (`postgresql-setup --upgrade`, 撞編碼或 locale 的話調 `PGSETUP_INITDB_OPTIONS='-E <encoding> --locale=<locale>'`), 我的 authencation 會跑掉

supervisord 貌似沒包了, 所以我用 pip 去裝然後寫 systemd service

sendmail 移除不包了, 改用 postfix

yum-cron 沒了, 改用 dnf-automatic, config 大致上長一樣只是多了些其他吐 log 的方法

dhclient 改成 dhcp-client, 指令還是叫 dhclient, 我忘了先前 lxc 是怎麼讓他自動 start 的就寫了個 systemd service

這樣搞下來目前看跑起來是沒什麼問題