开发者社区> 问樵> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

为ROS创建的资源自动挂载数据盘

简介: 通过脚本实现自有镜像自动挂在在阿里云申请的数据盘
+关注继续查看

为ROS创建的资源自动挂载数据盘

通过ROS可以方便创建,管理资源。例如自动挂载数据盘,如果是通过阿里云的官方镜像,使用ROS创建ECS资源,UserData可以很容易的帮你完成这一步,详细内容可以参考这篇文章;但是如果你使用自己制作的镜像,而且自己制作的镜像不支持UserData功能怎么办呢,这篇文章帮你解决你的问题。

要完成自有镜像自动挂载数据盘,只需要三步:

1.制作镜像前,把下面的这个脚本拷贝到你将要制作镜像的ECS机器上,例如:/usr/local/bin/mount_disks下面。

 #!/bin/sh
set -e

logs=/root/mount_logs
mount_point_prefix="/data"

part_disk () {
    raw_disk=$1
    echo "Create partation table for $raw_disk" >> $logs
    fdisk -S 56 $raw_disk <<ESXU
n
p
1


w
ESXU
}

format_disk()
{
    local disk=$1
    mkfs.ext4 $disk
    if [ "$?" = "0" ];then
        echo "${disk} is formated!" >> $logs
    else
        echo "Fail to format ${disk}" >> $logs
    fi
}

mount_disk()
{
    local disk=$1
    local mount_point=$2

    if [ ! -d $mount_point ]; then
        mkdir $mount_point
    fi
    result=`awk -v disk=$disk 'BEGIN {count=0;} {if ($1 == disk) {count=count+1;}} END{print count;}' /etc/fstab`
    if [ $result -eq 0 ]; then
        echo "$disk         $mount_point       ext4       defaults        0 0" >> /etc/fstab
    fi
    mount $disk $mount_point
    if [ $? -ne 0 ]; then
        echo "Fail to mount $disk on $mount_point" >> $logs
    fi
    chmod -R 777 $mount_point
    echo "$disk is mounted to ${mount_point}!" >> $logs
}

handle_raw_disk()
{
    local raw_disks="`fdisk -l 2>&1 | grep "doesn't contain" | awk -F" " '{print $2}'`"
    local disk=""
    local mount_point=""

    echo "handle_raw_disk raw_disks $raw_disks" >> $logs
    for raw_disk in $raw_disks
    do
        part_disk $raw_disk

        disk=${raw_disk}1
        format_disk $disk

        mount_point="${mount_point_prefix}_`echo $raw_disk | awk -F '/' '{print $3}'`1"
        mount_disk $disk $mount_point
    done
}

handle_data_disk()
{
    local all_disks=""
    local all_mounted_disks=""
    local need_mounted_disks=""
    local disk=""
    local mount_point=""

    for disk_name in "xvd" "vd"
    do
        all_disks="`cat /proc/partitions | grep -E "${disk_name}[a-z].[0-9]*" | awk -F " " '{print $4}'` $all_disks"
        all_mounted_disks="`df -h | grep ${disk_name}* | awk -F " " '{print $1}' | awk -F '/' '{print $3}'` $all_mounted_disks"
    done

    echo "handle_data_disk all_disks $all_disks" >> $logs
    echo "handle_data_disk all_mounted_disks $all_mounted_disks" >> $logs
    for raw_disk in $all_disks
    do
        local found='false'
        for disk in $all_mounted_disks
        do
             if [ "$disk" = "$raw_disk" ]; then
                 found='true'
                 break
             fi
        done

        if [ "$found" = "false" ]; then
            full_name="`fdisk -l | grep $raw_disk | awk -F ' ' '{print $1}'`"
            need_mounted_disks="$need_mounted_disks $full_name"
        fi
    done

    echo "handle_data_disk need_mounted_disks $need_mounted_disks" >> $logs
    for disk in $need_mounted_disks
    do
        mount_point="${mount_point_prefix}_`echo $disk | awk -F '/' '{print $3}'`"
        mount_disk $disk $mount_point
    done
}

if [ ! -f $logs ]; then
    touch $logs
fi

export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"


do_start() {
    echo "================SATRT=================" >> $logs
    echo "`date` try to mount data disks..." >> $logs
    handle_raw_disk
    handle_data_disk
    echo "=================END==================" >> $logs
    return 0
}


case "$1" in
    start)
        do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

2.修改/etc/rc.local,加入下面这句:

   /usr/lcoal/bin/mount_disks start

这一句意思是在镜像启动的时候执行mount_disks脚本去挂载数据盘。

3.然后制作自己的镜像

4.使用ROS模版创建ECS时,引用自己制作的镜像,并给ECS创建数据盘。当ROS创建成功后,数据盘就可以被自动挂载。具体的模版可以参考这里

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程:records批量插入数据到mysql
Python编程:records批量插入数据到mysql
67 0
python使用插入带有%的字符串到mysql数据库
python使用插入带有%的字符串到mysql数据库
70 0
【好记性不如烂笔头】创建一颗用于快速查找数据的多叉树
假定现有大量人员需要管理,给每个人分配一个n位数的id,现要求快速查找,于是我们建一颗10叉树来管理这批人的信息,这样查找结果为真时查询次数为n,时间复杂度为常数,可谓是最优解了 代码如下: 1 using System; 2 using System.
957 0
使用ROS一键创建,分区,格式化和挂载数据盘
对于每一个应用来说都有存储数据的需求,阿里云ECS针对不同的用户需求提供了三种类型的数据云盘,普通云盘,高效云盘和SSD云盘。通过ECS控制台可以为每个实例创建最多4块空数据盘或者根据已有数据盘的snapshot产生4块含有数据的云盘。但是根据上面的方式产生的数据云盘,不能直接使用,需用户登录EC.
4357 0
批量生成sqlldr文件,高速卸载数据
      SQL*Loader 是用于将外部数据进行批量高速加载的数据库的最高效工具,可用于将多种平面格式文件加载到Oracle数据库。SQL*Loader支持传统路径模式以及直接路径这两种加载模式。
869 0
+关注
12
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载