第五部分系統管理 源代碼與軟件包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