第五部分系統管理 源代碼與軟件包 安裝

第五部分系統管理  源代碼與軟件包mysql

開放源代碼的軟件安裝與升級
源代碼    +編譯器+目標文件+函數庫=可執行文件 =二進制文件
編譯器  gcc    cc     
編譯工具 make    根據makefile文件     此文件有廠商提供的configure或config軟件來檢測並生成

 

注意看readme 和install  由廠商提供的說明文件(若是安裝不成功)
 configure   程序檢測
一、合適的編譯器
二、所須要的函數庫和依賴的軟件
三、操做系統平臺即linux的核心版本是否適合本軟件
四、核心的表頭定義文件header include是否存在    驅動程序要檢測
 
創建makefile命令./configure
--prefix=PREFIX
指定軟件安裝的目錄   未指定  默認爲/usr/local
--enable-all-clocks
 
--enable-parse-clocks
 
函數庫:/usr/include        /usr/lib      /usr/lib64   不一樣的操做系統  版本  發行版  會有不一樣    
 
 
 
 
 
將源代碼的純文字文件打包壓縮減少容量利於在網絡上傳輸    先以tar打包    而後在乎壓縮技術來壓縮   一般會是gzip和bzip2的壓縮格式  後者壓縮率更高   。
tarball是一個軟件包  解壓後會有源代碼的文件、檢測程序文件  congfiure等   本軟件的安裝說明INSTALL或者README
升級安裝軟件:
緣由 :須要新的功能   
舊版的安全問題
舊版的執行效率問題
更新的方法:
直接源代碼進行編譯
直接以編譯好的二進制程序來安裝   (須要廠商提供)
其中rpm中的yum和dpkg軟件管理的apt線上更新模式都是預先編譯安裝的
tarball安裝流程
1.下載tarball包
2.解壓縮產生源代碼
3.gcc進行源代碼編譯   產生object files目標文件
4.gcc進行函數庫   主   副程序的鏈接    造成主要的二進制文件
5.將二進制文件以及相關的配置文件安裝到本身的主機上面
傳統程序語言c   進行編譯的範例
1.編輯源代碼
vim hello.c
#include <stdio.h>
int main(void)
{
printf("hello world\n");
}
2.編譯
gcc hello.c
./a.out   默認產生的可執行文件
方法二
gcc -c hello.c 編譯hello.c源代碼文件  生成hello.o目標文件
ll hello* 查看
gcc -o hello hello.o    將.o文件生成可執行文件   指定生成hello名稱的二進制文件
./hello 執行生成的名稱爲hello文件
3.主程序  子程序的連接
 
vim thank.c
#include <stdio.h>
int main(void)
{
printf("hello world\n")
thank_2();
}
 
vim thank_2.c
#include <stdio.h>
void thank_2(void)
{
printf("thank you!\n");
}
4.程序的編譯和連接  link
 gcc -c thanks.c thanks_2.c
gcc -o thanks thanks.o thanks_2.o
./thanks
或者加入優化的參數選項
gcc -O -c thanks.c   thanks_2.c
gcc -Wall -c thanks.c thanks_2.c
 
5.呼叫外部函數庫:加入連接的函數庫
vim sin.c
#include <stdio.h>
#include <math.h>
int main(void)
{
float value;
vlaue=sin(3.14/2);
printf("%f\n",value);
}
數學函數庫使用的libm.so這個函數庫   最好在編譯的時候將這個庫文件加入進去      libm.so在編譯的寫法上使用的-lim
編譯時加入額外的函數庫連接的方式
gcc sin.c -lm -L/lib    -L/lib64
./a.out
-lm拆開
l   小寫的L  是加入某個函數庫的意思
m則是libm.so這個函數庫  .a或者.so不須要寫
L的意思是我要的函數庫libm.so須要到/lib或者/lib64裏面去搜索,後面的lib和lib64不須要寫  由於linux默認將庫放在這兩個位置   若是本身定義的庫文件放在其餘的目錄   則須要在這裏指定
include  默認放在usr/include/下面 若是文件並不是放在這裏   就須要利用大i即 I  來指定include文件放置的目錄
例子:gcc sin.c -lm -I/path
 
 
make進行宏編譯
源代碼文件互相調用過多時   gcc用起來會比較麻煩
此時利用make會簡化操做流程
簡化編譯時所須要下達的指令
在編譯完成以後   及修改某個源代碼文件  make僅僅會針對被修改了的文件進行編譯   其餘的目標文件不會變動
最後依照相依性來更新執行文件
1.makefile文件的規則
語法:
target:目標文件1   目標文件2       ( 標籤  創建 調用參數)
<tab> gcc -o 將要創建的執行文件   目標文件1   目標文件2     (具體的命令)
例子:
clean:
rm -f main main.o hello.o  sin_value.o
執行make clean  就會執行makefile文件中clean標籤中的命令
若是想要先清除目標文件   再進行編譯的能夠執行:make clean main 
 
利用shell腳本  變量替換
簡化makefile
vi makefile
LIBS=-lm
OBJS=main.o hello.o sin_value.o
main:${OBJS}
gcc -o ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}
也能夠在命令行中指定環境變量
例如:CFLAGS="-Wall" make clean main
環境變量優先級規則
make指令列後面加上的環境變量爲先
makefile裏面指定的環境變量爲次
shell原來具備的環境變量爲最次
特殊的環境變量
$@表明當前的標籤
例如:
main:${OBJS}
gcc -o $@ ${OBJS}  ${LIBS}   其中$@就表明main
 
tarball管理建議
1.源碼所須要的基礎軟件
gcc或者cc等  編譯器
make及autoconfig等軟件
須要kernel提供的library以及相關的include文件
 
gcc等工具
yum groupinstall "Development Tools"
圖形界面
yum groupinstall "X Sostware Development"
若是軟件較舊
yum groupinstall "Legacy Software Development"
2.源代碼安裝步驟
解壓---閱讀install或readme----創建makefile(configure)----》make編譯等----》make install執行install標籤的命令
3.指令下達方式
./configure 建立makefile文件
make clean 清除遺留的目標文件
make 編譯  創建可執行文件
make install 執行安裝    主要的做用就是將編譯完成的文件放到文件系統中     
若是安裝全部文件到一個獨立的目錄中  好比/usr/local/packages這個目錄  那麼必須手動的將這個軟件的man手冊寫入/etc/man_db.conf中去
前面的每一個步驟都是後面的必要條件
 
4.tarball安裝的建議
/usr/local/src 裏面解壓縮源代碼文件放置的位置
/usr 系統發行版自己的軟件安裝位置
/usr/local 用戶自行安裝的軟件位置   建議
/usr/local/man man命令默認搜索說明文件位置
 
舉例:   apache這個軟件說明的服務器安裝位置
/etc/httpd 配置文件
/usr/lib 庫文件
/usr/bin 執行文件
/usr/share/man 說明文件
若是以tarball來安裝   默認就會變爲
/usr/local/etc
/usr/local/bin
/usr/local/lib
/usr/local/man
其餘的軟件安裝時也會安裝到上面的幾個目錄中   當移除文件時   會很難追查文件的來源,因此建議將軟件安裝到單獨的目錄當中   例如apache安裝到/usr/local/apache/當中   因此目錄就又會變爲
/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man
當刪除軟件的時候   直接執行命令rm -rf /usr/local/apache   就能夠了
可是在執行命令的時候   須要將可執行文件的路徑加入到 PATH變量當中    /usr/local/apache/bin
man page也要加入環境當中  /usr/local/apache/man    加入到/etc/man_db.conf內的40-50行左右處
寫下:MANPATH_MAP /usr/local/apache/bin /usr/local/apache/man
 
5.簡單的範例

cd /usr/local/src
tar -zxvf /root/ntp-4.2...tar.gz
cd net-4.2..
cat INSTALL或者README
./configure --prefix/usr/local/ntp --enable-all-clocls --enable-parse-clocks
make clean;make
make check
make install 
利用patch更新原始代碼
 
函數庫的管理

 

函數庫又分爲靜態和動態兩種
靜態函數庫   :
名稱: 擴展名爲.a    例如:libxxx.a
編譯行爲:    在編譯的時候回直接整合到執行程序當中   利用靜態函數庫編譯成的文件會比較大
獨立執行: 能夠獨立執行  不以來外部的函數庫
升級難度: 難   須要從新編譯所有源代碼
動態函數庫
名稱 擴展名爲.so
編譯行爲 編譯的過程當中程序源代碼中有一個指針指向動態的函數庫    只有當須要函數庫的時候  程序纔會去讀取函 數庫。
獨立執行的狀態:不可以獨立執行   必須攜帶必要的函數庫  而且函數庫的絕對路徑不能改變
升級難度: 當函數庫升級後   執行文件不須要進行從新編譯   前提條件   新舊函數庫的名稱和路徑不能改變
大部分的函數庫都放置在/lib64    /lib目錄下    kernel的函數庫放在/lib/modules裏面
 
ldconfig與/etc/ld.so.conf
增長函數庫的讀取效能,將經常使用到的動態函數庫加載到內存當中  提升讀取速度
方法:
1.在/etc/ld.so.conf裏面寫入動態函數庫所在的目錄    注意不是文件  而是目錄
2.利用ldconfig這個執行文件將/etc/ld.so.conf的資料讀入內存中
3.同時將資料備份一份在/etc/ld.so.cache這個文件中
 
語法
ldconfig [-f conf] [-C cache]
ldconfig [-p]
 
-f conf  某個文件名稱    使用此文件做爲函數庫的取得路徑  而不是/etc/ld.so.conf爲默認
-C cache   暫存函數庫資料   而不是以/etc/ld.so.cache做爲默認值
-p 列出目前全部函數庫資料內容   在/etc/ld.so.cache內的資料
 
舉例
mariadb 庫函數在/usr/lib64/mysql當中   如何讀進cache
vim /etc/ld.so.conf.d/vbird.conf
/usr/lib64/mysql     新增此行
ldconfig     執行
ldconfig -p     查看加載結果
 
 
動態函數庫解析    ldd
判斷某個可執行的文件內含有什麼樣的動態函數庫    利用ldd
語法 ldd [-vdr] [filename]
v  verbose
d 從新將資料有丟失的link點顯示取來
r 將ELF有關的錯誤顯示
舉例:ldd /usr/bin/passwd 找出此程序的函數庫資料
ldd -v /lib64/libc.so.6 找出榆次函數庫相關的其餘函數庫
當安裝rpm軟件包  以非yum方式(自動解決依賴關係)安裝的時候    解決相依賴的關係  須要先ldd查看相依賴函數庫之間的相關性    
 
檢驗軟件的正確性
md5sum       sha1sum    sha256sum
爲防止被惡意篡改須要驗一下文件
/etc/passwd
/etc/shadow
/etc/group
/usr/bin/passwd
/sbin/rpcbind
/bin/login
/bin/ls
/bin/ps
/bin/top
以上文件須要創建shell script的方式來自動檢查指紋  即哈希值
md5sum/sha1sum/sha256sum  [-bct] filename
md5sum/sha1sum/sha256sum  [--status|--warn]  --check filename
相關文章
相關標籤/搜索