當前位置:首頁 » 編程軟體 » lvm源碼編譯

lvm源碼編譯

發布時間: 2023-06-14 00:42:25

❶ 在linux的多線程通信中的問題!求指教!

你的問題在於多重定義,根源在於源文件沒有加
#ifndef XXX
#def XXX

你的code

#endif
一個源文件被編譯兩次

❷ 如何學習編譯內核

我用的是RedHat9.0, 根據第一貼 "2.4->2.6內核升級指南", 首先需要把必要的軟體包都升級到要求的版本以上, 經過折騰, 有的是直接用rpm -Uvh 或 rpm -ivh, 有的是直接用源代碼編譯, 總算把大部分軟體包都升級了. 有一個軟體包oprofile死活裝不上, 用rpm裝的時候出來這樣的錯誤:
error: Failed dependencies:
libc.so.6(GLIBC_2.3.4) is needed by oprofile-0.8-0.20040121.3
可是我的/lib目錄里明明有
lrwxrwxrwx 1 root root 13 8月 2 10:45 libc.so.6 -> libc-2.3.2.so
(我已經經歷過N次這樣的錯誤了, 這是我非常痛恨rpm的主要原因.)
改用源代碼編譯的時候, make的時候出來這樣的錯誤:
The present kernel configuration has moles disabled.
Type 'make config' and enable loadable mole support.
Then build a kernel with mole support enabled.

TNND, RedHat9預設的內核編譯居然是moles disabled!!!我折騰來折騰去就是想把2.4.20-8的內核升級到2.6.12.4去, 到頭來還得讓我先編譯原來2.4.20-8的內核? 先把這事放一放, oprofile說不定不是很有用的模塊.

接下來順利地把mole-init-tools升上去了. 然而在升級mkinitrd的時候又碰到了致命的問題.
根據說明, 要想升級mkinitrd, 首先要升級lvm2和device-mapper, 用rpm -Uvh升級lvm2的時候出來一大堆的錯誤:
error: Failed dependencies:
libdevmapper.so.1.00 is needed by lvm2-2.00.15-2
libdevmapper.so.1.00(Base) is needed by lvm2-2.00.15-2
libselinux.so.1 is needed by lvm2-2.00.15-2
lvm < 1.0.3-19 conflicts with lvm2-2.00.15-2
看來要先裝device-mapper再裝lvm2, 另外lvm與lvm2沖突, 要先卸載lvm.
那就卸載lvm吧, NND, lvm is needed by (installed) mkinitrd-3.4.42-1
顧不得了, 用rpm -e -nodeps卸載. 不過現在還是先把device-mapper裝好, 再收拾lvm2.

會過頭來, 用rpm升級device-mapper, 結果出來
error: Failed dependencies:
libselinux.so.1 is needed by device-mapper-1.00.14-3
查了一下, 機器上卻是沒有libselinux.so.1, 在網上盪了一個rpm軟體包, 結果又是這樣一個錯誤,
error: Failed dependencies:
libc.so.6(GLIBC_2.3.4) is needed by libselinux-1.11.4-1

我不知道我機器里的libc.so.6發了什麼豬瘟, 看來是因為我機器里的libc.so.6-->libc-2.3.2.so不是GLIBC_2.3.4.

只好再到網上去盪了一個glibc的軟體包, 用rpm -Uvh升級的時候, 好了, 出來一大堆沖突

package glibc-32bit-9-200508050455 is intended for a x86_64 architecture file /lib/i686/libc.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/i686/libm.so.6 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/i686/libpthread.so.0 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/ld-linux.so.2 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9
file /lib/libBrokenLocale.so.1 from install of glibc-32bit-9-200508050455 conflicts with file from package glibc-2.3.2-11.9

❸ linux內核模塊如何開始和結束

GRLB 載入了內核之後,內核首先會再進行二次系統的自檢,而不一定使用 BIOS 檢測的硬體信息。這時內核終於開始替代 BIOS 接管Linux的啟動過程了。

內核完成再次系統自檢之後,開始採用動態的方式載入每個硬體的模塊,這個動態模塊大家可以想像成硬體的驅動(默認 Linux 硬體的驅動是不需要手工安裝的,如果是重要的功能,則會直接編譯到內核當中;如果是非重要的功能,比如硬體驅動會編譯為模塊,則在需要時由內核調用。不過,如果沒有被內核硬體,要想驅動,就需要手工安裝個硬體的硬塊了。具體的安裝方法會在後續章節中介紹)。

那麼,Linux 的內核到底放在了哪裡呢?當然是 /boot 的啟動目錄中了,我們來看看這個目錄下的內容吧。

[root@localhost ~]#ls /boot/
config-2.6.32-279.el6.i686
#內核的配置文件,內核編譯時選擇的功能與模塊
efi
#可擴展固件介面,為英特爾為全新PC固件的體系結構、介面和服務提出的建議標准
grub
#啟動引導程GTUB的數據目錄
initramfe-2.6.32-279.el6.i686.img
#虛擬文件系統(CentOS 6.x 中用initramfs替代了initrd,但功能是一樣的)
lost+found
故boot分區的備份目錄
symvers-2_6.32-279.el6.i686.gz
#模塊符號信息
System.map-2.6.32-279.el6.i686
#內核功能和內存地址的對應列表
vmlinuz-2.6.32-279.el6.i686
#用於啟動的Linux內核。這個文件是一個壓縮的內核鏡像


我們已經知道,Linux 會把不重要的功能編譯成內核模塊,在需要時再調用,從而保證了內核不會過大。在多數 Linux 中,都會把硬體的驅動程序編譯為模塊, 這些模塊保存在 /lib/moles/ 目錄中。常見的 USB、SATA 和 SCSI 等硬碟設備的驅動,還有一些特殊的文件系統(如 LVM、RAID 等)的驅動,都是以模塊的方式來保存的。

如果 Linux 安裝在 IDE 硬碟之上,並且採用的是默認的 ext3/4 文件系統,那麼內核啟動後載入根分區和模塊的載入都沒有什麼問題,系統會順利啟動。但是如果 Linux 安裝在 SCSI 硬碟之上,或者採用的是 LVM 文件系統,那麼內核(內核載入入內存是啟動引導程序 GRUB 調用的,並不存在硬碟驅動不識別的問題)在載入根目錄之前是需要載入 SCSI 硬碟或 LVM 文件系統的驅動的。

SCSI 硬碟和 LVM 文件系統的驅動都放在硬碟的 /lib/moles/ 目錄中,既然內核沒有辦法識別 SCSI 硬碟或 LVM 文件系統,那怎麼可能讀取 /lib/moles/ 目錄中的驅動呢?Linux 給出的解決辦法是使用 initramfs 這個虛擬文件系統來處理這個問題。

initramfe虛擬文件系統

CentOS 6.x 中使用 initramfs 虛擬文件系統取代了 CentOS 5.x 中的 initrd RAM Disk。它們的作用類似,可以通過啟動引導程序載入到內存中,然後會解壓縮並在內存中模擬成一個根目錄,並且這個模擬的文件系統能夠提供一個可執行程序,通過該程序來載入啟動過程中所需的內核模塊,比如 USB、SATA. SCSI 硬碟的驅動和 LVM、RAID 文件系統的驅動。

也就是說,通過 initramfs 虛擬文件系統在內存中模擬出一個根目錄,然後在這個模擬根目錄中載入 SCSI 等硬體的驅動,就可以載入真正的根目錄了,之後才能調用 Linux 的第一個進程 /sbin/init。

Initramfs 虛擬文件系統主要有以下優點:

  • initramfs 隨著其中數據的増減自動増減容量。

  • 在 initramfs 和頁面緩存之間沒有重復數據。

  • initramfs 重復利用了 Linux caching 的代碼,因此幾乎沒有増加內核尺寸,而 caching 的代碼已經經過良好測試,所以 initramfs 的代碼質量也有保證。

  • 不需要額外的文件系統驅動。


  • 其實大家只需要知道 initramfs 是為了在內核中建立一個模擬根目錄,這個模擬根目錄是為了可以調用 USB、SATA、SCSI、LVM、RAID 等硬碟介面或文件系統的驅動模塊,載入了驅動模塊後才可以載入真正的系統根目錄。我們可以通過示意圖 1 來表示這個過程。


  • [root@localhost~]#mkdir/tmp/initramfs
    #建立測試目錄
    [root@localhost~]#cp/boot/
    initramfs-2.6.32-279.el6.i686.img/tmp/initramfs/
    #復制initramfs文件
    [root@localhost~]#cd/tmp/initramfs/
    [root@localhostinitramfs]#file
    initramfs-2.6.32-279.el6.i686.img
    initramfe-2.6.32-279.el6.i686.img:gzipcompressed
    data,fromUnix,lastmodified:
    WedApr1021:49:342013,maxcompression
    #查看文件類型,發現這個文件是一個使用gzip命令打包的壓縮包
    [root@localhostinitramfs]#mvinitramfs-2.6.32-279.el6.i686.imginitramfs-2.6.32-279.el6.i686.img.gz
    #修改文件的擴展名為.gz
    [root@localhostinitramfs]#gunzip
    initramfs-2.6.32-279.el6.i686.img.gz
    #解壓縮
    [root@localhostinitramfs]#ls
    initramfs-2.6.32-279.el6.i686.img
    [root@localhostinitramfs]#file
    initramfs-2.6.32-279.el6.i686.img
    initramfe-2.6.32-279.el6.i686.img:ASCIIcpioarchive(SVR4withnoCRC)
    #查看文件類型,使用cpio命令的壓縮文件
    [root@localhostinitramfs]#cpio-ivc<initramfs-2.6.32-279.el6.i686.img
    #解壓縮
    [root@localhostinitramfs]#ll
    總用量34512
    drwxr-xr-x.2rootroot40964月2412:10bin
    drwxr-xr-x.2rootroot40964月2412:10cmdline
    drwxr-xr-x.3rootroot40964月2412:10dev
    -rw-r--r--.1rootroot194月2412:10dracut-004-283.el6
    drwxr-xr-x.2rootroot40964月2412:10emergency
    drwxr-xr-x.7rootroot40964月2412:10etc
    -rwxr-xr-x.1rootroot89624月2412:10init
    drwxr-xr-x.2rootroot40964月2412:10initqueue
    drwxr-xr-x.2rootroot40964月2412:10initqueue-finished
    drwxr-xr-x.2rootroot40964月2412:10initqueue-settled
    drwxr-xr-x.2rootroot40964月2412:10
    initqueue-timeout
    -rw-r--r--.1rootroot352353284月2412:09initramfs-2.6.32-279.el6.i686.img
    drwxr-xr-x.9rootroot40964月2412:10lib
    …省略部分輸出…


    #這就是initramfs虛擬文件系統中的內容,和根目錄是不是很像

關機或者某些進程停止,對應的內核模塊就會結束。更多知識請網路《Linux就該這么學》

❹ linux里lvm 用來干什麼

對於Linux用戶而言,在安裝一台Linux機器的時候,遇到的問題之一就是給各分區估計和分派足夠的硬碟空間。無論對一個正在為伺服器尋找空間的系統管理員,還是一個磁碟即將用盡的普通用戶來說,這都是一個非常常見的問題。解決的方法通常是使用符號鏈接,或者一些調整分區大小的工具(比如parted)。但是,這只是一個暫時性的解決辦法,不久,我們又會面臨同樣的問題。

如果你是一個站點的系統管理員,管理著數量眾多的、連接在Internet之上的伺服器,那麼你每關機一分鍾,都會給公司帶來很大損失。此外,使用這種方法,在修改了分區表之後,每一次都得重新啟動系統。LVM(邏輯卷管理程序)可以幫助我們解決這些問題。

LVM簡介

Linux LVM可以使管理工作更加輕松。相對於硬碟和分區,LVM是從更高的層次來看待存儲空間的。在使用LVM之前,先來看一些將要使用到的相關概念。

物理卷

物理卷是指硬碟分區或者從邏輯上看起來和硬碟分區類似的設備(比如RAID設備)。

邏輯卷

一個或者多個物理卷組成一個邏輯卷。對於LVM而言,邏輯卷類似於非LVM系統中的硬碟分區。邏輯卷可以包含一個文件系統(比如/home或者/usr)。

卷組

一個或者多個邏輯卷組成一個卷組。對於LVM而言,卷組類似於非LVM系統中的物理硬碟。卷組把多個邏輯卷組合在一起,形成一個可管理的單元。

document.body.clientWidth-450) {this.height=(document.body.clientWidth-450)*this.height/this.width;this.width=document.body.clientWidth-450}" border="0">

LVM工作方式

下面來看一看LVM到底是怎樣工作的。每一個物理卷都被分成幾個基本單元,即所謂的PE(Physical Extents)。PE的大小是可變的,但是必須和其所屬卷組的物理卷相同。在每一個物理卷里,每一個PE都有一個惟一的編號。PE是一個物理存儲里可以被LVM定址的最小單元。

每一個邏輯卷也被分成一些可被定址的基本單位,即所謂的LE(Logical Extents)。在同一個卷組中,LE的大小和PE是相同的,很顯然,LE的大小對於一個卷組中的所有邏輯卷來說都是相同的。

在一個物理卷中,每一個PE都有一個惟一的編號,但是對於邏輯卷這並不一定是必需的。這是因為當這些PE ID號不能使用時,邏輯卷可以由一些物理卷組成。因此,LE ID號是用於識別LE以及與之相關的特定PE的。正如前面所提到的,LE和PE之間是一一對應的。每一次存儲區域被定址訪問或者LE的ID被使用,都會把數據寫在物理存儲設備之上。

你可能會覺得奇怪,有關邏輯卷和邏輯卷組的所有元數據都存到哪兒去了。類似的在非LVM系統中,有關分區的數據是存儲在分區表中,而分區表被存儲在了每一個物理卷的起始位置。VGDA(卷組描述符區域)功能就好象是LVM的分區表,它存儲在每一個物理卷的起始處。

VGDA由以下信息組成:

·一個PV描述符
·一個VG描述符
·LV描述符
·一些PE描述符

當系統啟動LV時,VG被激活,並且VGDA被載入至內存。VGDA幫助識別LV的實際存儲位置。當系統想要訪問存儲設備時,由VGDA建立起來的映射機制就用於訪問實際的物理位置來執行I/O操作。

開始工作

下面具體看一看如何使用LVM。

第一步:配置內核。在安裝LVM之前,內核之中應該有LVM模塊,可以使用以下的步驟來完成:

#cd /usr/src/linux
#make menuconfig

選擇Multi-device Support (RAID and LVM)子菜單,選中以下兩個選項:


[*] Multiple devices driver support (RAID and LVM)
< *> Logical volume manager (LVM) Support.

復制代碼

注:如果在安裝Linux系統時已經安裝了LVM相關軟體包,上面幾步操作可以省略掉,直接到第二步.

第二步:檢查驅動器上空閑硬碟空間的總量。這可以通過以下命令來未完成:

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 3.1G 2.7G 398M 87% /
/dev/hda2 4.0G 3.2G 806M 80% /home
/dev/hda5 2.1G 1.0G 1.1G 48% /var

第三步:在硬碟上創建一個LVM分區。使用fdisk或者其它的分區工具來創建一個LVM分區。Linux LVM的分區類型為8e。

# fdisk /dev/hda
press p (to print the partition table) and n (to create a new partition)

第四步:創建一個物理卷。下述命令將在分區的起始處創建一個卷組描述符:

# pvcreate /dev/hda6
pvcreate -- -physical volume "/dev/hda6" successfully created
# pvcreate /dev/hda7
pvcreate- -- physical volume "/dev/hda7" successfully created

第五步:創建一個卷組。通過下面的方法創建一個新的卷組,並且添加兩個物理卷:

# vgcreate test_lvm /dev/hda6 /dev/hda7

vgcreate- -- INFO: using default physical extent size 4 MB
vgcreate- -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate- -- doing automatic backup of volume group "test_lvm"
vgcreate- -- volume group "test_lvm" successfully created and activated

上述命令將創建一個名為test_lvm,包含有/dev/hda6和/dev/hda7兩個物理卷的卷組。使用下面命令來激活卷組:

# vgchange -ay test_lvm

使用「vgdisplay」命令來查看所建立卷組的細節信息。

# vgdisplay
--- Volume group ---
VG Name test_lvm
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 3.91 GB
PE Size 4 MB
Total PE 1000
Alloc PE / Size 256 / 1 GB
Free PE / Size 744 / 2.91 GB
VG UUID T34zIt-HDPs-uo6r-cBDT-UjEq-EEPB-GF435E

第六步:創建一個邏輯卷。使用lvcreate命令在卷組中創建一個邏輯卷:

# lvcreate -L2G -nlogvol1 test_lvm

第七步:創建文件系統。在該邏輯卷上選擇使用reiserfs日誌文件系統:

# mkreiserfs /dev/test_lvm/logvol1

使用mount命令來載入新創建的文件系統。

# mount -t reiserfs /dev/test_lvm/logvol1 /mnt/lv1

第八步:在/etc/fstab和/etc/lilo.conf中添加一個入口。在/etc/fstab中加入以下入口,在啟動時載入文件系統:

/dev/test_lvm/logvol1 /mnt/lv1 reiserfs defaults 1 1

如果沒有覆蓋原來的內核,那麼拷貝一份重新編譯後的內核,並且在啟動時選擇是否使用LVM。下面是LILO文件的內容:

image = /boot/lvm_kernel_image
label = linux-lvm
root = /dev/hda1
initrd = /boot/init_image
ramdisk = 8192

添加以上內容後,使用以下命令重新載入LILO:

#/sbin/lilo

第九步:修改邏輯卷的大小。可以使用lvextend命令方便地修改邏輯卷的大小,增加邏輯卷大小的方法如下:

# lvextend -L 1G /dev/test_lvm/logvol1
lvextend -- extending logical volume "/dev/test_lvm/logvol1" to 3GB
lvextend -- doing automatic backup of volume group "test_lvm"
lvextend -- logical volume "/dev/test_lvm/logvol1" successfully extended


類似的,減小邏輯卷大小的方法如下:

# lvrece -L-1G /dev/test_lvm/lv1
lvrece -- -Warning: recing active logical volume to 2GB
lvrece- -- This may destroy your data (filesystem etc.)
lvrece -- -do you really want to rece "/dev/test_lvm/lv1"? [y/n]: y
lvrece- -- doing automatic backup of volume group "test_lvm"
lvrece- -- logical volume "/dev/test_lvm/lv1" successfully reced

復制代碼

總結

從上面的討論可以看到,LVM具有很好的可擴展性,並且使用起來很直觀。一旦卷組建立起來以後,根據需求調整每一個邏輯卷的大小也非常容易。

LVM操作的相關命令:
fdisk -l :查看系統中都認到了那些物理硬碟
pvdisplay:查看系統中已經創建好的物理卷
pvcreate:創建一個新的物理卷
pvremove:刪除一個物理卷(也就是從物理卷中刪除一個LVM標簽)
vgdisplay:查看系統中的卷組
vgcreate:創建一個新的卷組
vgrece:從卷組中刪除一個物理卷(也就是縮小卷組)
vgremove:刪除一個卷組
lvdisplay:查看系統中已經創建好的邏輯卷
lvcreate:創建一個新的邏輯卷
lvrece:縮小邏輯卷(也就是從一個邏輯卷中減少一些LE)
lvremove:從系統中刪除一個邏輯卷
mkfs:基於邏輯卷創建一個相應類型的文件系統
mkdir -p $mount_piont:創建一個掛載目錄
創建好的文件系統位於:
/dev/$create_vg_name/$lv_name
mount /dev/$create_vg_name/$lv_name $mount_piont:掛載文件系統

vgscan:讀取系統中創建的所有卷組
vgchange -a y :激活所有卷組 (開機執行,redhat可在/etc/rc.d/rc.sysinit系統啟動初始化腳本里可以找到)
vgchange -a n :關閉所有卷組(提示:必須在umount所有的文件系統後,才能成功執行

裸設備使用:
1.先lvreate
2. raw /dev/raw/raw0 /dev/mapper/vgname-lvname
3.修改 /etc/sysconfig/rawdevices,添加:
/dev/raw/raw0 /dev/mapper/vgname-lvname
4.執行命令; service rawdevices restart,使得/etc/sysconfig/rawdevices文件中的裸設備配置生效
5.執行/sbin/schkconfig rawdevices on 使得系統重啟後,裸設備能自動載入

6.修改裸設備的屬主,使得相應許可權的用戶對裸設備有讀寫許可權
chown -R owner:group /dev/raw/raw0
7.將修改裸設備屬主修改命令加入到系統啟動執行腳本/etc/rc.local中,使得系統啟動後裸設備的屬主保持不變.

熱點內容
安卓43怎麼升級44 發布:2025-02-09 09:51:33 瀏覽:463
美國雲伺服器快還是香港快 發布:2025-02-09 09:34:33 瀏覽:988
怎麼解壓qq文件 發布:2025-02-09 09:18:14 瀏覽:581
安卓最新怎麼調靈敏度更穩 發布:2025-02-09 09:12:44 瀏覽:400
豌豆莢如何用安卓手機下載 發布:2025-02-09 09:11:57 瀏覽:213
吃雞腳本輔助 發布:2025-02-09 09:09:29 瀏覽:6
sessionidpython 發布:2025-02-09 09:08:53 瀏覽:276
華為手機驗證碼和密碼忘了是多少 發布:2025-02-09 08:53:53 瀏覽:799
逆戰筆記哪個配置好玩 發布:2025-02-09 08:53:04 瀏覽:600
怎麼打開電腦雲伺服器 發布:2025-02-09 08:36:01 瀏覽:220