开始新对话

未解决

此帖子已超过 5 年

7038

2012年11月26日 23:00

Linux FC/iSCSI存储设备管理系列(一):Linux系统设备驱动入门

​ ​
​ ​

​Linux FC/iSCSI​​存储设备管理系列(一):​​Linux​​系统设备驱动入门​

​ ​
​ ​

​ ​

​转载请在文首保留原文出处:​​EMC​​中文支持论坛​​ - ​​https://community.emc.com/go/chinese​

​ ​
​ ​

​介绍​

​ ​
​ ​

​ ​

​Linux FC/iSCSI​​存储设备管理系列,主要介绍​​Linux​​系统管理​​FC/iSCSI​​磁盘设备的相关概念与技术细节,内容包括:​

​ ​

​1.​​ ​​Linux​​磁盘设备驱动介绍​

​ ​

​2.​​ ​​磁盘设备管理(一):​​FC​​磁盘管理​

​ ​

​ ​​磁盘设备管理(二):​​iSCSI​​磁盘管理​

​ ​

​3.​​ ​​HBA​​管理与配置​

​ ​

​4.​​ ​​文件系统结构​

​ ​

​5.​​ ​​磁盘在线调整​

​ ​

​6.​​ ​​SCSI​​驱动调优与排错​

​ ​

​本文作为系列之一,主要介绍了​​Linux​​版本,内核模块及启动过程,设备驱动基础,以及动态配置磁盘设备的步骤。​

​ ​
​ ​

​更多信息​

​ ​
​ ​

​ ​

​Linux​​版本概述​​:​

​ ​

​Linux​​是与​​Unix​​类似的操作系统,与传统操作系统和花费较高的​​Unix​​系统相比,它为个人电脑用户提供了一个免费或价格相对低廉的操作系统。​​Linux​​以快速高效著称,与其他服务器操作系统一样,它具有多重应用。​

​ ​

​Linux​​厂商发行版本有​​Red Hat​​,​​Debian​​,​​Fedora​​,​​Gentoo​​,​​SuSE​​,​​TurboLinux​​等,其中一部分可以下载。​​FTP​​发行商如:​​Sunsinte.org.uk, Sunsinte.unc.edu, ​​www.isoimages.org​​。​

​ ​

​可通过以下​​URL​​找到​​Linux​​相关信息:​

​ ​

​www.​linux.com​和​​ ​​www.linix.com​

​ ​

​www.xfree86.com​

​ ​

​Redhat​​企业版是一种常见的版本。它支持如​​Intel X86, Intel Itanium, AMD AMD64 and IBM z​​系列​​, POWER ​​系列​​, and S/390​​。​​Redhat​​使用最新版本稳定的​​2.5/2.6 Linux​内核。​

​ ​

​ ​

​Redhat​​发展历程:​

​ ​

​1991​​年,​Linux​内核​​发布。同年​​Bob Yong​​(加拿大人,​​多伦多大学​​毕业)在​​纽约​​UNIX​​用户组引入​​系统管理​​自由软件。​

​ ​

​1993​​年,​​Bob Yang ​​建立了​​ACC​​公司,营销​Linux​和​​UNIX​​的支持软件和书籍杂志。​​ ​

​ ​

​1994​​年,​​Marc Ewing​​(美国人,​​卡内基梅隆大学​​毕业)建立了自己的​Linux​分销业务,发布了​​Red Hat Linux 1.0​​。​​ ​

​ ​

​1995​​年,​​Bob Yang ​​收购了​​Marc Ewing​​的业务,合并后的​​ACC​​公司成为新的​​Red Hat ​​软件公司,发布了​​Red Hat Linux 2.0​​。​​ ​

​ ​

​1997​​年​​12​​月,​​Red Hat Linux 5.0​​发布,它支持​​Intel​​、​​alpha​​和​​Sparc​​平台和大多数的​​应用软件​​。极其简单易用的​​RPM​​模块化的安装、配置和卸载工具,使程序的安装可在​​15​​分钟内完成。软件升级也很方便,这对刚开始使用​Linux​的用户来说是一大福音。​​ ​

​ ​

​2003​​年​​4​​月,​​Red Hat Linux 9.0​​发布。重点放在改善​​桌面​​应用方面,包括改进安装过程、更好的字体浏览​​、更好的打印服务等。统计表明,​​2003​​年,​​Red Hat​​的​Linux​市场份额为​​86% ​​。​

​ ​

​2004​​年​​4​​月​​30​​日,​​Red Hat​​公司正式停止对​​Red Hat 9.0​​版本的支持,标志著​​Red Hat Linux​的正式完结。原本的桌面版​​Red Hat Linux​发行包则与来自民间的​​Fedora​​计划合并,成为​​Fedora Core​​发行版本。​​Red Hat​​公司不再开发桌面版的​Linux​发行包,而将全部力量集中在服务器版的开发上,也就是​​Red Hat Enterprise​Linux​版。​​ 2005​​年​​10​​月​​RHEL4​​发布。​​ ​

​ ​

​2007​​年​​3​​月,现行主流版本​​RHEL5​​发布(最新版本​​5.5​​)​​ ​

​ ​

​2010​​年​​4​​月​​RHEL6 BETA​​测试版发布。​​ ​

​ ​

​2011​​年​​04​​月​​12​​日​​ Oracle​​发布的​Linux​系统​​6.0​​(基于​​RedHat Enterprise Linux 6.0​​)​

​ ​

​本文中,将采用​​Redhat​​企业版作为示例操作系统。​

​ ​

​ ​

Linux​内核模块及启动:​

​ ​

Linux​内核采用模块化设计。系统启动时,只有最近贮存的内核会加载到内存中。此后,每当用户请求一个当前内核中不具备的功能,将动态加载一个内核模块(有时称为驱动)到内存中。​

​ ​

​在安装过程中,对系统硬件进行探测。基于本次探测及用户提供的信息,安装程序决定在启动时加载哪一种模块。安装程序建立了动态加载机制以实现透明操作。​

​ ​

​如果安装结束后新添加了硬件,并且该硬件需要一个内核模块,则系统必须为新硬件配置并加载合适的内核模块。​

​ ​

1.jpg

​ ​

​上图列出了​​BIOS(Basic Input and Output System)​​的启动过程。​

​ ​

​不同类型的服务器使用了不同的引导装载程序。以上图例中,如果服务器是基于​​Intel​​的则引导装载程序可能是​​GRUB​​或​​LILO​​。如果是​​mainframe​​大型机则有可能使用​​IBM s390​​引导加载程序。​

​ ​

​ ​

​BIOS​​发起第一阶段主引导加载程序。​​BIOS​​将位于引导介质第一扇区中的程序加载入内存,我们称之为主引导记录(​​Master Boot Record​​或​​MBR​​)。主引导记录只有​​512​​字节大小,包含启动设备所需的机器代码,也称为引导加载程序(​​boot loader​​)。一旦​​BIOS​​将引导加载程序找到并将其加载入内存后,它就将启动程序的控制权交给二级引导加载程序。​

​ ​

​在第一阶段,主引导加载程序通过​​BIOS​​从主引导记录被读入内存。它的主要工作是加载位于不同介质上任意位置的数据,通过这步操作来定位第二阶段引导加载程序。​

​ ​

​第二阶段引导装载程序由第一阶段的引导装载程序发起,它包含有加载程序更需要磁盘空间的部分,如用户界面和内核引导程序。该阶段允许用户选择启动的操作系统或​Linux​内核。可用的两个启动加载程序是​​GRUB​​或​​LILO​​。​​GRUB​​是较新的启动加载程序,能够阅读​​ext2​​和​​ext3​​类型文件分区并在启动时加载它的配置文件——​​/boot/grub/grub.conf​​。​​LILO​​是较老的版本,它使用主引导记录中的信息以确定用户可用的启动选项。这意味着无论何时配置发生更改或内核被手动升级,必须通过命令来讲合适的信息写入​​MBR​​。命令为:​​/sbin/lilo -v -v​​。​

​ ​

​ ​

​ ​

​GRUB ​​与​​ LILO ​​的比较​

​ ​

​所有引导加载程序都以类似的方式工作,满足共同的目的。不过,​​LILO ​​和​​ GRUB ​​之间有很多不同之处:​

​ ​

​§​​ ​​LILO ​​没有交互式命令界面,而​​GRUB ​​拥有。​

​ ​

​§​​ ​​LILO ​​不支持网络引导,而​​GRUB ​​支持。​

​ ​

​§​​ ​​LILO ​​将关于可以引导的操作系统位置的信息物理上存储在​​MBR ​​中。如果修改了​​LILO ​​配置文件,必须将​​LILO ​​第一阶段引导加载程序重写到​​MBR​​。相对于​​ GRUB​​,这是一个更为危险的选择,因为错误配置的​​MBR ​​可能会让系统无法引导。使用​​GRUB​​,如果配置文件配置错误,则只是默认转到​​GRUB ​​命令行界面。​

​ ​

​接下来,系统将操作系统加载入内存并将设备的控制权转交给该操作系统。操作系统将会处理​​/etc/inittab​​文件,并依据​​/etc/inittab​​设定的内容,依序启动相关进程。首先启动的程序为​​/etc/rc.sysinit​​。​​rc.sysinit​​设置环境变量,启动置换空间,检查文件系统,并执行所有系统初始化所需的其他步骤。例如,绝大多数系统使用时钟,因此​​rc.sysinit​​读取​​/etc/sysconfig/clock​​配置文件以初始化硬件时钟。另一个例子是如果要初始化串口,​​rc.sysinit​​将会执行​​/etc/rc.serial​​文件。​

​ ​

​ ​

Linux​磁盘设备驱动基础:​

​ ​

Linux​内核中采用可加载的模块化设计,常见的驱动程序是作为内核模块动态加载的。​

​ ​

​ ​

​模块的相关命令:​

​ ​

​§​​ ​​lsmod​​——列出当前系统加载的模块​

​ ​

​§​​ ​​rmmod​​——将当前模块卸载​

​ ​

​§​​ ​​insmod​​——加载当前模块​

​ ​

​§​​ ​​mknod​​——创建相关模块​

​ ​

​ ​

Linux​将设备看作文件,每个设备对应一个文件名,内核中对应一个索引节点,对文件操作的系统调用大都适用于设备文件。对某个具体设备而言,文件操作和设备驱动是同一事物的不同层次。​Linux​将设备分为两大类,一类是像磁盘那样的以块或扇区为单位、成块进行输入​​/​​输出的设备,称为块设备;另一类是像键盘那样以字符(字节)为单位,逐个字符进行输入​​/​​输出的设备,称为字符设备;文件系统通常建立在块设备上。​

​ ​

​本文将以​​SCSI​​磁盘为例来介绍磁盘设备驱动的基础知识。​

​ ​

​ ​

​SCSI​​(小型计算机系统接口)总线是一种高效的点对点数据总线,它最多可以支持​​8​​个设备,其中包括多个主设备。在总线上的两个设备间数据可以以同步或异步方式,在​​32​​位数据宽度下传输率为​​40M​​字节来交换数据。​​SCSI​​总线上可以在设备间同时传输数据与状态信息。​

​ ​

Linux SCSI​​子系统由两个基本部分组成,每个由一个数据结构来表示。 ​

​ ​

​Host​

​ ​

​一个​​SCSI host​​即一个硬件设备:​​SCSI​​控制权。在​Linux​系统中可以存在相同类型的多个​​SCSI​​控制权,每个由一个单独的​​SCSI host​​来表示。这意味着一个​​SCSI​​设备驱动可以控制多个控制权实例。​​SCSI host​​总是​​SCSI​​命令的​​initiator​​设备。 ​

​ ​

​Device ​

​ ​

​虽然​​SCSI​​支持多种类型设备如磁带机、​​CD-ROM​​等等,但最常见的​​SCSI​​设备是​​SCSI​​磁盘。​​SCSI​​设备总是​​SCSI​​命令的​​target​​。这些设备必须区别对待,例如象​​CD-ROM​​或者磁带机这种可移动设备,​Linux​必须检测介质是否已经移动。不同的磁盘类型有不同的主设备号,这样​Linux​可以将块设备请求发送到正确的​​SCSI​​设备。 ​

​ ​

​ ​

​ ​

​SCSI​​子系统的初始化非常复杂,它必须反映出​​SCSI​​总线及其设备的动态性。​Linux​在启动时初始化​​SCSI​​子系统。 如果它找到一个​​SCSI​​控制器(即​​SCSI hosts​​)则会扫描此​​SCSI​​总线来找出总线上的所有设备。然后初始化这些设备并通过普通文件和​​buffer ​​cache​​块设备操作使​Linux​内核的其它部分能使用这些设备。 ​

​ ​

​一旦​​SCSI​​子系统初始化完成这些​​SCSI​​设备就可以使用了。每个活动的​​SCSI​​设备类型将其自身登记到内核以便​Linux​正确定向块设备请求。 ​

​ ​

​ ​

​如前所述,一个设备文件(即设备节点)可以通过​​mknod​​命令来创建,其中指定了主设备号和次设备号。主设备号表明某一类设备,一般对应着确定的驱动程序;次设备号一般是用于区分标明不同属性,例如不同的使用方法,不同的位置,不同的操作等,它标志着某个具体的物理设备。高字节为主设备号和底字节为次设备号。例如,在系统中的块设备​​SCSI ​​磁盘的主设备号是​​3​​,而多个​​SCSI ​​磁盘及其各个分区分别赋予次设备号​​1​​、​​2​​、​​3……​

​ ​

​ ​

​ ​

​SCSI​​系统中磁盘设备驱动层级如下:​​sd​​——直接访问磁盘,​​sg​​——​​SCSI​​通用接口,​​sr​​——​​Data CD-ROMs​​,​​st​​——磁带。​​sg​​驱动是基于字符的设备而其他三个驱动都是块设备驱动。​​sg​​驱动主要用于扫描仪,刻录机,以及打印机。从第一个​​SCSI​​控制器开始,​​sg​​设备文件动态映射到​​SCSI​​总线上的​​SCSI IDs/LUNs​​。​

​ ​

​块设备的本地文件名具有以下格式:​​/dev/sdln​​,​​l​​表示物理设备而​​n​​表示该物理设备上的分区号。当主机总线适配器发现附加连接的存储后​Linux​会在设备文件​​/dev/sd ​​中定义这些设备。当主机总线适配器监测到随机附带存储后​Linux​将会定义设备文件​​/dev/sd ​​。​​ ​

​ ​

​ ​

​ ​

​按照以上定义,以文件​​/dev/sda1​​为例,物理设备是“​​a​​”而分区是“​​1​​”。​Linux​内核为​​SCSI​​设备保留了​​16​​个主设备编号,各主设备编号可拥有​​0-255​​个从设备编号。这些从设备编号包括​​SCSI​​设备的分区。对于每个磁盘设备​Linux​支持​​0​​到​​15​​个分区。其中,​​1​​至​​4​​为主分区,分区​​5​​以上为逻辑分区或扩展分区;以上限制只适用于​​Intel​​平台。默认情况下,​Linux​并不使用​​slice​​这一概念。因此,​​16​​个主设备编号和​​16​​个从设备编号意味着​​256​​个​​SCSI​​磁盘设备,内核能够扫描范围从​​1​​至​​255​​的磁盘设备。​​Red Hat Linux​和​​SuSE SLES 7​​最大支持​​128​​个​​SCSI​​设备,而​​SuSE SLES 8​​版本支持​​256​​个​​SCSI​​设备。​

​ ​

​ ​

​动态设备配置步骤:​

​ ​

​在​Linux​内核中,与其他类型的​​UNIX​​系统(如:​​Sun​​,​​SGI​​,​​HP-UX​​,​​BSD​​)不同,设备名中并没有使用​​SCSI​​地址。如前文所述,块设备名格式为​​/dev/sdln​​,​​l​​是表示物理设备驱动的字符而数字​​n​​代表该物理设备驱动的分区号。设备名在启动时或设备加载时按发现顺序动态指定。​

​ ​

​ ​

​ ​

​如果添加了硬件设备之后系统重新启动,设备编号将会更改从而造成主机的挂载列表不准确。为了保持设备编号的准确性并减少挂在列表出现偏差的可能性,应当把新的设备附加在当前设备列表中。例如,如果主机包含多个​​HBA​​,最好将新设备附加在最后一个​​HBA​​的磁盘设备列表的末端,这样就无需更改挂载列表中的现有记录。如果新设备添加到第一个​​HBA​​中,那么在系统重启之后,所有设备编号都会在原有数字加一同时挂在列表记录也需随着该设备发生偏移。如果只有一个​​HBA​​,则新设备可方便地添加到原有设备列表中并相应地改变挂载列表。​

​ ​

​ ​

​ ​

​目前​Linux​系统缺乏植入到内核中的、如同​​drvconfig​​或​​ioscan​​这样能够动态配置​​SCSI​​通道的命令。​

​ ​

​重新配置​Linux​主机的三种方式有:​

​ ​

​·​​ ​​重启系统​

​ ​

​·​​ ​​卸载并重新加载​​HBA​​驱动模块​

​ ​

​·​​ ​​echo /proc​​文件系统​

​ ​

​ ​

​ ​

​重启主机:​

​ ​

​重启主机是检测新添加磁盘设备的可靠方式。在所有​​I/O​​停止之后方可重启主机,同时静态或以模块方式连接磁盘驱动。系统初始化时会扫描​​PCI​​总线,因此挂载其上的​​SCSI host adapter​​会被扫描到,并生成一个​​PCI device​​。之后扫描软件会为该​​PCI device​​加载相应的驱动程序。加载​​SCSI host​​驱动时,其探测函数会初始化​​SCSI host​​,注册中断处理函数,最后调用​​scsi_scan_host​​函数扫描​​scsi host adapter​​所管理的所有​​scsi​​总线。​

​ ​

​ ​

​ ​

​卸载并重新加载​​HBA​​驱动模块:​

​ ​

​通常情况下,​​HBA​​驱动在系统中以模块形式加载。从而允许模块被卸载并重新加载,在该过程中​​SCSI​​扫描函数得以调用。通常,在卸载​​HBA​​驱动之前,​​SCSI​​设备的所有​​I/O​​都应该停止,卸载文件系统,多路径服务应用也需停止。如果有代理或​​HBA​​应用帮助模块,也应当中止。​

​ ​

​命令示例:​

​ ​

​例如,​​rac​​节点上某台服务器执行​​fdisk –l​​命令看不到共享磁盘,可尝试执行如下命令:​

​ ​

​# modprobe -r lpfc​​(卸载驱动)​

​ ​

​# modprobe lpfc​​(加载驱动)​

​ ​

​ ​

​ ​

​/proc​​下​​SCSI​​扫描:​

​ ​

​2.4​​内核中,​​/proc​​文件系统提供了可用​​SCSI​​设备的列表。如果系统中​​SCSI​​设备重新配置,那么所有这些改变通过​​echo /proc​​接口反映到​​SCSI​​设备中。添加一个设备,主机,​​channel​​,​​target ID​​,以及磁盘设备的​​LUN​​编号会被添加到​​/proc/scsi/​​,需指定​​scsi​​编号。​

​ ​

​命令示例:​

​ ​

​# echo "scsi add-single-device 0 1 2 3" > /proc/scsi/scsi​

​ ​

​0​​:主机​​ID​

​ ​

​1​​:​​channel ID​

​ ​

​2​​:​​target ID​

​ ​

​3​​:​​LUN​​编号​

​ ​

​该命令会将新磁盘设备添加到​​/proc/scsi/scsi​​文件中。如果没有找到相应文件,需为​​/dev​​路径下新增磁盘设备创建设备文件名。​

​ ​

​如果要删除一个磁盘设备,使用适当的主机,​​channel​​,​​target ID​​及​​LUN​​编号运行如下格式命令:​

​ ​

​# echo "scsi remove-single-device 0 1 2 3" > /proc/scsi/scsi​

​ ​

​0​​:主机​​ID​

​ ​

​1​​:​​channel ID​

​ ​

​2​​:​​target ID​

​ ​

​3​​:​​LUN​​编号​

​ ​

​ ​
​ ​

​参考​

​ ​
​ ​

​ ​

​Accessing Disks Through Linux Servers​

​ ​
​ ​

​应用于​

​ ​
​ ​

​ ​

Linux​操作系统​

​ ​

​ ​
没有回复!
找不到事件!

Top