磁盤管理
一.關于硬碟接口
安裝linux red hat系統,到分區時發現硬碟驅動器裝置
/dev/sda #sata接口裝置名
/dev/sda1#sda對應的實體分區
/dev/sda2
/dev/sda3
而又的安裝時硬碟驅動裝置名為
/dev/hda#IDE接口裝置目錄
/dev/hda1
sda和hda有什麼差別那?
HDA是使用了ide接口的硬碟的名稱.SDA是sata接口的硬碟的名稱.在最新的2.6.19核心裡,所有的硬碟都叫SDA了.
GERUB裡填SDA.
硬碟接口分為:
ide (integrated drive electronics) 把盤體和控制器內建在一起
scsi (small computer system interface)
光纖通道 fibre channel
sata (serial ATA(advanced technology attachment))
二.我司硬碟分區及挂載指令:
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart sashdisk ext3 0 100%
echo "y" | /sbin/mkreiserfs /dev/sda1
三.disk硬碟通路的準備步驟:
1.硬碟分區,需要2次分區:需要一次實體分區和一次邏輯分區 (fdisk or parted)
2.将硬碟格式化:即給硬碟格式化合适的檔案系統(格式化隻能是邏輯分區) (fdisk or parted)
3.将硬碟裝置/dev/sda挂載到Linux系統的某個檔案目錄下/opt/nsfocus/sda1 (mount)
四.硬碟在Linux中映射時的命名規則:
硬碟裝置命名為,sas接口為sda/sdb/sdc/...,ide接口為hda/hdb/hdc/...,
針對某一個裝置的邏輯分區命名為sda1/sda2/...,或/hda1/hda2/... :表示sda或hda裝置的多個分區
fdisk -l 檢視目前的實體裝置及邏輯和實體分區
df 檢視已經挂載的實體裝置所挂載在作業系統檔案系統下的目錄
lspci -vvv 檢視目前主機上面所有的硬體配備
Linux驅動及核心編譯
一、編譯Linux核心
1.目前運作系統的Linux版本必須同待編譯系統的Linux版本一緻
檢視核心版本,以及主要和次要版本:
#uname -r
3.5.0-19-generic
要列印系統的體系架構類型,即的機器是32位還是64位,使用:
#uname -p
i686
2.下載下傳與目前系統相同的Linux源碼
下載下傳各個版本linux源碼https://www.kernel.org/
如機器3.5.0版本源碼下載下傳位址為:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.tar.bz2
下載下傳完後,找一個路徑解壓,如我解壓到/linux-3.5/
3.設定源碼的次版本号
進入linux源碼目錄/linux-3.5/,編輯Makefile,将EXTRAVERSION = 修改為EXTRAVERSION= -19-generic,與編譯系統的次版本号相同。
這些都是要配置源碼的版本号與系統版本号,如果源碼版本号和系統版本号不一緻,在加載子產品的時候會出現如下錯誤:insmod: error inserting 'hello.ko': -1 Invalid module format。原因很明确:編譯時用的hello.ko的kenerl 不是我的pc的kenerl版本。
4.編譯Linux核心
執行指令cp /boot/config-3.5.0-19-generic ./config,覆寫原有配置檔案。
進入linux源碼目錄,執行make menuconfig配置核心,執行make編譯核心。
二、編譯Linux驅動
驅動源碼如下:hello.c
/*======================================================================
Asimple kernel module: "hello world"
======================================================================*/
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("zeroboundaryBSD/GPL");
static int hello_init(void){
printk(KERN_INFO"Hello World enter\n");
return0;
}
static void hello_exit(void){
printk(KERN_INFO"Hello World exit\n ");
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("zeroboundary");
MODULE_DESCRIPTION("A simple HelloWorld Module");
MODULE_ALIAS("a simplestmodule");
Makefile對源碼進行編譯
KERN_DIR = /linux-3.5
all:
make-C $(KERN_DIR) M=`pwd` modules
clean:
make-C $(KERN_DIR) M=`pwd` clean
obj-m += hello.o #子產品名
module-objs := hello.o [file1.o file2.o] #所有的.o檔案
1.編譯核心将得到hello.ko,将hello.ko拷貝到目标系統,執行
>insmod hello.ko #需要root權限,将插入子產品,此時在核心日志中會有列印輸出
>dmesg|tail #檢視核心日志
>rmmod hello.ko #可以解除安裝該驅動
>lsmod#檢視已經插入的驅動
>modinfo file
>cat /proc/modules 能夠顯示驅動子產品大小、在核心空間中的位址
>cat /proc/devices 隻顯示驅動的主裝置号,且是分類顯示
2.mknod
insmod插入驅動後,檢視/dev目錄下是否存在對應的節點,如果沒有需要建立一個,這樣應用程式才能引用
>mknod /dev/hello c 123 0 #建立nod
3.prink的輸出(到終端)
# cat /proc/sys/kernel/printk
6 4 1 7
第一個6表示級别高于(小于)6的消息才會被輸出到控制台,第二個4表示如果調用printk時沒有指定消息級别(宏)則消息的級别為4,第三個1表示接受的最高(最小)級别是1,第四個7表示系統啟動時第一個6原來的初值是7。
是以,如果你發現在控制台上看不到你程式中某些printk的輸出,請使用echo 8 > /proc/sys/kernel/printk來解決。
4.SAS Linux核心中驅動存放位置 drivers/scsi/
5.硬碟狀态檢視
lspci -vvv
fdisk -l
6.将驅動編譯進核心的方法
a.找到驅動要添加的目錄,比如scsi總線驅動 ?/drivers/scsi/
在該目錄下建立驅動目錄,比如megaraid1
b.将所有與該驅動相關的源檔案放在該目錄下,比如?/drivers/scsi/megaraid1
并在該目錄下添加Makefile和Kconfig 2個檔案
c.在Makefile種添加所有的.o檔案及子產品名,如
obj-$(CONFIG_MEGARAID1_SAS) += megaraid1_sas.o
megaraid1_sas-objs := megaraid1_sas_base.o megaraid1_sas_fusion.o megaraid1_sas_fp.o
很簡單。在Kconf下配置該驅動是否需要編譯進核心的菜單選項
config MEGARAID1_SAS
tristate "LSI Logic MegaRAID1 SAS RAID1 Module"
depends on PCI && SCSI
help
Module for LSI Logic's SAS based RAID1 controllers.
To compile this driver as a module, choose 'm' here.
Module will be called megaraid1_sas
也很簡單。該tristate是三态選項:y編譯進核心,m手動添加,n不編譯
d.回到?/drivers/scsi目錄,配置該目錄下的Makefile和Kconfig
在Makefile中需要添加megaraid1中的Makefile檔案路徑
obj-$(CONFIG_MEGARAID1_SAS) += megaraid1/
在Kconfig中需要添加megaraid1中的Kconfig檔案路徑
source "drivers/scsi/megaraid1/Kconfig"
e.ok啦,回到?/目錄進行make,此時會提示配置需要編譯的子產品,按提示配置即可,
也可以在檔案?/include/config/auto.conf中手動配置
三.Linux裝置
1.Linux裝置種類很多,比如字元裝置、塊裝置、管道裝置、網絡裝置等
每個裝置必須對應一個裝置檔案才能通路
常見的裝置檔案:裝置檔案通常儲存在/dev:
/dev/hd* IDE接口的硬碟
/dev/sd* SCSI/USB裝置
/dev/cda* 序列槽裝置
/dev/lp* 并口裝置
/dev/tty* 終端裝置
/dev/lonsok 控制台裝置
/dev/eth* 以太網裝置
/dev/cdrom 光驅
/dev/fd* 軟驅
/dev/audio 音頻裝置
/dev/scd SCSI的光驅
/dev/ppp PPP裝置
/dev/isdn* ISDN裝置
2.建立裝置檔案
驅動insmod之後,有時需要根據主次裝置号建立裝置檔案,以通路裝置
主裝置号對應驅動,次裝置号對應要通路的裝置。
>cat /proc/devices 檢視裝置對應的主裝置号
建立裝置檔案:
# mknod
格式:mknod 檔案名 類型 主裝置号 從裝置号
類型:C字元裝置/B塊裝置/P管道裝置
如:# mknod /dev/fdo b 1 2 //主裝置号必須與驅動對應,次裝置号可以随意取值
ls -l /dev/ 可以檢視主次裝置号
應用程式調用底層硬體:實體硬體--(端口通路:軟體抽象)>驅動裝置--(主次裝置号)>裝置檔案-(檔案名)>應用程式
本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1878832,如需轉載請自行聯系原作者