说明

可能存在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月

最新文章

  1. 深入理解javascript中实现面向对象编程方法
  2. 什么是publickeytoken及publickeytoken的作用
  3. MS SQL查看效率语句 与PLSQL中F5功能相同
  4. HTML5 canvas globalCompositeOperation绘图类型讲解
  5. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]
  6. UVA 11552 四 Fewest Flops
  7. MVC自学系列之二(MVC控制器-Controllers)
  8. TFS跨版本Merge测试
  9. keyCode码集合
  10. 1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
  11. 学习笔记1--响应式网页+Bootstrap起步+全局CSS样式
  12. .NET(C#、VB)移动开发——Smobiler平台控件介绍:TextTabBar控件
  13. 【原创】大叔经验分享(9)yarn重要配置yarn.nodemanager.local-dirs
  14. Centos修改时间为24小时制
  15. 【T09】要认识到TCP是一个可靠的,但不是绝对可靠的协议
  16. PP学习笔记-业务基础
  17. stl, string不仅是charString, 更是byteString
  18. Lambda学习---StreamApi使用
  19. 外部程序启动App
  20. Linux 入侵检测

热门文章

  1. Python Flask之旅
  2. 10-Mysql数据库----数据的增删改
  3. gcc options选项的优化及选择
  4. Leetcode 55. Jump Game &amp; 45. Jump Game II
  5. php解析二维码
  6. [问题解决]Python locale error: unsupported locale setting
  7. 【iOS开发】动态添加子视图 UIView 的正确方法
  8. win7 redis
  9. SQL Server 性能调优 之执行计划(Execution Plan)调优
  10. 2017 Multi-University Training Contest - Team 3 RXD and functions(NTT)