2015年5月8日 星期五

Ubuntu 強制移除套件

這件事一開始是這樣的,公司裡主管有裝了 Windows 及 MicroSoft Office 的電腦(或筆記型電腦),資深的同事可能會有裝了 Windows 的筆記型電腦,但沒有 MicroSoft Office 的版權,所以他們可能裝了不同的免費版 Office,像是 Apache 的 OpenOffice, The Document Foundation 的LibreOffice,甚至對岸的同事可能是金山軟件的WPS Office。而像我一樣的菜鳥,就只能用沒有 OS 的準系統加上 Ubuntu ,然後用內建的 Libre Office。可是這麼一來,檔案在大家的手上轉來轉去時,就有可能會打不開、格式跑掉的問題。打不開的話,就不是我能解決的了,公司為了省錢要搞成這樣我也沒辦法。但是格式的話,我就想說是不是有哪一套跟微軟的相容性比較好?(一樣是折衷的辦法,至少讓主管或多數客戶看我的文件是OK的囉,其它的本來就沒辦法。)因此我就把 OpenOffice 給裝進了 Ubuntu,結果效果跟 LibreOffice 幾乎是一樣的,所以我暫時就放棄了。

沒想到就這麼放著,在某一天,系統要更新 LibreOffice 的時候,居然出現了狀況,系統出現了「套件系統損壞,請使用 apt-get install -f 修復」的訊息。但是用了這個指令也沒用。
訊息重點如下:
下列套件將會被升級:
libreoffice-common
升級 1 個,新安裝 0 個,移除 0 個,有 13 個未被升級。
12 個沒有完整得安裝或移除。
需要下載 0 B/19.9 MB 的套件檔。
此操作完成之後,會多佔用 15.4 kB 的磁碟空間。
Do you want to continue? [Y/n] y
準備解開 .../libreoffice-common_1%3a4.2.8-0ubuntu2_all.deb ...
Unpacking libreoffice-common (1:4.2.8-0ubuntu2) over (1:4.2.7-0ubuntu2) ...
dpkg: error processing archive /var/cache/apt/archives/libreoffice-common_1%3a4.2.8-0ubuntu2_all.deb (--unpack):
正要取代 '/usr/bin/soffice',它也是套件 openoffice-debian-menus 4.1.1-9775 的檔案

略…

處理時發生錯誤:
/var/cache/apt/archives/libreoffice-common_1%3a4.2.8-0ubuntu2_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

這時我上網去查,才發現其實 LibreOffice 跟 OpenOffice 是有血緣關係的@@,LibreOffice 是覺得一個開源、非營利的專案卻掛在一家營利的公司下,似乎不太好,才獨立出來的(大概是這樣,細節我也不清楚)。所以它們兩者的程式是有一點重疊性的。所以在 package 的相依性上可能有些衝突。

我上了 Ubuntu 中文論壇去求救,遇到了好心人,認真的幫我想解答,甚至有人幫我架了virtual box 來複製這個問題。經網友的提點,發現重點其實在:
dpkg: error processing archive /var/cache/apt/archives/libreoffice-common_1%3a4.2.8-0ubuntu2_all.deb (--unpack):
正要取代 '/usr/bin/soffice',它也是套件 openoffice-debian-menus 4.1.1-9775 的檔案

這部份上。


所以想法上,就是先把這個 openoffice-debian-menus 移除,但是可能因為套件庫已經有問題,所以使用 apt-get remove 是會有問題的。(log 是網友的實驗,所以是全英文的)
$ sudo apt-get remove openoffice-debian-menus
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
libreoffice-core : Depends: libreoffice-common (> 1:4.2.8) but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

而網友解決的方法是改用 $ sudo aptitude remove openoffice-debian-menus,就可以順利移除。接下來 upgrade libreoffice-common 就沒有問題了。

可是…我的系統裡面沒有 aptitude 這個指令…而套件庫現在的狀況,也沒辦法再裝東西進去。所以又一次卡住。後來我又找了網路上的文章,最後用 dpkg -r --force-depends 來處理。這樣它就會乎略套件的相依性,給它用力的移除就對了。
sudo dpkg -r --force-depends openoffice-debian-menus
這樣就順利的把它給移除了,接下來昇級 libreoffice-common 移除 OpenOffice 就都沒有問題了。

附註:
如果只下了 dpkg --help 的話,因為它的選項太多,所以關於 --force 的說明只有簡單的一行:

--force-... Override problems (see --force-help).
因此如果要看完全的說明,就要像它所寫的,用 dpkg --force-help
~$ dpkg --force-help
dpkg 強制選項 - 發生問題時,程式的行為控制:
警告後繼續: --force-<項目>,<項目>,...
錯誤終止: --refuse-<項目>,<項目>,... | --no-force-<項目>,...
強制項目:
[!] all 設定所有強制選項
[*] downgrade 把套件換成舊版
configure-any 設定和這個套件有關的所有套件
hold 不管保留狀態,處理所有附帶的套件
not-root 即使不是 root,也試著安裝(解安裝)
bad-path PATH 中缺少重要程式,可能是問題
bad-verify 就算套件驗證失敗,也還是安裝
bad-version 即使套件版本錯誤,也繼續進行
overwrite 用一個套件的檔案,取代另外一個套件的檔案
overwrite-diverted 用未移轉的檔案,取代移轉的檔案
[!] overwrite-dir 用一個套件的檔案,取代另一個套件的目錄
[!] unsafe-io 解壓縮時,不執行安全輸出入操作
[!] confnew 永遠採用新的設定檔,不另行詢問
[!] confold 永遠採用舊的設定檔,不另行詢問
[!] confdef 若有新設定檔,則用預設選項,不再詢問。若沒有預設選項,
除非有設定 confold 或 confnew 選項,否則會詢問你
[!] confmiss 永遠安裝缺的設定檔
[!] confask 即使沒有新設定檔,也詢要問不要取代舊設定檔
[!] architecture 即使套件沒有設硬體平台,或硬體平台有誤,也繼續進行
[!] breaks 即使會破壞其它套件,也要安裝
[!] conflicts 允許安裝相衝的討件
[!] depends 把所有相依問題當作警告
[!] depends-version 把所有相依版本問題當作警告
[!] remove-reinstreq 移除需要安裝的套件
[!] remove-essential 移除核心套件

警告 - 使用標記 [!] 的選項,會嚴重破壞系統。
預設啟用標記 [*] 的強制選項。

可以看到,我們用的 “depends” 是屬於會嚴重破壞系統的參數, 所以要小心使用。不過以我這次的狀況,不用也只能還原了…就用吧。

沒有留言:

張貼留言