istgt软件简介
istgt是跑在openSUSE/Debian/NetBSD/FreeBSD上的iscsi target软件,工作在用户进程模式下。
主页为:http://shell.peach.ne.jp/aoyama/
这是一个日本人写的软件,请抛开xx因素先别鄙视日本人。
虽然FreeBSD和Mac OS X是近亲,但是直接下载源代码到OS X编译安装,运行时是会出错的,而且不支持OS X的BSD子系统的kqueue。需要修改源代码的两个文件然后编译才能正常在OS X上运行。
两年前我就已经改好了年末的一个版本,给作者发过邮件,可是那家伙不鸟,呵呵。
# tar zxf istgt-20141125.tar.gz
# cd istgt-20141125/src
1、istgt.h
# vi istgt.h
跳转到128行,启用kqueue支持,修改成如下补丁信息的+号一行
--- istgt.h.orig 2012-08-19 05:04:12.000000000 +0800 +++ istgt.h 2014-12-31 00:11:32.000000000 +0800 @@ -125,7 +125,7 @@ #else #error "no signal for internal" #endif -#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) +#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || (defined(__APPLE__) && defined(__GNUC__)) #define ISTGT_USE_KQUEUE #if defined (__FreeBSD__) #define ISTGT_EV_SET(kevp,a,b,c,d,e,f) EV_SET((kevp),(a),(b),(c),(d),(e),(void *)(f))
2、istgt.c
# vi istgt.c
跳转到1555行,再看1576行,你会发现,他把pthread_attr_init和istgt_uctl_init的前后顺序搞反了。所以你需要调整一个段落的代码顺序
从1576到1630行的代码,都要剪切放到原1555行的rc = istgt_uctl_init(istgt);之前
以下是补丁:
--- istgt.c.orig 2012-11-13 02:44:24.000000000 +0800 +++ istgt.c 2014-12-31 00:10:04.000000000 +0800 @@ -1552,27 +1552,6 @@ istgt_init(ISTGT_Ptr istgt) istgt->discovery_auth_group); } - rc = istgt_uctl_init(istgt); - if (rc < 0) { - ISTGT_ERRLOG("istgt_uctl_init() failed\n"); - return -1; - } - rc = istgt_build_uctl_portal(istgt); - if (rc < 0) { - ISTGT_ERRLOG("istgt_build_uctl_portal() failed\n"); - return -1; - } - rc = istgt_build_portal_group_array(istgt); - if (rc < 0) { - ISTGT_ERRLOG("istgt_build_portal_array() failed\n"); - return -1; - } - rc = istgt_build_initiator_group_array(istgt); - if (rc < 0) { - ISTGT_ERRLOG("build_initiator_group_array() failed\n"); - return -1; - } - rc = pthread_attr_init(&istgt->attr); if (rc != 0) { ISTGT_ERRLOG("pthread_attr_init() failed\n"); @@ -1629,6 +1608,27 @@ istgt_init(ISTGT_Ptr istgt) return -1; } + rc = istgt_uctl_init(istgt); + if (rc < 0) { + ISTGT_ERRLOG("istgt_uctl_init() failed\n"); + return -1; + } + rc = istgt_build_uctl_portal(istgt); + if (rc < 0) { + ISTGT_ERRLOG("istgt_build_uctl_portal() failed\n"); + return -1; + } + rc = istgt_build_portal_group_array(istgt); + if (rc < 0) { + ISTGT_ERRLOG("istgt_build_portal_array() failed\n"); + return -1; + } + rc = istgt_build_initiator_group_array(istgt); + if (rc < 0) { + ISTGT_ERRLOG("build_initiator_group_array() failed\n"); + return -1; + } + rc = pipe(istgt->sig_pipe); if (rc != 0) { ISTGT_ERRLOG("pipe() failed\n");
3、注意事项
istgt不支持scsi reservation协议,如果你需要模拟存储锁定LUN,请使用linux的iscsitarget。