磁盘管理

一.关于硬盘接口

安装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 p_w_upload))

二.我司硬盘分区及挂载命令:

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/   可以查看主次设备号

应用程序调用底层硬件:物理硬件--(端口访问:软件抽象)>驱动设备--(主次设备号)>设备文件-(文件名)>应用程序

转载于:https://blog.51cto.com/a1liujin/1878832

disk磁盘管理与Linux驱动编写相关推荐

  1. linux驱动编写--2--应用程序控制led闪烁

    本系列教程的上一篇:  linux驱动编写--1--点亮led 目标:编写一个驱动程序,实现上一篇没写的 "接口".并编写一个测试程序,透过驱动来控制led闪烁. 硬件:micro ...

  2. linux驱动编写(入门)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一 ...

  3. linux 磁盘管理心得,Linux磁盘管理三板斧的使用心得

    磁盘是Linux系统中一项非常重要的资源,如何对其进行有效的管理直接关系到整个系统的性能问题.对Linux磁盘管理稍微有一些学习和经验的朋友们应该都知道df.du和fdisk这三个常用命令:df用于检 ...

  4. linux驱动编写(设备树)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux的开发者来说,设备树其实比较熟悉.但是为什么要有设备树,很多人不了解,其实本质来说 ...

  5. linux驱动编写(看门狗)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 看门狗是linux驱动的一个重要环节.某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信 ...

  6. linux驱动编写(platform总线和网卡驱动)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 对于linux驱动来说,一般的架构还是按照bus-host-device的形式来进行的.比如就拿 ...

  7. linux驱动编写(虚拟字符设备编写)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关 ...

  8. Linux驱动编写入门-新解

    1.驱动编写后是一个C文件,通过make命令对其进行编译,生成 .KO文件,这个文件就是可执行的驱动文件,通过使用insmod xx.ko即可执行此驱动文件.如下为一个完整的驱动程序C文件.(用的是讯 ...

  9. linux 磁盘管理 阵列,Linux 磁盘管理~~~~RAID1

    Linux磁盘管理~~~~RAID1 实验环境 Linux操作系统的pc机上添加2块30g大小的磁盘 实施步骤: 1.0 对磁盘进行分区 [root@host129~]# fdisk /dev/sdb ...

最新文章

  1. MongoDB for C#基础入门
  2. Android10.0 Binder通信原理(三)-ServiceManager篇
  3. JQuery 总结(1) 选择器的使用
  4. 破解微软xp黑屏方法
  5. 2小时撸完代码之后,所有程序员都逃不过的一天... (强共鸣)
  6. Poor Man's BERT: 更小更快的Transformer模型
  7. 安徽省第二次计算机水平考试,2006第二次安徽省计算机水平考试试卷(ACCESS).doc...
  8. 使用3dmax渲染出二维画面的方法
  9. 传感器极性NPN和PNP区别!!!
  10. Pandas 学习笔记二
  11. Android Sensor感应器简单使用(1)
  12. Java学习---控制流程与方法
  13. 几种常用的power bi 图表怎么做
  14. AD怎么输入坐标_实名推荐|相见恨晚的CAD坐标提取技巧
  15. Win 10 运行软件报‘MSCOMCTL.OCX‘缺失怎么办
  16. Python3学习3 格式化 % format
  17. 复星联合创始人梁信军:谁掌握了海量区块链账户,谁就是赢家
  18. 汽车「内外饰零部件」机器人加工工艺技术方案
  19. matlab绘制bland-altman,如何绘制Bland-Altman图?告诉你两种方法!
  20. java 实现上传文件到远程服务器

热门文章

  1. 高斯双边模糊_OpenCV 学习:9 双边滤波bilateralFilter
  2. 曹讯 计算机摄像学,计算摄像学: 全光视觉信息的计算采集
  3. layui 按钮点击一次后失效_electron-vue自定义边框后点击事件失效问题
  4. Photoshop制作八张一寸证件照
  5. SQLAlchemy Tutorial
  6. python __xxxitem__
  7. javascript window.screen
  8. WSGI Application/Framework
  9. opencv-api arcLength
  10. android教程1009无标题,Android ActionBarActivity设置全屏无标题实现方法总结_Android_脚本之家...