-
Notifications
You must be signed in to change notification settings - Fork 522
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
nbd: add auto map at boot #347
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
#!/bin/bash | ||
|
||
set -e | ||
|
||
chmod +x /usr/bin/map_curve_disk.sh | ||
cp /usr/bin/map_curve_disk.sh /etc/init.d | ||
update-rc.d map_curve_disk.sh defaults | ||
|
||
exit 0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
#!/bin/bash | ||
|
||
set -e | ||
|
||
update-rc.d map_curve_disk.sh remove | ||
rm -f /etc/init.d/map_curve_disk.sh | ||
|
||
exit 0 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# | ||
# /etc/curvetab | ||
# use for auto map and mount curve disk when boot | ||
# | ||
# this file record the correspondence of curve nbd images/ devices | ||
# add record when 'curve-nbd map' and 'curve-nbd unmap' | ||
# | ||
# format: device image mount | ||
# /dev/nbd0 cbd:pool//curvefile_test_ /curve |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
#!/bin/bash | ||
|
||
### BEGIN INIT INFO | ||
# Provides: curve-nbd | ||
# Required-Start: $local_fs $remote_fs $network nebd-daemon | ||
# Required-Stop: $local_fs $remote_fs $network | ||
# Default-Start: 2 3 4 5 | ||
# Default-Stop: 0 1 6 | ||
# Short-Description: curve-nbd auto map service | ||
# Description: curve-nbd auto map service and associated helpers | ||
### END INIT INFO | ||
|
||
# default confpath | ||
# file format is:dealflag \t device \t image \t mountpoint(option) | ||
# + /dev/nbd0 cbd:pool//curvefile_test_ /test | ||
confPath=/etc/curve/curvetab | ||
|
||
# check sudo | ||
if [[ $(id -u) -ne 0 ]] | ||
then | ||
echo "Please run with sudo" | ||
exit 1 | ||
fi | ||
|
||
# usage | ||
function usage() { | ||
echo "Usage: ./map_curve_disk.sh start" | ||
echo " -c/--confPath: set the confPath (default /etc/curve/curvetab)" | ||
echo " file format is:dealflag \t device \t image \t mountpoint(option)" | ||
echo " example: + /dev/nbd0 cbd:pool//curvefile_test_ /test" | ||
echo " -h/--help: get the script usage" | ||
echo "Examples:" | ||
echo " ./map_curve_disk.sh start //use the default configuration" | ||
echo " ./map_curve_disk.sh start --confPath yourConfPath //use the new confPath" | ||
} | ||
|
||
# remove extra records | ||
function dealcurvetab() { | ||
if [ ! -f ${confPath} ] | ||
then | ||
echo "ERROR: not found configuration file, confPath is ${confPath}!" | ||
exit | ||
fi | ||
|
||
declare -A recordmap | ||
while read line | ||
do | ||
flag=$(echo $line | awk '{print $1}') | ||
device=$(echo $line | awk '{print $2}') | ||
if [ "$flag" = "+" ] | ||
then | ||
recordmap["$device"]=$line | ||
elif [ "$flag" = "-" ] | ||
then | ||
unset recordmap[$device] | ||
fi | ||
done < ${confPath} | ||
for key in ${!recordmap[@]}; do | ||
echo ${recordmap[$key]} >> ${confPath}.bak | ||
done | ||
} | ||
|
||
# map the curve disk based on curvetab | ||
function map() { | ||
if [ ! -f ${confPath}.bak ] | ||
then | ||
echo "ERROR: not found configuration file, confPath is ${confPath}.bak!" | ||
exit | ||
fi | ||
|
||
cat ${confPath}.bak | grep -v '#' | while read line | ||
do | ||
device=$(echo $line | awk '{print $2}') | ||
image=$(echo $line | awk '{print $3}') | ||
mount=$(echo $line | awk '{print $4}') | ||
curve-nbd map $image --device $device | ||
if [ "$mount" != "" ] | ||
then | ||
mount $device $mount | ||
fi | ||
done | ||
mv ${confPath}.bak ${confPath} | ||
} | ||
|
||
if [ $# -lt 1 ] | ||
then | ||
usage | ||
exit | ||
fi | ||
|
||
case $1 in | ||
"start") | ||
shift # pass first argument | ||
|
||
while [[ $# -gt 1 ]] | ||
do | ||
key=$1 | ||
|
||
case $key in | ||
-c|--confPath) | ||
confPath=`realpath $2` | ||
shift # pass key | ||
shift # pass value | ||
;; | ||
*) | ||
usage | ||
exit | ||
;; | ||
esac | ||
done | ||
dealcurvetab | ||
map | ||
;; | ||
*) | ||
usage | ||
;; | ||
esac |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -95,6 +95,24 @@ static void Usage() { | |
<< std::endl; | ||
} | ||
|
||
// use for record image and device info to auto map when boot | ||
static int AddRecord(int flag) { | ||
std::string record; | ||
int fd = open(CURVETAB_PATH, O_WRONLY | O_APPEND); | ||
if (fd < 0) { | ||
std::cerr << "curve-nbd: open curvetab file failed."; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. return There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
done There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. return with error code? |
||
return -EINVAL; | ||
} | ||
if (1 == flag) { | ||
record = "+\t" + nbdConfig->devpath + "\t" + nbdConfig->imgname + "\n"; | ||
} else if (-1 == flag) { | ||
record = "-\t" + nbdConfig->devpath + "\n"; | ||
} | ||
write(fd, record.c_str(), record.size()); | ||
close(fd); | ||
return 0; | ||
} | ||
|
||
static int NBDConnect() { | ||
int waitConnectPipe[2]; | ||
|
||
|
@@ -140,6 +158,10 @@ static int NBDConnect() { | |
if (ret < 0) { | ||
::write(waitConnectPipe[1], &connectionRes, sizeof(connectionRes)); | ||
} else { | ||
ret = AddRecord(1); | ||
if (0 != ret) { | ||
return ret; | ||
} | ||
connectionRes = 0; | ||
::write(waitConnectPipe[1], &connectionRes, sizeof(connectionRes)); | ||
nbdTool->RunServerUntilQuit(); | ||
|
@@ -192,6 +214,10 @@ static int CurveNbdMain(int argc, const char* argv[]) { | |
return -EINVAL; | ||
} | ||
|
||
r = AddRecord(-1); | ||
if (0 != r) { | ||
return r; | ||
} | ||
break; | ||
} | ||
case Command::List: { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe it's better to named
CURVETAB_LOG_PATH
?