本来这机器我是不打算升级的,因为之前一直想让这台机器在线1000天,结果前几天出了问题重启了。。
想着反正也重启了,最近又赶上Debian发布新的稳定版,干脆升级了算了,一切从头开始。。
如果之前不重启的话,我是准备把10到EOL的,只是这突如其来的变故,只能说计划赶不上变化吧。。
Debian大版本升级的难易程度(踩坑概率)很大程度取决于你的系统内启用了多少第三方的存储库,以及通过包管理器安装了多少第三方的软件。
这种软件(包)装的越多,需要处理的依赖关系就越复杂,升级的过程中就比较容易崩。不过还好我这个机器只跑个博客也没装多少第三方的软件,所以处理起来比较容易。
升级前有几个注意事项:
1.不能跳版本号升级,只能从10升到11,不能直接从9升到11,如果要从9升到11,顺序是先升到10再升11。
2.大版本升级前务必把Debian系统升级到当前的最新小版本,比如现在buster是10.10。
3.尽量从“纯净的”Debian系统开始升级,意指如果你添加了其他的第三方存储库并安装了这些软件,需要先去除这些可能导致问题的因素。
4.备份重要数据,VPS有快照备份的话可以先安排一个。
首先把当前系统升级到最新的小版本:
apt update apt list --upgradable apt dist-upgrade
查看当前的系统版本,例如现在最新的小版本是10.10,执行下面的命令可以检查:
cat /etc/debian_version
由于我这台机器的MariaDB和PHP都是通过第三方的存储库装的,为保证升级过程中不出问题,这里特殊处理一下。
[可选]备份数据库:
mkdir /var/mariadb mariabackup --backup --user=imlala --password=xxxxx --target-dir=/var/mariadb/backup-2021-08-19 mariabackup --prepare --target-dir=/var/mariadb/backup-2021-08-19
停止运行MariaDB:
systemctl stop mariadb
卸载MariaDB:
apt remove "mariadb-*" apt remove galera-4
注:MariaDB10.5(galera-4)MariaDB10.3(galera-3)
检查还有没有残留的软件包,确保全部卸载干净:
apt list --installed | grep -i -E "mariadb|galera"
删除MariaDB存储库:
rm -rf /etc/apt/sources.list.d/mariadb.list
卸载PHP:
apt remove "php7.4-*"
删除PHP存储库:
rm -rf /etc/apt/sources.list.d/php.list
做完上面这些步骤外,还需要处理一下关于Nginx的配置。
我这台机器的Nginx上加载了PageSpeed和Brotli的动态模块,这些模块是基于Debian10的Nginx1.14版本编译的,待会升级到Debian11后,Nginx的版本会升级到1.18,这些模块固然是不可能正常使用的,所以这里先把Nginx的服务停了:
systemctl stop nginx
关闭开机自启:
systemctl disable nginx
清理不再需要的软件包:
apt autoremove
重启系统:
systemctl reboot
重新登录上来后,编辑存储库配置文件:
apt edit-sources
默认的配置:
deb http://deb.debian.org/debian/ buster main deb-src http://deb.debian.org/debian/ buster main deb http://security.debian.org/debian-security buster/updates main deb-src http://security.debian.org/debian-security buster/updates main deb http://deb.debian.org/debian/ buster-updates main deb-src http://deb.debian.org/debian/ buster-updates main
改为:
deb http://deb.debian.org/debian/ bullseye main deb-src http://deb.debian.org/debian/ bullseye main deb http://security.debian.org/debian-security bullseye-security main deb-src http://security.debian.org/debian-security bullseye-security main deb http://deb.debian.org/debian/ bullseye-updates main deb-src http://deb.debian.org/debian/ bullseye-updates main
这里需要注意的是Debian11安全更新相关的存储库的布局有变化:
https://www.debian.org/releases/bullseye/amd64/release-notes/ch-information#security-archive
修改完配置后,更新存储库信息:
apt update
现在进行最小系统升级:
apt upgrade --without-new-pkgs
显示如下信息按q退出:
是否在不通知你的情况下自动重启服务,选yes:
一旦完成了上述的最小系统升级就可以继续执行下面的命令开始全面升级了:
apt full-upgrade
这里也会提示一些关于软件包的重要更改信息,和之前一样按q退出即可:
[重要]接下来的升级过程中,会有很多类似这样的提示:
这是问你对于软件的配置文件要如何处理,是要保持默认不变还是用新的替换旧的。
如没有特殊需求,一律直接按回车,这是最稳的做法。尤其是在某些软件你修改了大量配置后。
[重要]看到这个提示,如没有特殊需求一律选择如图所示的选项:
这个是问你SSHD的配置文件要如何处理,如果你修改了SSH相关的配置,比如改了端口号等等,建议选择如图所示的选项。
更新完成后再次重启:
systemctl reboot
重新登录上来后,系统就已经升级到Debian11了:
root@debian-1cpu-1gb-us-sjo1:~# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 11 (bullseye) Release: 11 Codename: bullseye
再清理一次不再需要的软件包:
apt autoremove
现在有一些问题需要解决。
首先是我之前通过Debian的官方存储库安装了PHP7.3,然后我又通过第三方的存储库安装了PHP7.4,等于说我这个系统是多版本PHP共存。
升级前我关闭了PHP的第三方存储库,并卸载了PHP7.4。7.3我留着没动,因为我是觉得Debian在升级的时候会自动升级这些软件包的,那么升级后我的第三方PHP存储库也不用重新再加回来了,因为Debian11的官方存储库PHP版本就是7.4。
但是升级后发现这些PHP的包并没有随系统一起升级:
后来检查了一下发现应该是之前的PHP第三方存储库把php-common这个包给接管了,这个包本来是由官方存储库来处理的,但是第三方的存储库把这个包给升级了。所以Debian在升级的时候把这个包就忽略了,没有做改动。
但实际上后来我特地新开了一台Debian10的机器先从官方存储库装PHP7.3然后再直接升级成11,最终的结果是这些PHP相关的包也没有被升级而是直接被卸载了。。。
由此可见,PHP相关的包并不会随系统升级时一起升级,那这些软件包已经过时了,只能手动卸载了:
apt remove "php7.3-*" apt autoremove
现在需要把之前卸载的PHP7.4重新装回来,由于我发现第三方的PHP存储库内PHP7.4的小版本更新一些,所以我还是重新加回第三方的PHP存储库就没有用官方的库了:
apt -y install apt-transport-https ca-certificates lsb-release wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list apt -y update
安装PHP7.4:
apt -y install php7.4-common php7.4-cli php7.4-cgi php7.4-fpm php7.4-mysql php7.4-sqlite3 php7.4-curl php7.4-mbstring php7.4-imagick php7.4-zip php7.4-xml php7.4-gd
如果需要PHP7.3的话也可以直接通过这个存储库来重新安装。由于我不再需要PHP7.3了就没有安装了。
设置下开机自启:
systemctl enable --now php7.4-fpm
接下来就是MariaDB了,这里比较难受的点在于:追新追的太快了,MariaDB官方的安装脚本和存储库还没做好Debian11的适配。。。只能装官方存储库的版本了:
apt install mariadb-server
设置开机自启:
systemctl enable --now mariadb
最后还剩一个Nginx,需要把PageSpeed和Brotli的模块重新编译一遍。
可以先开一台临时用来编译的机器,安装需要用到的包:
apt -y install git build-essential zlib1g-dev libssl-dev libpcre3-dev libgeoip-dev libgd-dev libxml2-dev libxslt1-dev
创建编译目录/下载pagespeed以及brotli源码:
mkdir -p /opt/build && cd /opt/build wget https://github.com/apache/incubator-pagespeed-ngx/archive/v1.13.35.2-stable.tar.gz tar -xzvf v1.13.35.2-stable.tar.gz cd incubator-pagespeed-ngx-1.13.35.2-stable/ wget https://dl.google.com/dl/page-speed/psol/1.13.35.2-x64.tar.gz tar -xzvf 1.13.35.2-x64.tar.gz cd /opt/build git clone https://github.com/google/ngx_brotli.git cd ngx_brotli git submodule update --init
在生产机器上执行下面的命令查看Nginx版本和编译参数:
nginx -V
例如我的是1.18.0,那么下载同版本的Nginx源码并进入到Nginx的源码目录:
cd /opt/build wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -xzvf nginx-1.18.0.tar.gz cd nginx-1.18.0
配置:
./configure --add-dynamic-module=../incubator-pagespeed-ngx-1.13.35.2-stable --add-dynamic-module=../ngx_brotli --<除去原Nginx的所有add-module参数后,剩下的所有编译参数都应该加在这里>
可能会提示如下信息,输入Y即可:
You have set --with-debug for building nginx, but precompiled Debug binaries for PSOL, which ngx_pagespeed depends on, aren't available. If you're trying to debug PSOL you need to build it from source. If you just want to run nginx with debug-level logging you can use the Release binaries. Use the available Release binaries? [Y/n]
如果configure没问题,那么接下来就可以编译模块了:
make modules
编译完成之后将模块传输到生产机器内:
scp objs/ngx_pagespeed.so root@serverip:/usr/share/nginx/modules scp objs/ngx_http_brotli_filter_module.so root@serverip:/usr/share/nginx/modules scp objs/ngx_http_brotli_static_module.so root@serverip:/usr/share/nginx/modules
启动Nginx并设置开机自启:
systemctl enable --now nginx
以上,就是我这台机器的整个升级过程了。总的来说还是比较顺利的,没遇到什么玄学问题。
可能是我没有把Debian当作DE来用,只是单纯跑个小博客,如果要是装了显卡驱动,还有一堆第三方软件的话,那真的有点听天由命的感觉了。。
最新评论
5211314
能不能教我 一点不会