記打卡團服務器的一(三)次升級:從 Ubuntu 12.04 到 18.04
正月初六,乘著春節假期的最後一天,我窩在家裡,一鼓作氣,把我的一個業餘專案(見證打卡團)的伺服器,從古老的 Ubuntu 12.04 連續升級了三次,到了最新的 LTS 版本,18.04。 Ubuntu 12.04 -> Ubuntu 14.04 Ubuntu 14.04 -> Ubuntu 16.04 Ubuntu 16.04 -> Ubuntu 18.04 你可能會問,為什麼不直接從 12.04 升級到 18.04 呢?這是因為系統不支援這樣升級,只能兩個大版本一步一步升級。
升級方法
其實三次升級的方法(或者說過程)都是一樣的。網上文章也有很多,我主要參考的是這篇文章 ,一方面是因為這篇文章的作者的伺服器也是在阿里雲上,跟我的一樣,二是因為這篇文章寫得比較清楚,一步一步截圖都有。 在開始之前,可以考慮把 apt 的 sources list 換成國內的映象。如果是阿里雲伺服器,建議換成阿里雲的映象,騰訊雲的伺服器,換成騰訊雲的映象,其他雲的伺服器也類似。如果不是哪個雲的伺服器,可以考慮換成中科大或清華等國內映象。這樣,在升級過程中,下載很多 package 的速度會快很多很多。我的伺服器是阿里雲的,因此換成了阿里雲的映象。 換好之後,執行:
$sudo apt-get update $sudo apt-get upgrade $sudo apt-get dist-upgrade $sudo apt-get install update-manager-core $sudo do-release-upgrade
執行do-release-upgrade
之後,系統升級便開始了,這個過程中會下載很多 package,所以最好保證你的伺服器磁碟剩餘空間是足夠的(>2G 就差不多了)。
在升級過程中,會詢問你很多次“某個檔案已被修改,是使用新系統版本的替換,還是保留當前版本”這樣的問題。如下。
我的選擇是,一律保留當前版本。
途中遇到的幾個問題
JDK8 下載時間太長了
在從 12.04 升級到 14.04 的過程中,系統給 JDK8 的小版本也做了一次升級,從某一個小版本升級到 u201。這個過程是直接從 oracle 的官網下載 JDK8 的安裝包(jdk-8u201-linux-x64.tar.gz)。由於在國內的原因,連線 oracle 官網去下載這個將近 200M 的檔案非常的慢。只有十幾 K 的速度,預估需要 7、8 個小時。這可是不能接受的。由於我沒有在伺服器上面設定 proxy,臨時去配置 FQ 的工作還是比較麻煩的。解決的辦法是,先終止這個升級的過程,用自己的 Mac 下載好那個安裝包檔案,然後找到伺服器上 apt 的快取目錄,scp 過去,然後再次啟動升級,一切就很順利了。
locale 的問題
Locale 的問題,這三次升級以後都遇到了,每次升級完,在命令列執行任何命令,都總是提示:/bin/bash: warning: setlocale: LC_ALL: cannot change locale
當然,如果只是個 warning,那沒太大問題,問題是啟動 postgresql 的時候,也老是提示類似的問題,並且導致 postgresql 啟動不起來。這個問題折騰了好一會,試過很多辦法。有在 environment 裡面加了兩行LC_ALL
和LC_LANG
定義,
LC_ALL=en_US.UTF-8 LC_LANG=en_US.UTF-8
也有在命令列裡面直接定義 export 這兩個環境變數。不過都不管用,我想真正生效的是,切換到 root 使用者(su root
),然後執行locale-gen en_US.UTF-8
。然後再加上上面提到的步驟。最後才解決這個問題。
令我感到奇怪的是,我直接sudo locale-gen ...
是不行的,一定要 su 到 root 使用者才可以。
mount 被鎖住
從 12.04 升級到 14.04 之後,想繼續升級到 16.04,執行do-release-upgrade
,運行了一段時間之後,升級失敗,丟擲一個錯誤。
Calculating the changes Could not calculate the upgrade An unresolvable problem occurred while calculating the upgrade. This can be caused by: * Upgrading to a pre-release version of Ubuntu * Running the current pre-release version of Ubuntu * Unofficial software packages not provided by Ubuntu If none of this applies, then please report this bug using the command 'ubuntu-bug ubuntu-release-upgrader-core' in a terminal. Restoring original system state Aborting Reading package lists... Done Building dependency tree Reading state information... Done
在網上搜了下,提示我檢視錯誤日誌:/var/log/dist-upgrade/main.log
,日誌裡面提示:Dist-upgrade failed: 'E:Unable to correct problems, you have held broken packages.'
但是沒有跟具體的提示,沒有說明是哪個 broken package 導致了這個問題。網上搜了下,找到這個答案
,提示執行grep Broken /var/log/dist-upgrade/apt.log
把 broken 的 package 一個個刪了,但是我在我的伺服器上執行這個命令,grep 出來有 800 多個 broken package,一個個刪,顯然是不現實的。正想放棄的時候,又想到文章開頭提到的那篇文章的作者,說不定他也遇到了這樣的問題,說不定還寫了另外一篇文章。因此翻了下他的部落格,果然,他還寫了一篇把 Ubuntu 從 14.04 升級到 16.04 的文章
。而且文章中也提到了類似的問題,雖然具體的問題描述跟我遇到的不完全一樣,但是我還是按照他說的解決辦法執行了一遍,果然,問題解決了。
我把其中的那段解決問題的文章原封不動的搬過來在這裡:
執行如下命令,檢視包管理策略:
$ apt-cache policy
可以看到如下資訊:
Pinned packages: mount -> 2.20.1-1ubuntu3 linux-image-3.2.0-29-generic -> (not found)
資訊顯示,mount 被鎖定到了版本 2.20.1 上,導致無法升級替換。 我們執行如下命令移除鎖定策略:
$ sudo mv /etc/apt/preferences.d /etc/apt/preferences.d.old
接下來繼續執行升級命令:
$ sudo do-release-upgrade
一路回車,什麼都不填,一切都不更改,大約 20-30 分鐘之後,系統提示重啟。
BTW,也正是由於這位大神的文章在這次升級中對我的巨大幫助,才促使我寫了這篇文章,我想,如果這篇文章能幫助到其他人,也算是一種報恩了。
/run/許可權
第一次系統升級以後,我的一個 rails app 啟動不起來。啟動 server 的命令提示是成功的,但是網站頁面訪問不了。由於我的這個 rails app 是用 nginx reverse proxy 到一個 unix socket(其實就是一個檔案),再到 rails app server 的,於是我懷疑是不是這個 unix socket 建立沒成功。到存放這個 unix socket 檔案所在的目錄下面去看,果然沒有。那麼為什麼這個檔案會建立不成功呢?最常見的問題,就是沒有許可權。ls /the/socket/dir
,顯示 owner 是root
,其他使用者只有可讀許可權。執行
sudo chownwhoami
/the/socket/dir
把這個目錄的 owner 改成當前使用者,然後再次啟動 server,app 就能正常訪問了。
雖然這次升級的途中遇到一些問題,然而回過頭來想想,應該說,總體來說這三次升級還算是順利的。尤其是,如果你對比 Windows 的升級的話,這幾次 Ubuntu 的升級體驗,可以算是絲般順滑了。