linux下新硬盘的自动检测及格式化--支持硬盘的热插拔处理
说明
可能存在bug,所以慎用!!! 且只在mbr分区格式下测试过。
parted.sh 可以用在系统起来的时候,比如rc.local脚本里面。
parted.c 需要parted.sh脚本配合使用,可以实现硬盘热插拔时的处
理,核心思想是linux下的文件系统变化通知机制。
parted 即parted.c的可执行文件。
欢迎大家一起讨论及指出其中的bug。
parted.sh的实现如下
#!/bin/sh
##################rongp 2012-6-21###############
PARTED=/sbin/parted
MOUNTED_TOP_DIR=/disks/
function mount_and_init {
mkdir $2
if mount -t ext4 $1 $2; then
echo "$1 $2 ext4 defaults 0 0" >>/etc/fstab
echo partition $1 mount to $2 is ready
else
echo mount
fi
}
function remkpart {
$PARTED -s $1 mklabel msdos #gpt
$PARTED -s $1 mkpart primary ext4 $2 $3>/dev/null #maybe use -1 instead of $3
mkfs.ext4 ${1}1 >/dev/null
MOUNT_POINT=`fdisk -l $1 | grep "Disk identifier" | awk '{print $3}'`
mount_and_init ${1}1 $MOUNTED_TOP_DIR/$MOUNT_POINT
}
function check_need_part {
ret=`fdisk -l $1 2>/dev/null | grep "Disk identifier" | awk '{print $3}'`
if [ "$ret" == "0x00000000" ]; then
return 0
else
return 1
fi
}
if [ "$1" == "" ]; then
DISK=`find /dev/ -name sd[a-z]`
else
DISK="/dev/$1"
fi
[ -d "$MOUNTED_TOP_DIR" ] || mkdir $MOUNTED_TOP_DIR
for tmpdisk in $DISK
do
check_need_part $tmpdisk
if [ "$?" == "1" ]; then
echo "$tmpdisk pass"
continue;
else
echo "$tmpdisk need "
fi
echo "make a temp partion so parted can get disk size"
$PARTED $tmpdisk mkpart primary 0 100 >/dev/null
STARTSIZE=0
#STOPSIZE='$PARTED $tmpdisk unit MB print | grep "Disk $tmpdisk" | cut -d: -f 2| cut -dM -f1` #maybe use -1 instead of STOPSIZE' #分区的结束位置
STOPSIZE=$((`fdisk -s $tmpdisk`/1000)) #分区的结束位置,和上面一句同义
remkpart $tmpdisk $STARTSIZE $STOPSIZE
done
parted.c文件实现如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#define BUF_SIZE 1024
int main(void)
{
int fd, wd;
int len = 0, pos = 0;
char buffer[BUF_SIZE];
char *path = "/dev/";
char buf[128];
struct inotify_event *event;
fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
return -1;
}
wd = inotify_add_watch(fd, path, IN_CREATE | IN_DELETE/*IN_MOVED_TO*//*IN_ALL_EVENTS*/);
if (wd < 0) {
perror("inotify_add_watch");
close(fd);
return -1;
}
while(1) {
memset(buf, 0, 128);
len = read(fd, buffer, BUF_SIZE);
while(len > 0) {
event = (struct inotify_event *)(buffer+pos);
if (event->wd != wd)
break;
if (event->mask & IN_CREATE) {
if (!strncmp(event->name, "sd", strlen("sd"))
|| !strncmp(event->name, "hd", strlen("hd"))) {
sprintf(buf, "sh parted.sh %s", event->name);
system(buf);
}
}
if (event->mask & IN_DELETE) {
if (!strncmp(event->name, "sd", strlen("sd"))
|| !strncmp(event->name, "hd", strlen("hd"))) {
sprintf(buf, "fdisk -l /dev/%s 2>/dev/null | grep \"Disk identifier\" | awk '{print $3}'", "/sda");
char tmpbuf[128];
FILE *fp = popen(buf, "r");
fread(buf, 1, 1024, fp);
fclose(fp);
*strchr(buf, '\n') = 0;
sprintf(tmpbuf, "sed -i '/%s/d' /etc/fstab", buf);
system(tmpbuf);
}
}
len -= event->len+sizeof(struct inotify_event);
pos += event->len+sizeof(struct inotify_event);
}
pos = 0;
}
close(fd);
return 0;
}
完!
2012年6月
linux下新硬盘的自动检测及格式化--支持硬盘的热插拔处理的更多相关文章
- Linux下Tomcat catalina.out自动归档,以及logrotate 配置详解
Linux下Tomcat catalina.out自动归档 如果 catalina.out 日志达到 2GB 大小的时候,Tomcat 因为缓存问题,便没有办法继续输出日志了. 为了避免这种情况,你 ...
- Linux下Jenkins与GitHub自动构建Node项目(Vue)
根据上篇文章<Linux下Jenkins与GitHub自动构建NetCore与部署>,我们知道了Jenkins的强大功能,自动构建,部署了一个NetCore的Web,让开发人员专注于开发, ...
- linux下通过脚本实现自动重启程序的方法
无论什么程序都不可能完美无缺,理论上,任何程序都有 Core Dump 的一天,正式运营的程序,尤其是服务器程序,一旦 Core Dump ,后果不堪设想,有过服务器开发经验的朋友,一定都经历过深夜美 ...
- Linux下Jenkins与GitHub自动构建NetCore与部署
今天我们来谈谈NetCore在Linux底下的持续集成与部署.NetCore我就不多介绍了,持续集成用的是Jenkins,源代码管理器用的是GitHub.我们就跟着博文往下走吧. 1.Linux环境 ...
- 自动检测GD库支持的图像类型
以下代码通过自动检测GD库支持的图像类型 来写出移直性更好的PHP代码 <?php if(function_exists("imagegif")){ header(" ...
- Linux下LCD 10分钟自动关屏的问题总结
Linux下的LCD驱动默认10分钟后会自动关闭屏幕,我们可以修改一下代码让其不自动关屏 在有一个 drivers/char/vt.c 文件其中有一个变量(blankinterval)可以设置它来修改 ...
- 用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子
因为要对客户方的快30个项目进行特别有顺序的重启,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的可以.没有一段是可以正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自动登录的脚 ...
- linux下EOF写法梳理 自动新建分区并挂载的脚本
linux下EOF写法梳理 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/6257490.html 在平时的运维工作中,我们经常会碰到这样一个场景 ...
- Linux下C程序内存泄露检测
在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...
随机推荐
- centos7源码安装cloud-init
<template> <name>centos72-source</name> <os> <name>CentOS-7</name&g ...
- LeetCode 19——删除链表的倒数第 N 个节点
1. 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...
- Cassandra 数据库设计
Cassandra 2.* CQL3.1 最近更新:2015-10-30 索引的设计 在Cassandra中经常会发现,索引不够用,不好用,各种不强大. 比如,我关注的人的需求uid + follow ...
- lintcode-119-编辑距离
119-编辑距离 给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 插入一个字符 删除一个字符 替换一个字符 样例 给出 work1=&q ...
- Ext.net中TreePanel动态生成
这个问题可以参考官网例子:http://examples2.ext.net/#/TreePanel/Basic/Built_in_CodeBehind/ 贴一段本人程序中用到的动态生成核心代码: Ex ...
- 在delphi中如何解决空格的问题。。。。烦死 了。。。。
我每次从数据库里面取数据出来和Edit里面的进行比较的时候总是会受到空格的困扰...老是干扰我...如果我用trim 所有都做去掉所有的空格那么这样就非常麻烦又繁琐..有没有什么方法可以忽略空格的.. ...
- 当xml结构很深时候 可以通过父节点删除子元素
当xml结构很深时候 可以通过父节点删除子元素
- JavaScript 操作选中当前的li元素并给他添加select类
JavaScript 操作选中当前的li元素并给他添加select类.之前都是使用jquery写的,今天使用JavaScript写一个. <!DOCTYPE html> <html ...
- 【题解】MUTC2013idiots
我是先知道的这题是FFT然后再做的,知道是FFT其实就是个套路题啦.首先,我们容易发现 \(P = \frac{a}{b}\) 其中a表示合法的方案数,而b表示全部的方案数. b的值即为\(C\lef ...
- NodeJS + PhantomJS 前端自动化资源监控
前言:最近做前端资源监控,看了很多例子,没有达到想要的效果.首先的槽点是PhantomJS的官方文档,真鸡肋,其次是网上的例子,多数是介绍PhantomJS的用法,而并没有介绍怎么完整的去实现,跟官方 ...