—How to use udev for Oracle ASM in Oracle Linux 6
—Oracle Datafiles & Block Device & Parted & Udev
意思是:该功能可以拒绝所有无效的 I/O 请求,最主要的作用是防止意外覆写 ASM 磁盘的底层盘,在后面的测试中可以看到对于 root 用户的 dd 全盘清零这样的变态操作也都是可以过滤的。
真是不错,那么该怎么启用这个功能呢? --确认目前 ASMFD 模块(以下简称 AFD)的状态,未加载。
--获取当前 ASM 磁盘发现路径,我这里是使用udev 绑定的名称
--设置 ASM 磁盘路径,将新的 DiskString 加入
--可以看到在设置该参数时,ASM 会检查现有已经加载的磁盘,如果不在发现路径上,将会报错。
--因此我们必须将新的路径加在原始路径后面,设置成多种路径,该操作会运行一段时间,视ASM 磁盘多少而定
--检查现在 GI 环境中的节点。
--以下命令必须在所有 Hub 节点上都运行,可以使用Rolling 的方式。以下命令有些需要root 用户,有些需要 grid 用户,请注意 # 或者 $ 不同的提示符表示不同的用户。
--先停止crs
--作 AFD Configure,实际上这是一个解压程序包,安装,并加载 Driver 的过程,需要消耗一些时间
--结束以后,可以再次检查 AFD 状态,显示已加载。
--接下来需要设置 AFD 自己的磁盘发现路径了,其实这里很像以前 ASMLIB 的操作。
--设置 AFD 磁盘发现路径,必须先启动CRS,否则将会遇到下面的错误。同时也可以看到这个信息是存储在每个节点自己的 OLR 中,因此必须在所有节点中都设置。
--启动 CRS
--此时查看后台的 ASM 告警日志,可以看到加载的磁盘仍然使用的是原始路径。但是也可以看到 libafd 已经成功加载。
--将 afd_ds 设置为 ASM 磁盘的底层磁盘设备名,这样以后就不再需要手工配置 udev rules 了。
--我在测试的时候,上面犯了一个错误,将路径设置为了“dev/sd*”,缺少了最开始的根目录。因此此处没有发现任何磁盘,如果你的测试中,这一步已经可以发现磁盘,请告诉我。
--再次提醒,到此为止的所有命令,都必须要在集群环境的所有节点中都执行。
--接下来就是将原先的 ASM 磁盘路径从 udev 转到 AFD
--先检查现在的磁盘路径
--由于要修改 OCR 所在的磁盘,因此修改之前需要停止 Cluster。
--直接修改会报错,因为/dev/asm-disk1 已经存在在 ASM 中了。
--必须要增加 migrate 关键字,才可以成功。
--在我的测试 ASM 中,一共有 13 块磁盘,因此依次修改。
--在另外的节点中,不再需要作 label,而是直接 scan 即可,这跟使用ASMLIB 的操作非常相像。
--重新启动 Cluster
--可以看到 ASM 告警日志中已经显示开始使用新的名称。关于其中 WARNING 的含义表示目前AFD 还不支持 Advanced Format 格式的磁盘,普通磁盘格式一个扇区是 512 字节,而高级格式则为 4K 字节。
--检查磁盘加载路径,以及功能全部是 AFD 样式了。
--但是我们可以看到在数据字典中仍然存在之前的磁盘路径。
--需要将 ASM 磁盘发现路径(注意,这跟设置 AFD 磁盘发现路径不是一个命令)中原先的路径去除,只保留 AFD 路径。
--再次重启 ASM,一切正常了。
--收尾工作,将原先的 udev rules 文件移除。当然,这要在所有节点中都运行.以后如果服务器再次重启,AFD 就会完全接管了。
还有什么发现?
其实,AFD 也在使用 udev。囧。
Label 过后的磁盘在 /dev/oracleafd/disks 目录中可以找到。
这里有一个很大不同,所有磁盘的属主变成了 root,并且只有 root 才有写入的权限。很多文章认为,这就是 AFD 的 filter 功能体现了,因为现在用 oracle 或者 grid 用户都没有办法直接对 ASM 磁盘进行写入操作,自然就获得了一层保护。比如以下命令会直接报权限不足。
但是如果你认为这就是 AFD 的保护功能,那也太小看 Oracle 了,仅仅是这样也对不起名字中 Filter 字样。且看后面分解。
操作系统中也可以看到 AFD 磁盘和底层磁盘的对应关系。
再次重启服务器以后,afd_lsdsk 的结果中显示的路径都已经变为底层磁盘,但是 Filtering 却变成了 DISABLED。不要在意这里的 Label 和 Path 的对应和上面的不一样,因为有些是在节点 1 中执行的结果,有些是在节点 2 中执行的结果,而这也是 AFD 功能的展示,不管两边机器发现块设备的顺序是不是一样,只要绑定了 AFD 的 Label,就没问题了。
最后,该来测试一下 I/O Filter 功能了吧,等好久了! 对,这才是重点。先看一下如何启用或者禁用 Filter 功能。在我的测试中,单独设置某块盘启用还是禁用是不生效的,只能全局启用或者禁用。
启用 Filter 功能。
为了以防万一,不破坏我自己的实验环境,增加了一块磁盘来作测试。
创建一个新的磁盘组。
先用 KFED 读取一下磁盘头,验证一下确实无误。
直接使用 dd 尝试将整个磁盘清零。dd 命令本身没有任何错误返回。
之后重新 mount 磁盘组,如果磁盘被清零,在重新 mount 的时候一定会出现错误,而现在正常挂载。
觉得不过瘾?那再创建一个表空间,插入一些数据,做一次 checkpoint,仍然一切正常。
但是诡异的是,这时候在操作系统级别直接去读取 /dev/sdo 的内容,会显示全部都已经被清空为 0 了。
使用 strings 命令也完全看不到任何有意义的字符。
但是,千万不要被这样的假象迷惑,以为磁盘真的被清空了,在 dd 的时候,/var/log/message 会产生大量日志,明确表示这些在 ASM 管理的设备上的 IO 操作都是不被支持,这才是 Filter 真正起作用的场合。
使用 kfed,仍然可以读取到正常的信息。
直到重新启动服务器(重新启动 ASM,重新启动 Cluster,在操作系统仍然看到的是清零后的数据),所有的数据又回来了(请不要在重要环境上进行这样的测试)。
最后将 Filter 禁用之后再测试。
同样使用 dd 命令清零整个磁盘。
重新 mount 磁盘组,如期报错,磁盘组无法加载。
重新启动数据库,也会发现由于表空间中数据库不存在而导致数据库无法正常 Open。