# Linux 安裝軟體 ## 透過 Package Manager 安裝 - Package Manager 可以自動從 mirror site 下載、解壓縮 package 的安裝檔案,並把所有檔案放到正確的路徑上 - 通常 Package Manager 會處理好 Dependency,但是有例外,所以安裝前最好先看過官方指引 - Mirror site 上的版本通常是穩定的版本,所以可能不會是最新版 ### Debian/Ubuntu - **更新 Index** ```bash sudo apt update ``` - **升級已安裝的 Package** ```bash sudo apt upgrade # 升級所有 packge sudo apt upgrade <package> # 升級特定 packge ``` - **從 mirror 搜尋並安裝** ```bash sudo apt install <package1> <package2> ... ``` - 會詢問是否確認安裝,並要求輸入 `y` 進行確認,加上 `-y` 可以跳過確認的步驟 - Package 名稱之後加上 `=<version>` 可以**指定安裝的版本** - **從 deb 檔安裝** - deb 是 Debian 等發行版使用的安裝檔案 - 透過 `dpkg` 指令可以解壓縮 deb 檔並安裝 ``` dpkg -i <deb file> ``` - `-i` 代表 install - **移除** ```bash # 不會移除設定檔 sudo apt remove <package1> <package2> ... # 會移除設定檔 sudo apt purge <package> ``` - 注意要看清楚它顯示的訊息,可能會移除掉所有 dependency,導致系統爆炸 - **列出已安裝的 Package** ``` apt list --installed dpkg -l ``` - **查詢 Package 的檔案路徑** ``` dpkg -L <package> ``` - **查詢可以安裝的 Package** ``` apt search <keyword> ``` - 會列出所有名稱和 `keyword` 相符的套件 - 通常會有很多行,可以搭配 `grep` 做更進階的過濾 - 或是從發行版的官網查詢 - Ubuntu: https://packages.ubuntu.com/ - Debian: https://www.debian.org/distrib/packages - **查詢 Package 有哪些可安裝的版本** ```bash # 以下指令都會顯示 package 的詳細資訊 apt-cache policy <package> apt-cache madison <package> apt show <package> ``` - 或是從發行版的官網查詢,網址同上 - **更改使用的 mirror 來源** - Mirror 的設定在 */etc/apt/sources.list* - 修改該檔案的內容可以設定 mirror 的來源 ``` vim /etc/apt/sources.list # 或是 nano /etc/apt/sources.list ``` ### Red Hat/CentOS - **安裝套件** ``` yum install <package> ``` - **升級套件** ```bash # 升級某一套件 yum update <package> # 升級所有套件 yum upgrade ``` - **移除套件** ``` yum remove <package> ``` ## Build From Source - 直接下載 Package 的原始碼,並且自己編譯和設定 - 通常照著 Package 官方提供的指引操作即可 - 大部分 package 用 C/C++ 開發 - 所以編譯前需要修改 package 的 makefile - 通常需要加入 library path、include path、安裝路徑等設定 - 通常還可以加入編譯的優化參數 - **好處** - 可以使用最新的版本 - 有機會透過編譯時的優化提升效能 - **壞處** - 需要自己處理 dependency - 編譯可能需要較多的時間和硬體資源 - 需要自己設定 `PATH`、處理檔案放置的路徑 ## Advanced Issue ### 如何自己架設一個mirror站 1. 安裝同步用的套件 apt-mirror ```linux sudo apt install apt-mirror ``` 2. 修改 /etc/apt/mirror.list > base_path 為放置檔案的地方(ex:/deb) > mirror的位置為http://archive.ubuntu.com/ubuntu ![](https://hackmd.io/_uploads/ByI9vxw1T.png) 3. 鏡像同步 ```linux sudo apt-mirror ``` 4. 安裝apache web server ```linux sudo apt install apache2 ``` ```linux #啟動服務 sudo systemctl start apache2 #自開機後就啟動 sudo systemctl enable apache2 #查看運作狀態 sudo systemctl status apache2 ``` 5. 編輯 Apache 設定檔 /etc/apache2/apache2.conf 6. 確認是否開放 Symbolic link 功能,預設是開放,不需要調整 7. 建立 Symbolic link,指向同步的目錄 ```linux #放置要鏡像的檔案於 /deb 底下 sudo ln -s /deb/mirror/archive.ubuntu.com/ubuntu /var/www/html/ubuntu ``` Reference: https://andersonwang.wordpress.com/2017/09/22/ubuntu-16-04-%E8%87%AA%E8%A1%8C%E5%BB%BA%E7%BD%AE-apt-server-mirror-site-part-1/ ### 假設我發現某個版本的package有問題 需要降級 該怎麼做 ``` linux #以安裝tmux為例 #原始版本為 3.2a-4ubuntu0.2 #降級為 3.2a-4build1 #降級會出現warning為正常現象 sudo apt install tmux=3.2a-4build1 ``` - 檢查版本號 ```linux sudo dpkg -l tmux ``` >左下角ii表示unhold, hi表示hold ![](https://hackmd.io/_uploads/Hkerv87ka.png) - 將套件鎖住無法更新 ```linux #hold v.s. unhold sudo apt-mark hold tmux ``` - 查看哪些套件版本被鎖住 ```linux sudo dpkg --get-selections | grep hold ``` Reference: https://blog.csdn.net/dair6/article/details/121603923 ### 假設我想安裝某個package的指定版本 該怎麼做 ``` linux #以vim為例 #安裝版本號為 2:8.2.3995-1ubuntu2.11 sudo apt install vim=2:8.2.3995-1ubuntu2.11 ``` Reference: https://blog.csdn.net/dair6/article/details/121603923 ### 我該怎麼知道這個package有那些版本可以安裝 >apt-cache 命令可顯示 APT 內部資料庫裡的多種資訊。這些資訊是從 sources.list 檔案內聚集不同來源的快取。於執行 apt update 運作時產生的。 ``` linux #以vim為例 apt-cache madison vim ``` >vim | 2:8.2.3995-1ubuntu2.11 | http://tw.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages >vim | 2:8.2.3995-1ubuntu2.11 | http://tw.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages >vim | 2:8.2.3995-1ubuntu2 | http://tw.archive.ubuntu.com/ubuntu jammy/main amd64 Packages Reference: https://blog.csdn.net/dair6/article/details/121603923 ### (Ubuntu) 如何安裝多個版本的套件並手動切換版本 > symbolic link, 改 profile (修改路徑), (environment module?) 1. 方法1(以gcc為例): i.先查看可以使用的版本(若沒有要用的版本先自行安裝) ```linux sudo ls /usr/bin/gcc* ``` ii.將gcc-11加入alternatives ```linux sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 ``` > /etc/alternatives底下的symbolic link ![](https://hackmd.io/_uploads/r1q2dbD1p.png) iii.選擇gcc版本 ```linux sudo update-alternatives --config gcc ``` ![](https://hackmd.io/_uploads/BJ96_-DJT.png) Reference: https://jackfrisht.medium.com/ubuntu20-04多个版本gcc编译器的切换-4cc5c5b46fc3 2. 方法2: ### (Ubuntu) 如何更換系統下載套件的來源到其他mirror站 1.編輯 /etc/apt/sources.list ex:要把「tw.archive.ubuntu.com」換成「free.nchc.org.tw」 tips:使用vim全文全部取代指令 ```bash #全文(%) #全部(g) #取代(s) :%s/http:\/\/tw.archive.ubuntu.com\/ubuntu/http:\/\/free.nchc.org.tw\/ubuntu/g ``` 2.更新套件列表 ```linux sudo apt update ``` Resource: https://magiclen.org/ubuntu-exchange-source/ - (Gentoo) 假設我架設了NFS讓所有節點共享資料夾/opt/package 該如何設定讓節點可以共用已下載的原始碼包 - (Gentoo) 假設emerge --sync後無法使用emerge更新(emerge --ask --verbose --update --deep --changed-use @world) 出現package dependency conflict 該如何回退到某個時間點來讓emerge能夠更新