diff --git a/curve-ansible/roles/install_package/defaults/main.yml b/curve-ansible/roles/install_package/defaults/main.yml index 490bf0365b..f0a17f2e8b 100644 --- a/curve-ansible/roles/install_package/defaults/main.yml +++ b/curve-ansible/roles/install_package/defaults/main.yml @@ -30,6 +30,7 @@ local_nbd_package_path: ../../nbd-package snapshot_clone_server_log_dir: /data/log/curve/snapshotclone local_snapshotcloneserver_package_path: ../curve-snapshotcloneserver local_monitor_package_path: ../../curve-monitor +curvetab_path: /etc/curve local_snapshotcloneserver_nginx_package_path: ../curve-nginx snapshotcloneserver_nginx_dir: /etc/curve/nginx diff --git a/curve-ansible/roles/install_package/tasks/include/install_curve-nbd.yml b/curve-ansible/roles/install_package/tasks/include/install_curve-nbd.yml index 90d1e3a74b..86b99cbfca 100644 --- a/curve-ansible/roles/install_package/tasks/include/install_curve-nbd.yml +++ b/curve-ansible/roles/install_package/tasks/include/install_curve-nbd.yml @@ -45,3 +45,29 @@ local_file_path: "{{ local_nbd_package_path }}/bin/" file_mode: 0755 include_tasks: copy_file_to_remote.yml + +- name: install curvetab + vars: + remote_dir_name: "{{ curvetab_path }}" + local_file_path: "{{ local_nbd_package_path }}/etc/" + file_mode: 0755 + include_tasks: copy_file_to_remote.yml + +- name: add nbd auto start at boot + block: + - name: get distro name + vars: + distro: + include_tasks: common_tasks/get_distro_name.yml + - name: copy map_curve_disk.sh to init.d + vars: + remote_dir_name: "/etc/init.d" + local_file_path: "{{ curvetab_path }}" + file_mode: 0755 + include_tasks: copy_file_to_remote.yml + - name: enable on debain ubuntu + shell: sudo update-rc.d map_curve_disk.sh defaults + when: "'Ubuntu' in distro or 'Debian' in distro" + - name: enable on centos + shell: sudo chkconfig --add map_curve_disk.sh && sudo chkconfig map_curve_disk.sh on + when: "'CentOS' in distro" diff --git a/mk-tar.sh b/mk-tar.sh index d5ed2eb66f..ce3d1b1fcf 100644 --- a/mk-tar.sh +++ b/mk-tar.sh @@ -461,7 +461,10 @@ cp bazel-bin/nebd/src/part2/nebd-server build/nebd-package/bin # step 4.2 prepare for curve-nbd package mkdir -p build/nbd-package/bin +mkdir -p build/nbd-package/etc cp bazel-bin/nbd/src/curve-nbd build/nbd-package/bin +cp nbd/nbd-package/usr/bin/map_curve_disk.sh build/nbd-package/bin +cp nbd/nbd-package/etc/curve/curvetab build/nbd-package/etc #step5 打包tar包 echo "start make tarball" diff --git a/nbd/nbd-package/DEBIAN/postinst b/nbd/nbd-package/DEBIAN/postinst new file mode 100755 index 0000000000..6e850536ea --- /dev/null +++ b/nbd/nbd-package/DEBIAN/postinst @@ -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 diff --git a/nbd/nbd-package/DEBIAN/prerm b/nbd/nbd-package/DEBIAN/prerm new file mode 100755 index 0000000000..2976220db7 --- /dev/null +++ b/nbd/nbd-package/DEBIAN/prerm @@ -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 diff --git a/nbd/nbd-package/etc/curve/curvetab b/nbd/nbd-package/etc/curve/curvetab new file mode 100644 index 0000000000..f630137330 --- /dev/null +++ b/nbd/nbd-package/etc/curve/curvetab @@ -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 delete when 'curve-nbd unmap' +# +# format: device image mount +# cbd:pool//curvefile_test_ /dev/nbd0 /curve diff --git a/nbd/src/define.h b/nbd/src/define.h index 5b33f1e310..271b90c347 100644 --- a/nbd/src/define.h +++ b/nbd/src/define.h @@ -61,6 +61,7 @@ namespace nbd { #define PROCESS_NAME "curve-nbd" #define NBD_PATH_PREFIX "/sys/block/nbd" #define DEV_PATH_PREFIX "/dev/nbd" +#define CURVETAB_PATH "/etc/curve/curvetab" using std::cerr; diff --git a/nbd/src/main.cpp b/nbd/src/main.cpp index 319a50ca8f..00f7b6cbdd 100644 --- a/nbd/src/main.cpp +++ b/nbd/src/main.cpp @@ -95,6 +95,84 @@ static void Usage() { << std::endl; } +// use for record image and device info to auto map when boot +static void AddRecord() { + std::fstream fs; + // check if exist + fs.open(CURVETAB_PATH, std::fstream::in); + if (!fs.is_open()) { + std::cerr << "curve-nbd: open curvetab file failed."; + } + + std::string lineString; + while (getline(fs, lineString)) { + if (!lineString.empty() && lineString[0] != '#') { + std::vector lineArray; + std::stringstream ss(lineString); + std::string str; + while (getline(ss, str, '\t')) { + lineArray.push_back(str); + } + if (lineArray.size() != 2 && lineArray.size() != 3) { + std::cerr << "curve-nbd: curvetab file content error."; + fs.close(); + return; + } + if (lineArray[0] == nbdConfig->imgname) { + fs.close(); + return; + } + } + } + fs.close(); + // write new record + fs.open(CURVETAB_PATH, std::fstream::app); + if (!fs.is_open()) { + std::cerr << "curve-nbd: open curvetab file failed."; + } + fs << nbdConfig->imgname << '\t' << nbdConfig->devpath << '\n'; + fs.close(); +} + +// delete record when unmap +static void DelRecord() { + std::fstream fs; + fs.open(CURVETAB_PATH, std::fstream::in); + if (!fs.is_open()) { + std::cerr << "curve-nbd: open curvetab file failed."; + } + + std::string lineString; + std::string newContent; + while (getline(fs, lineString)) { + if (!lineString.empty() && lineString[0] != '#') { + std::vector lineArray; + std::stringstream ss(lineString); + std::string str; + while (getline(ss, str, '\t')) { + lineArray.push_back(str); + } + if (lineArray.size() != 2 && lineArray.size() != 3) { + std::cerr << "curve-nbd: curvetab file content error."; + fs.close(); + return; + } + if (lineArray[1] != nbdConfig->devpath) { + newContent += lineString; + newContent += "\n"; + } + } else { + newContent += lineString; + newContent += "\n"; + } + } + fs.close(); + // update record info + fs.open(CURVETAB_PATH, std::fstream::out); + fs << newContent; + fs.close(); +} + static int NBDConnect() { int waitConnectPipe[2]; @@ -140,6 +218,7 @@ static int NBDConnect() { if (ret < 0) { ::write(waitConnectPipe[1], &connectionRes, sizeof(connectionRes)); } else { + AddRecord(); connectionRes = 0; ::write(waitConnectPipe[1], &connectionRes, sizeof(connectionRes)); nbdTool->RunServerUntilQuit(); @@ -192,6 +271,7 @@ static int CurveNbdMain(int argc, const char* argv[]) { return -EINVAL; } + DelRecord(); break; } case Command::List: {