由於實驗需要,最近獲得了一個實驗室服務器的賬號,平常主要通過 ssh 進行遠程登陸進行實驗。一方面,遠程登錄的機器只提供終端界面,一般只通過命令行進行任務操作;另一方面,由於是多人共享服務器,故而個人賬號並不具備 root 權限,平時在個人主機上肆無忌憚 sudo 進行操作以及大不了重裝的做法顯然不太合適。目前遇到的一個問題就是由於缺少 root 權限,無法直接通過包管理工具進行某些軟件的安裝。這里主要記錄的是通過源代碼編譯的方式在遠程登陸的主機上安裝所需的如 GNU M4、autoconf、automake 等程序的方法。
0.簡介
在個人主機上安裝程序時,用戶可以使用 apt install xxx 命令安裝所需要的軟件工具( 需要 root 權限,個人用戶一般用 sudo 指令即可),且包管理工具會自動為用戶配置好當前待安裝的軟件所需要的依賴軟件,使用起來較為方便和簡潔。新安裝的可執行文件一般存放在目錄 /usr/bin 中( distribution發布者提供的軟件 ),而用戶自行下載編譯安裝的軟件一般位於 /usr/local/bin ( 非distribution默認提供者提供的軟件 )目錄下,這些軟件相應的頭文件等數據則存放在 /usr/include 和 /usr/local/include 文件夾下。由於上述目錄位於每個用戶的環境變量 PATH 中,故而具備 root 權限的用戶安裝好程序后,其他用戶也可直接使用這些程序。
sudo apt install package-name //安裝 package-name 以及其所依賴的相關程序
但當許多用戶共享同一台服務器時,此時可能只有系統管理員具備 root 權限,單個用戶無法直接通過 apt install 命令安裝所需的軟件( 普通用戶不具備 sudo 權限 ),普通用戶新安裝的程序也無法放置在 /usr/bin 和 /usr/local/bin 目錄下( 普通用戶僅具有對上述目錄的讀和執行權限 ),這樣避免了單個用戶的行為改變系統的一般環境,但也為普通用戶的環境配置設置了一定的障礙。這種情況下,一般需要用戶通過源碼手動編譯程序,並將可執行程序放置在自己的主目錄下,從而配置個人的開發環境。下面以安裝 GNU M4 為例,記錄通過源代碼編譯的方式在遠程登陸的主機上安裝程序的過程。
1.在對應程序的官網下載源代碼壓縮包
首先在本地下載對應程序的安裝包。以安裝 GNU M4 為例,可通過瀏覽器搜索 GNU M4 ,找到 GNU M4 官網。
通過其中的下載頁面下載較新版本的 GNU M4 源碼包,也就是 xx.tar.xx 文件。
注:Linux 終端環境下,也可以直接通過命令行操作直接進行文件的上傳和下載,Linux 命令 curl 和 wget 支持在終端環境下的文件傳輸功能。
2. 將下載的源碼包傳送至服務器端並解壓
想要在遠程登陸的服務端安裝對應的程序,則首先需要將文件傳輸至遠端服務器文件夾下。用戶可通過 ftp 服務或 scp 指令完成文件壓縮包的傳輸。若遠端服務器的 ftp 服務是開啟的,則用戶可在本地安裝 ftp 客戶端,並連接遠端服務器,實現文件的傳輸功能。或者用戶可直接通過 Linux 內置的命令 scp 進行文件的傳輸,關於 scp 命令可以參考筆者的另一篇記錄遠程登錄與文件傳輸指令——ssh與scp。
scp ~/Downloads/xxx.tar.xxx user@1.2.3.4:~ //將本地路徑指定的文件傳輸至位於地址 1.2.3.4 處的 user 用戶的主目錄,執行時會首先要求進行密碼驗證
完成文件源碼的傳輸后,通過 ssh 命令遠程登陸服務器賬戶,並通過終端命令行進行文件的解壓操作。
對於后綴為 .tar.gz 的文件 :
tar -xzvf xxx.tar.gz //解壓文件至當前目錄下,可增加 -C dir 參數指定解壓路徑
對於后綴為 .tar.bz2 的文件:
tar -xjvf xxx.tar.bz2 //解壓文件至當前目錄
3. 程序的編譯和安裝
將上述文件壓縮包解壓縮后,即可進入解壓后的文件目錄進行程序的編譯和安裝。Linux 平台下程序的安裝包一般會有關於安裝和編譯的說明文件,如 README.md 和 INSTALL 文件等,用戶可以參考其中的說明進行操作。這里后續的安裝指令即參考 GNU M4 文件的 INSTALL 文件的說明,其他的常用基礎工具如 autoconf、automake 的安裝與其過程大致相同。后續的用戶目錄均使用 /home/xxx,在實際操作時請替換為用戶的實際目錄 /home/username。
首先通過 echo $PATH 命令查看當前用戶的環境變量值,找到可存放個人用戶的可執行文件的目錄。之前介紹中有說明,普通用戶不具備對 /usr/bin 和 /usr/local/bin 的寫入權限,故而一般需要手動安裝的可執行程序放在自己的主目錄下,環境變量 PATH 中記錄的是用戶在執行某個命令時,系統依照其中的記錄搜尋可執行文件的目錄的順序,普通用戶的 PATH 變量的第一個目錄即為本用戶可用的可執行文件的存放位置。
echo $PATH //輸出本用戶環境變量 PATH 的值
在筆者的環境中,在遠端服務器的 PATH 變量的值如如所示,在安裝程序時可以將可執行程序放置在上述 /home/xxx/.local/bin 或 /home/xxx/bin 目錄下( 不同環境情況可能不同 )。這樣當后續需要通過命令行運行可執行程序或者其他程序尋找所依賴的可執行程序時即可通過 PATH 變量的記錄尋找到存放在上述目錄中的可執行程序。
在確定可用的可執行文件的安裝目錄后,可依次執行以下命令完成安裝過程。
檢查系統環境並進行某些編譯設置:
./configure --prefix=/home/xxx/.local //檢查當前安裝所需要的一些必要環境,並設置安裝目錄為 prefix 指定的目錄下的 bin 目錄( 可執行程序 )和 include 目錄( 頭文件等 )
根據 INSTALL 文件的說明,默認安裝時可執行程序會被安裝於 /usr/local/bin 目錄下,對應的頭文件安裝於 /usr/local/include 目錄下,而由於普通用戶不具備對上述目錄的寫入權限,故而需要指定新的安裝參數,將安裝目錄調整為用戶的主目錄。這里 --prefix 參數指定最終的安裝目錄,其參數必須為絕對路徑。如若指定路徑 --prefix=/home/xxx/,則安裝后的可執行文件位於 /home/xxx/bin 文件夾下,而頭文件位於 /home/xxx/include 文件夾下。
編譯生成可執行文件:
make //根據 makefile 編譯生成可執行程序
安裝可執行程序
make install //安裝編譯好的可執行程序
上述指令完成后,在沒有報錯的情況下即完成了安裝過程,用戶此時應該可以在指定的可執行文件目錄中看到對應的可執行文件。在實際安裝某個軟件時,需通過上述步驟,依次按依賴條件安裝某個軟件所需要的基礎工具,最后即可完成對應軟件的安裝過程。
4.其他軟件的安裝
在安裝好特定軟件所依賴的基礎工具后,則可進行特定軟件的安裝。但此時需要注意,已安裝好的依賴工具的可執行程序和相關文件如頭文件、so庫等均位於之前安裝時通過 --prefix 參數指定的目錄下,在筆者的實踐環境中即 /home/xxx/.local 目錄下的 /bin、/lib和/include 目錄。上述目錄並不是編譯器在進行編譯時的默認搜索目錄,故而在后續的安裝過程中,在 configure 步驟之前需要在配置中首先指定編譯過程中相關文件如頭文件、so庫文件所存放的非默認路徑,才能順利完成軟件的編譯過程。
用戶可以通過 ./configure --help 來查看通過 configure 進行環境配置時可以指定的參數。
./configure --help //查看進行 configure 時可以指定的參數
筆者環境下的部分結果如圖所示,用戶可通過這些環境變量來設置編譯器尋找所需頭文件、so文件的非標准路徑。
設置所需的環境變量,以確保編譯過程能夠正確尋找到所需的相關文件。其中,應指定頭文件和 so 文件的存放位置,從而保證編譯過程中編譯器能夠找到所需的文件,同時也需要為鏈接器指定 so 文件的位置,以便后續執行指令時需要的 so 文件能夠被順利加載進內存中
export CPPFLAGS='-I/home/xxx/.local/include' //設置編譯選項,-I 參數指定編譯過程中首先在給定目錄中搜索所需的頭文件 export LDFLAGS='-L/home/xxx/.local/lib -Wl,-rpath=/home/xxx/.local/lib' //設置鏈接選項,-L 參數指定鏈接過程中首先在給定目錄中搜索需要的so庫文件,-rpath 參數指定一個非默認的運行時庫的搜索路徑
上述參數設置時,若需要指定多個特定的目錄,則需要通過多個 -I/L 參數進行指定.對於 LDFLAGS ,其中的 -Wl 選項表示后續參數為鏈接器 ld 的指定參數,-rpath=dir 指定一個非默認的運行時庫的搜索路徑。更多編譯和鏈接過程使用的參數可參考筆者的記錄Linux下編輯、編譯、調試命令總結——gcc和gdb描述和網上資料。
在設置完成后,正常的進行步驟3中所描述的 configure 、make 和 make install 安裝過程即可。
5.其他選擇
理論上,通過源碼安裝的方式可以安裝所有開源的應用軟件,但是手動安裝應用的過程需要用戶自行解決安裝包之間的依賴關系,比如筆者在通過源碼編譯 git 的過程中就需要首先通過源碼安裝 m4 、autoconf、automake、openssl、zlib 以及 curl,這樣才能保證編譯出來的 git 具備大多數的常用功能,因為在 configure 過程中,腳本會檢查當前系統上支持的軟件和庫的可用狀況,若某些模塊需要的庫不存在,那么對應的模塊可能並不會被編譯,最終 git 也就無法使用這些模塊的功能。筆者之前便由於編譯出來的 curl 庫不支持 https 協議,使得最終編譯生成的 git 不支持通過 https 指定的網址進行 git clone 操作,從而為操作帶來一定的麻煩。總的來說,通過源碼編譯軟件的方式能夠解決問題,但想對來說比較原始和笨拙,故而用戶也可以根據自己的情況選擇一些替代方案。
用戶也可以安裝 pip 來進行軟件包的安裝和管理。pip 的官方安裝教程在這里。用戶可通過本地下載好 get-pip.py 文件后通過 ftp 傳送至遠端服務器,也可直接在服務器端通過 wget 或 curl 命令進行下載。在安裝過程中,需要指定 --user 命令,設置 pip 安裝在本用戶目錄下。
python get-pip.py --user //進行 pip 的本地安裝
對於使用服務器環境進行以 Python 為主的計算和分析任務的情況,用戶可安裝 Anaconda 來進行相關包的安裝和管理,在不具備 root 權限的條件下進行相關的開發和工作。可以直接在本地下載 Anaconda 的安裝腳本,並通過 ftp 傳送至遠端服務器,再通過命令行進行安裝過程。Anaconda 官網的安裝教程在這里。Anaconda 安裝完成后,環境變量 PATH 會增加一項 /Path/to/Anaconda/bin ,該目錄位於系統安裝的 python 目錄之前( /usr/bin ),故而后續使用 python 相關的命令時,運行的都是該目錄下包含的 python 工具,其中包含常用的 Python 相關工具包括 python、python3 和 pip 等。
bash /Path/to/Anaconda3-5.3.0-Linux-x86_64.sh //在下載好安裝包后,命令行安裝 Anaconda3
在安裝好上述工具后,即可直接通過上述軟件提供的包管理工具進行軟件的安裝和管理,pip 和 conda 的常用命令記錄如下。
pip 的常用命令
pip install package_name //安裝 package_name 對應的包 pip uninstall package_name //卸載 package_name 對應的包 pip list //顯示所有已安裝的包 pip show package_name //顯示某個包的詳細信息
conda 的常用命令
conda install package_name //安裝 package_name 對應的包 conda remove package_name //卸載 package_name 對應的包 conda list //顯示所有已安裝的包 conda search name //搜索 name 對應的包,name 可為目標包名的一部分 conda update package_name //更新 package_name 對應的包
參考資料:
ask ubuntu - How to add libraries path to the ./configure command?
初學python者自學anaconda的正確姿勢是什么??問題-猴子的回答( 記錄時為第一個回答 )