raw设备minor号相同的问题以及解决方法

本文介绍在RHEL6.2系统中使用udev管理99块逻辑卷的raw设备映射时遇到的问题及解决方案。包括如何正确配置/etc/udev/rules.d/60-raw.rules文件中的major和minor号,以及提供一种通过修改rc.local文件来避免问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创,转载请注明出处。

我的OS是RHEL6.2,
需要对99块逻辑卷进行raw设备映射,使用udev来对raw进行管理
修改/etc/udev/rules.d/60-raw.rules:

ACTION=="add", KERNEL=="/dev/mapper/oracle_vg01-rlvoracle01", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", ENV{MAJOR}=="253",ENV{MINOR}=="7", RUN+="/bin/raw /dev/raw/raw1 %M %m" //这两行是必须的。
......
ACTION=="add", KERNEL=="/dev/mapper/oracle_vg01-rlvoracle98", RUN+="/bin/raw /dev/raw/raw98 %N"
ACTION=="add", ENV{MAJOR}=="253",ENV{MINOR}=="104", RUN+="/bin/raw /dev/raw/raw98 %M %m"
ACTION=="add", KERNEL=="/dev/mapper/oracle_vg01-rlvoracle99", RUN+="/bin/raw /dev/raw/raw99 %N"
ACTION=="add", ENV{MAJOR}=="253",ENV{MINOR}=="105", RUN+="/bin/raw /dev/raw/raw99 %M %m"

配置完了之后start_udev重启udev。
发现实际只映射成功了94块逻辑卷:
[code="java"]
# raw -qa
/dev/raw/raw1: bound to major 253, minor 7
/dev/raw/raw2: bound to major 253, minor 8
/dev/raw/raw3: bound to major 253, minor 9
/dev/raw/raw4: bound to major 253, minor 10
....
/dev/raw/raw90: bound to major 253, minor 96
/dev/raw/raw91: bound to major 253, minor 97
/dev/raw/raw92: bound to major 253, minor 98
/dev/raw/raw93: bound to major 253, minor 99
/dev/raw/raw94: bound to major 253, minor 100
[/code]
剩余的几块逻辑卷(95,96,97,98,99)却没有映射工程。

手动进行映射:
[code="java"]
# raw /dev/raw/raw95 /dev/mapper/oracle_vg01-rlvoracle95
/dev/raw/raw95: bound to major 253, minor 96
# raw /dev/raw/raw96 /dev/mapper/oracle_vg01-rlvoracle96
/dev/raw/raw96: bound to major 253, minor 97
# raw /dev/raw/raw97 /dev/mapper/oracle_vg01-rlvoracle97
/dev/raw/raw97: bound to major 253, minor 98
# raw /dev/raw/raw98 /dev/mapper/oracle_vg01-rlvoracle98
/dev/raw/raw98: bound to major 253, minor 99
[/code]
发现新的设备的minor号与配置文件中的设备minor居然相同,显然这个是异常的。

那么问题出现在什么地方呢,首先的问题是手动映射的minor号是怎么的分配出来的呢?
我找了调查了2天,偶然发现设备的Block device与raw设备映射的信息一致
[code="java"]
# lvdisplay /dev/mapper/oracle_vg01-rlvoracle98
--- Logical volume ---
LV Name /dev/oracle_vg01/rlvoracle98
VG Name oracle_vg01
LV UUID FH4b9q-jccY-6I74-G9CT-apYr-XSU7-RcIqaH
LV Write Access read/write
LV Status available
# open 0
LV Size 12.00 MiB
Current LE 3
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:99
[/code]
多做了几次比对,得出的结论是:
手动映射的major与minor号就是根据这里的Block device生成的。

而我之前/etc/udev/rules.d/60-raw.rules中人为的指定的minor号与设备自身的Block device不一致,这就导致了udev在管理raw设备的时候出现了问题。

那么此类问题的解决方法:
[color=red]1./etc/udev/rules.d/60-raw.rules中的要根据设备的Block device(lvdisplay /dev/mapper/oracle_vg01-rlvoracle98)来设置设备的major与minor号。
2.不用udev来管理raw,修改rc.local文件.
参考http://space.itpub.net/?uid-231499-action-viewspace-itemid-63884
需要说明的是,rc.local文件实际上就是raw /dev/raw/rawN /dev/mapper/oracle_vg01-rlvoracleN。[/color]

另外一点需要重点说明,
1.major与minor的这种异常,在建立基于raw设备的oracle数据库的表空间的时候,会导致莫名其妙的device busy错误,而这种device busy,即使你使用fuser 或者lsof也查看不到设备的使用者,google上根本就查不到,我也是偶然件发现这个异常以及原因。

SQL> alter tablespace test add datafile '/dev/raw/raw4' size 4090m;
alter tablespace test add datafile '/dev/raw/raw4' size 4090m
*
ERROR at line 1:
ORA-01119: error in creating database file '/dev/raw/raw4'
ORA-27041: unable to open file
Linux-x86_64 Error: 16: Device or resource busy
Additional information: 1

2.使用dd if=/dev/raw/rawN of=/dev/raw/rawM也会出现莫名奇妙的device busy


我把这点宝贵的经验写出来,给自己提个醒,也给大家做个参考。
[root@localhost ~]# lspci | grep -i vga 00:02.0 VGA compatible controller: Device 1234:1111 (rev 02) [root@localhost ~]# dmesg | grep -i drm [ 1.521161] ACPI: bus type drm_connector registered [ 1.542736] bochs-drm 0000:00:02.0: vgaarb: deactivate vga console [ 1.543906] [drm] Found bochs VGA, ID 0xb0c5. [ 1.543908] [drm] Framebuffer size 4096 kB @ 0xfe400000, mmio @ 0xfebd8000. [ 1.544389] [drm] Initialized bochs-drm 1.0.0 20130925 for 0000:00:02.0 on minor 0 [ 1.544688] fbcon: bochs-drmdrmfb (fb0) is primary device [ 1.546995] bochs-drm 0000:00:02.0: [drm] fb0: bochs-drmdrmfb frame buffer device [ 1185.484082] bochs-drm 0000:00:02.0: Damage blitter failed: ret=-12 [ 1185.484111] WARNING: CPU: 2 PID: 3288 at drivers/gpu/drm/drm_fbdev_generic.c:331 drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484123] Modules linked in: tcp_diag udp_diag inet_diag uinput xt_CHECKSUM ipt_MASQUERADE xt_conntrack ipt_REJECT nft_compat nf_nat_tftp nft_objref nf_conntrack_tftp nft_counter bridge stp llc nft_fib_inet nft_fib_ipv4 nft_fib_ipv6 nft_fib nft_reject_inet nf_reject_ipv4 nf_reject_ipv6 nft_reject nft_ct nf_tables_set nft_chain_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 ip_set nf_tables nfnetlink sunrpc snd_hda_codec_generic ledtrig_audio snd_hda_intel snd_intel_dspcfg snd_intel_sdw_acpi snd_hda_codec snd_hda_core snd_hwdep snd_seq snd_seq_device snd_pcm snd_timer joydev pcspkr snd virtio_balloon soundcore i2c_piix4 xfs libcrc32c sr_mod sd_mod cdrom t10_pi sg ata_generic bochs drm_vram_helper drm_kms_helper syscopyarea sysfillrect sysimgblt drm_ttm_helper ttm drm ata_piix ahci libahci libata virtio_net net_failover serio_raw failover virtio_console virtio_scsi dm_mirror dm_region_hash dm_log dm_mod fuse [ 1185.484177] Workqueue: events drm_fb_helper_damage_work [drm_kms_helper] [ 1185.484183] RIP: 0010:drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484214] ? drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484220] ? drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484233] ? drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484242] ? drm_fbdev_fb_dirty+0xe8/0x350 [drm_kms_helper] [ 1185.484250] drm_fb_helper_damage_work+0x86/0x160 [drm_kms_helper]
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值