2014年10月20日

即將到來的 /usr 合併

Chakra 在不久之後會有一次將 /lib、/lib64、/usr/lib64 合併到 /usr/lib,/bin 合併到 /usr/bin,以及 /sbin 合併到 /usr/sbin 的大更新(目前位在供測試用的 [testing] 套件庫中),您將會需要進行下列步驟以正確的更新:

驗證

此次的更新包含了新版本的 Linux 核心及 GNU C 函式庫,目前(到編寫這篇文章為止)的版本為 glibc-2.20-4及 linux-3.16.4-1
請以 pacman -Si glibcpacman -Si linux 來觀看套件庫中的版本,此次更新到達穩定套件庫時至少會有與此相同或更新的版本,如果沒有,則您必須等待您的套件庫同步完成。
注意!一旦您決定進行以下的步驟,就請確認每一個步驟都完成了,否則您將會處於無法開機的狀態。
警告絕對不要在這次的更新中使用 --force 參數。

準備

當您利用 pacman -Syu 更新 Chakra 時,您非常有可能會看到 /bin、/sbin、/lib、/lib64與 /usr/lib64的衝突。在您開始之前,請確認您是使用 root 身份來操作 Shell,sudo 在此次的更新中可能會有問題。

檢查殘留下來的檔案

您必須移除以下的兩套檔案:
1.所有在 /lib、/usr/lib64、/lib64、/bin、/sbin 中的不屬於任何軟體包的檔案,您可以透過以下指令來獲取那些檔案的列表:
find /lib /lib64 /usr/lib64 /bin /sbin -exec pacman -Qoq -- {} + > /dev/null
這個命令會搜尋並顯示您在這些目錄下所有的檔案,並可能會顯示像是「錯誤:沒有軟體包擁有 /lib/modules/3.15.5-1-CHAKRA/misc」這樣的訊息。小心的檢查那些檔案並以 root  權限移除那些檔案。通常您會得到一個空白的輸出,或是有一些 VirtualBox 相關的核心模組遺留在 /lib/modules 中。
2.所有在 /lib、/usr/lib64、/lib64、/bin、/sbin 中的不被任何官方軟體包所擁有的檔案,您可以透過以下指令來獲取這些檔案的列表:
pacman -Qqo /bin /sbin /lib /lib64 /usr/lib64 | pacman -Qm -
移除(或是如果可以的話更新)所有上面那個指令所輸出的非官方軟體包,利用下面這個指令: pacman -R 軟體包名稱
如果您真的很需要以上這些軟體包,您也許可以考慮先移除,然後在完成以下的步驟後重新安裝。

更新

sudo su - (進入 root 使用者的 Shell)
pacman -Sy
pacman -Su --ignore glibc,lib32-gcc-libs,filesystem,bash
(此時,如果您仍有 /lib/modules 這個資料夾,請小心檢查裡面的檔案,如果裡面的檔案全部都是舊版核心的模組,您就可以利用 rm -rf /lib/modules 來移除)
pacman -Su --ignore filesystem,bash
pacman -Su --ignore filesystem
pacman -Su

小心的在像這樣的問題中回答 y:: 因為無法解決依賴關係,以下軟體包無法進行更新:
binutils gcc gcc-libs libtool
您想在本次更新中跳過上述軟體包嗎?[y/N] y


Linux 核心也被更新,depmod 和 mkinitcpio 在這時候會顯示一些錯誤訊息,因為正確的核心模組並沒有符號連結。這時候可以安全的忽略它們,但不要重新啟動,否則您的核心會無法開機。

注意:在更新的時候,pacman 可能會檢測到 /lib 的衝突,並顯示下列訊息:
錯誤:無法提交處理 (有衝突的文件)
glibc:/lib 已存在檔案系統中
發生錯誤,沒有軟體包被更新。


這表示您還有一些尚未處理的殘留檔案在/lib 目錄底下,請回到檢查殘留下來的檔案那裡重新檢查並修復它們。

結束

如果上面的更新結束後,每件事情都運作的很好,您的系統也仍可使用,這代表了您可以像平常一樣開啟新的行程。您可以利用下列指令來檢查是否更新成功:
ls -l /lib*
其輸出應該會像是(日期及時間會是您下指令的時間):
lrwxrwxrwx 1 root root 7 Sep 15 16:53 /lib -> usr/lib
lrwxrwxrwx 1 root root 7 Sep 15 16:53 /lib64 -> usr/lib

您仍然需要以重新安裝核心的方式來重建您的核心映像:
pacman -S linux
或是如果您使用的是 LTS 核心:
pacman -S linux-lts
這次 depmod 應該不會再顯示任何錯誤。
有些使用者回報了關於 GRUB 的錯誤,雖然這可能並不是與 glibc 的更新相關,因為這次更新也包含了新版的 GRUB 軟體包,也許您可以重新安裝 GRUB。 對於 GRUB 重新安裝的方法,請見 ArchWiki 中的 GRUB 條目

修正常見的錯誤


未在更新期間使用 root 使用者更新

這可能會造成一些問題,因為新的 bash 是位在 /usr/bin,但在 filesystem 軟體包中的新符號連結尚未被安裝。
在此例中,只要您還有終端機的視窗仍開著,您就可以利用以下指令進入 root shell:
su -s /usr/bin/bash -
然後,您應該可以繼續您的更新過程。

在更新後忘記重建核心

找到一個 Live USB 或 Live CD,在它開機後,按下 Ctrl + Alt + F1(或 F2~F6,取決於 Live 媒體上的系統) 切換到 tty,或是開啟一個終端機模擬器(像是 Konsole、GNOME 終端機、xterm 等),然後執行:
su -
或是
sudo su -
以切換到 root 帳號,您將會需要輸入密碼(通常這會留空或顯示在容易看到的地方,Chakra ISO 的 root 密碼是 root)。
然後您必須掛載您的硬碟,然後 chroot 到裡面以進行核心映像的重建。分割區號碼取決於您的分割區結構。假設您的根目錄位於 /dev/sda1。執行下列指令以設定一個可以 chroot 的掛載點。
mkdir /chakra_root
mount /dev/sda1 /chakra_root(掛載根目錄)
mount -o bind /dev /chakra_root/dev(掛載臨時檔案系統)
mount -o bind /tmp /chakra_root/tmp
mount -o bind /sys /chakra_root/sys
mount -o bind /proc /chakra_root/proc

如果您使用了一個分離的 /boot 分割區,您必須同時掛載它。如果您的電腦是使用 MBR,您可以使用 fdisk -l 來檢查您的分割區,GPT 的話則使用 gdisk。
設定完掛載點後,執行:
chroot /chakra_root
以進入 chroot。然後您就可以用上述的方法重建核心映像。

新聞來源:Usr Merge

沒有留言:

張貼留言