A. 詳解linux軟體安裝中RPM與YUM 區別和聯系
一般Linux軟體安裝有這么幾種方式:
那麼其中rpm與yum有什麼區別呢?
RPM管理支持事務機制。增強了程序安裝卸載的管理。
RPM的功能:打包、安裝、查詢、升級、卸載、校驗、資料庫管理。
1、RPM的缺點
由於Linux中的程序大多是小程序。程序與程序之間存在非常復雜的依賴關系。RPM無法解決軟體包的依賴關系。
2、RPM包
用RPM工具可以將二進製程序進行打包,包被稱為RPM包。RPM包並不是跨平台的。RedHat的RPM包與SUSE的RPM包不能混用。實際上RedHat的安裝,初始軟體也都是使用RPM包進行安裝的。
源程序的命名規范 : name-version.tar.{gz|bz2|xz}
版本號:major.minor.release
例:bash-4.3.1.tar.xz
RPM包的命名規范 : name-version-release.os.arch.rpm
name:程序名稱。
version:程序版本號。
release(發行號):用於標識RPM包本身的發行號,與源程序的release號無關。
os:即說明RPM包支持的操作系統版本。如el6(即rhel6)、centos6、el5、suse11。
arch:主機平台。如i686、x86_64、amd64、ppc(power-pc)、noarch(即不依賴平台)
例:bash-4.3.2-5.el6.x86_64.rpm
3、安裝RPM包
命令格式: rpm -i /PATH/TO/RPM_FILE
一般組合起來使用:-ivh
命令格式: rpm -ivh PATH/TO/RPM_FILE
4、卸載RPM包
命令格式: rpm -e 包名
查詢RPM相關信息
命令格式: rpm -q 包名
查詢所有已經安裝包: rpm -qa
5、RPM的資料庫
資料庫文件位於: /var/lib/rpm
若庫損壞,很多RPM的查詢將無法使用。
YUM客戶端基於RPM包進行管理,可以通過HTTP伺服器下載、FTP伺服器下載、本地軟體池的等方式獲得軟體包,可以從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系。
YUM在安裝RPM時,會從伺服器下載相應包,且緩存在本地。
使用YUM進行RPM包的管理,非常簡單方便。
1、YUM客戶端的使用
YUM客戶端的配置
YUM的配置方式是基於分段配置的。
主配置文件: /etc/yum.conf
YUM的片段配置: /etc/yum.repos.d/*.repo
主配置文件配置了一個特殊的倉庫,名稱為main。main是為其他倉庫提供默認的全局配置的。
配置文件的說明:
查看CentOS-Base.repo配置文件:
對配置文件中的一些配置項作說明:
2、yum命令的使用
yum的命令形式一般是如下: yum [options] [subcommand] [package ...]
yum list相關命令
獲取yum倉庫中所有的包信息。
命令: yum list all
結果說明:
查看yum倉庫中指定包名的軟體包,可以使用通配符。
命令: yum list all mysql*
查看倉庫
查看當前能夠使用的yum倉庫
命令: yun repo list
顯示所有倉庫
命令: yum repo list all
清空本地yum的緩存
yum倉庫若更新,則本地緩存就沒有意義了。所以本地緩存需要清空。
命令格式: yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
手動在本地建立緩存
yum客戶端會下載遠程yum的文件。在本地生成緩存。
命令: yum makecache
安裝應用程序
基本格式: yum [-y] install 包1 包2 ... 包n
說明:
若安裝多個包,則使用包名之間使用空格隔開。
安裝過程中,yum會詢問用戶是否安裝,使用yum -y 選項,表示自動回答為yes。
卸載軟體包
命令格式: yum remove 包1 包2 ... 包n
注意:若該包被依賴,則該卸載可能會導致一些問題。如A依賴B,若卸載B,則A也會被卸載。
上面都是比較常用的命令,如果基本上用過的話那麼在這一塊的內容也就基本達標了。
後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~
B. linux動態庫和靜態庫的區別
接靜態庫其實從某種意義上來說只不過它操作的對象是目標代碼而不是源碼而已。因為靜態庫被鏈接後庫就直接嵌入可執行文件中了,這樣就帶來了兩個問題。
(1)首先就是系統空間被浪費了。如果多個程序鏈接了同一個庫,則每一個生成的可執行文件就都會有一個庫的副本,必然會浪費系統空間。
(2)再者,一旦發現了庫中有bug,挽救起來就比較麻煩了。必須一一把鏈接該庫的程序找出來,然後重新編譯。
而動態庫的出現正彌補了靜態庫的以上弊端。因為動態庫是在程序運行時被鏈接的,所以磁碟上只須保留一份副本,因此節約了磁碟空間。如果發現了bug或要升級也很簡單,只要用新的庫把原來的替換掉就行了。
但是靜態庫的優點:
編譯後的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。
靜態庫的名字一般是libxxx.a(Linux)
動態庫的名字一般是libxxx.so(Linux),有時候也是 libxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號。
C. Linux系統怎麼修改磁碟參數(名稱,盤符等等
1.mknod
用法:mknod設備名稱【bcp】【Major】【Minor】
設備種類,
b:設置設備名稱為外部的外部的存儲設備文件eg:硬碟
c:設置設備名稱為外部輸入設備文件罩枯盯eg:鍵盤/滑鼠
P:設置設備名稱為FIFO文件
Major:主要設備名稱代碼
Minor:次要設備代碼
eg:【~~~】#mknod/dev/hda10310
註:3和10隻有特殊意義的,不可隨意的設置
在linux系統中,所有的設備都是以文件的形式來表示的,也就是通過文件的主與次來表示的,硬碟的主與次如下所示:
硬碟代號主【Major】次【Minor】
/dev/sda30~63
/dev/sdb364~127
/dev/sdc220~63
/dev/sdd2264~127
2.e2label
【~~~~~~】#e2label設備名稱新的Label名稱
【~~~~~~】#e2label/dev/sda1sda1
【~~~~~~】#mpe2fs-h/dev/sda1
該命令的主要的主要作用是用來修改「磁碟的表頭數據」,即磁碟的卷標。但是請注意,如果你剛好有兩個硬碟,如果你修改了卷標,剛好和另外的有個分區有相同的卷標,系統就無法判斷哪個分區是正確的。
這些命令都是不算是特別常用的,常用的命令你可以學習下這里。第2章 新手必須掌握的Linux命令。www.linuxprobe.com/chapter-02.html,最後我覺得還算是寫干貨,對於新手很適合。
3.tune2fs
【~~~~~~~】#tune2fs【-jlL】設備號
-j:將ext2的文件系統轉換為ext3的文件系統
-l:將超級快物和內的數據度出來,該功能類似於mpe2fs-h的功能
-L:修改文件系統的卷標,類似於e2label的功能
eg:【~~敗亮~~~~】#tune2fs-l/dev/sda1
更多的功能請參考mantune2fs
4.hdparm
如硬碟有DMA模式的功能,系統卻沒有啟動它,那麼,硬碟的讀取性能可能會降低一半以上,就可以使用該命令來啟動DMA模式的功能。該命令有很多的高級的參數設置值,所以不建議隨便的修改,否則容易造成硬碟崩潰,使用這個命令,最多的就是啟動DMA功能,並測試硬碟的訪問性能就可以了。
【~~~~~~~】#hdparm【-icdmXTt】設備名稱
-i:將系統啟動過程中使用的本身的核心的驅動程序來測試硬碟的測試值取出來,但是這些值不一定是正確的
-d:設置是否啟用dma模式,-d1為啟動,-d0為取消。
D. Linux 0.11內核編譯錯誤記錄
現象1: 提示gas gld 比識別
措施: gnu編譯器發展到後來,越來越流行,更多使用別名為 as ld gcc等.
現象2: 提示位元組對齊需要是 2的倍數
措施: 具體解決方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替換align 2 為 align 4(align 3 替換為 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s
現象3: -fcombine-regs -mstring-insns選項不識別
措施: 此兩個選項已經過時,直接去掉即可
現象4: warning 特別多
措施: 將-Wall 替換為 -w
現象5: __stack_chk_fail 未定義
措施: 去網上搜了一下,在Makefile中的$(CFLAGS)後面加上-fno-stack-protector,即不需要棧保護
現象6: main.c 中_syscall0重復定義
措施: main.c static inline _syscall0(int, fork) 去掉static即可
現象7: 提示內嵌匯編不符合語法限制
措施: 類似的問題在後面編譯中出現好多,C內嵌匯編的格式 asm (匯編語句:輸入寄存器:輸出寄存器:可能被修改的寄存器),最新的GCC規定 輸入或輸出寄存器不能出現在可能被修改的寄存器中,目前看到網上的方法是把所有類似問題的可能被修改的寄存器全部刪掉 解決方案:find -type f -exec sed -i 's/:"w{2}"(,"w{2}") )/:) /g' {} ; 其中's/:"w{2}"(,"w{2}") /:/g'
現象8: 在 control.c 中清楚定義了 static unsigned char attr = 0x70 ,而在鏈接 control.o 時,卻爆出 attr未定義。
措施: 用 nm -C control.o 查看其符號,發現attr確實處於未定義狀態。故單獨編譯一個小程序定義靜態變數,查看其 .o 文件中,發現靜態變數定義正常。故考慮為編譯選項差異導致,最終發現因為 -O 編譯優化選項導致,目前處理方式是去掉該選項。
現象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通過分析編譯列印信息,發現編譯時沒有加入頭文件路徑 -Iinclude
現象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找發現此函數定義在buffer.c 中,且為內聯函數, 故嘗試將其更改為普通函數, 然後編譯通過.
現象11: 編譯 build.c 時報錯:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name 『__gnuc_va_list』
措施: 分析發現時此系列錯誤均由 -Iinclude 選項導致, 而該選項在 想像9 中加入, 故考慮去掉該選項, 直接在build.c 中加入 MAJOR 宏定義.
E. major minor linux 重啟會變嗎
linuxmint這個發行版的問題,它的X運行會自動重啟,但好在會自動保存東西,你可以換Ubuntu試試,就是太臃腫了
F. 在linux中,MINOR()函數是干什麼的呢返回值是什麼
dev_t dev;/*設備號,dev_t實質是一個32位整,高12位為主設備號,低20位為次設備號*/
提取主設備號的方法:MAJOR(dev_t dev)
提取次設備號的方法:MINOR(dev_t dev)
生成dev_t的方法:MKDEV(int major,int minor)