[OpenWrt-Devel] [PATCH 2/3] IP Virtual Server - Load Balancer - ipvsadm tool
Mauro Mozzarelli
mauro at ezplanet.net
Wed Feb 24 12:00:44 EST 2016
Yousong,
Thank you for your suggestions.
Please see my notes below after your comments
Mauro
On Wed, February 24, 2016 13:31, Yousong Zhou wrote:
> yousong
>
>
> On 24 February 2016 at 03:57, Mauro Mozzarelli <mauro at ezplanet.net> wrote:
>> All,
>>
>> Part 2/3 includes the ipvsadm tool only.
>> It depends on the ipvs kernel modules patch 1/3
>>
>> Mauro
>>
>> Author: Mauro Mozzarelli <mauro at ezplanet.net>
>> Date: Tue Feb 23 19:22:51 2016 +0000
>>
>> This ipvsadm package adds Linux IP Virtual Server capability to OpenWRT
>> IPVS (IP Virtual Server) implements transport-layer load balancing inside the Linux kernel, so called Layer-4 switching.
>> IPVS running on a host acts as a load balancer at the front of a cluster of real servers, it can direct requests for
>> TCP/UDP based services to the real servers, and makes services of the real servers to appear as a virtual service on a
>> single IP address.
>>
>> More information at: http://www.linuxvirtualserver.org/software/
>>
>> This package contains:
>> - ipvsadm utility to configure IP VS tables, virtual and real servers
>>
>> Dependencies:
>> - ipvs kernel modules
>>
>> Signed-off-by: Mauro Mozzarelli <mauro at ezplanet.net>
>>
>> diff --git a/package/network/utils/ipvsadm/Makefile b/package/network/utils/ipvsadm/Makefile
>> new file mode 100644
>> index 0000000..8abde77
>> --- /dev/null
>> +++ b/package/network/utils/ipvsadm/Makefile
>> @@ -0,0 +1,59 @@
>> +#
>> +# Copyright (C) 2016 OpenWRT, Mauro Mozzarelli
>
> Not quire sure about this, but it's OpenWrt instead of OpenWRT :)
Amended, just in case
>
>> +#
>> +# This is free software, licensed under the GNU General Public License v2.
>> +# See /LICENSE for more information.
>> +#
>> +# AUTHOR: Mauro Mozzarelli
>> +#
>> +include $(TOPDIR)/rules.mk
>> +
>> +PKG_NAME:=ipvsadm
>> +PKG_VERSION:=1.26
>> +PKG_MAINTAINER:=Mauro Mozzarelli <mauro at ezplanet.net>
>> +PKG_LICENSE:=GPL-1.0
>> +PKG_RELEASE:=1
>> +
>> +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
>> +PKG_SOURCE_URL:=http://www.linuxvirtualserver.org/software/kernel-2.6/
>> +PKG_MD5SUM:=eac3ba3f62cd4dea2da353aeddd353a8
>> +
>> +PKG_BUILD_PARALLEL:=1
>> +PKG_INSTALL:=1
>> +
>> +ifeq ($(CONFIG_DEVEL),y)
>> + export QUILT=1
>> +endif
>
> What's the above 3 lines for?
Left over from previous testing. Now removed. Thank you for spotting.
>> +
>> +include $(INCLUDE_DIR)/package.mk
>> +
>> +define Package/$(PKG_NAME)
>
> use ipvsadm instead of $(PKG_NAME)
>
>> + SECTION:=net
>> + CATEGORY:=Network
>> + TITLE:=IP Virtual Server Configuration Manager
>> + URL:=http://www.linuxvirtualserver.org
>> + DEPENDS:= +kmod-ipvs +libnl-tiny +libpopt
>> +endef
>> +
>> +# -I$(STAGING_DIR)/usr/include/libnl/linux -fPIC -DLIBIPVS_USE_NL
>
> This commented out code should be removed
I removed it, however the above works for Chaos Calmer.
Trunk requires -D_GNU_SOURCE or it would not compile
>> +TARGET_CFLAGS += \
>> + -I$(STAGING_DIR)/usr/include/libnl-tiny -fPIC -DLIBIPVS_USE_NL -D_GNU_SOURCE
>
> - `make HAVE_NL=1` should be preferred over -DLIBIPVS_USE_NL
> - -fPIC already is already set in libipvs/Makefile
> - Is that -D_GNU_SOURCE required?
>
Yes, see above
>> +
>> +MAKE_FLAGS += \
>> + CC="$(TOOLCHAIN_DIR)/bin/$(TARGET_CC)" \
>> + CXX="$(TOOLCHAIN_DIR)/bin/$(TARGET_CXX)" \
>> + CFLAGS="$(TARGET_CFLAGS)" \
>> + LIBS="-lnl-tiny -lpopt"
>> +
>
> - These should be assigned to MAKE_VARS and `make POPT_LIB=-lpopt`
> should be preferred over `LIBS=-lopt`
> - I have not run-tested it, but those assignment to CC, CXX, CFLAGS
> can be omitted here as they are already handled by the OpenWrt build
> system
>
I removed CC and CXX.
CFLAGS and LIBS are necessary to compile
>> +define Build/Compile
>> + $(call Build/Compile/Default)
>> +endef
>
> This can also be removed as it is the default behaviour of build system.
>
Removed, thank you for spotting.
>> +
>> +define Package/ipvsadm/install
>> + $(INSTALL_DIR) $(1)/usr/sbin
>> + $(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm $(1)/usr/sbin/
>> + $(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm-save $(1)/usr/sbin/
>> + $(INSTALL_BIN) $(PKG_BUILD_DIR)/ipvsadm-restore $(1)/usr/sbin/
>> +endef
>> +
>> +$(eval $(call BuildPackage,$(PKG_NAME)))
>
> Just use ipvsadm instead of $(PKG_NAME)
Where possible I prefer to use variables instead of hard coded names.
This helps when renaming packages or re-using code for other packages.
>> diff --git a/package/network/utils/ipvsadm/patches/001-ipvsadm.patch
>> b/package/network/utils/ipvsadm/patches/001-ipvsadm.patch
>> new file mode 100644
>> index 0000000..643d5ae
>> --- /dev/null
>> +++ b/package/network/utils/ipvsadm/patches/001-ipvsadm.patch
>> @@ -0,0 +1,199 @@
>> +diff -Naur ipvsadm-1.26/ipvsadm.spec ipvsadm-1.26.owrt/ipvsadm.spec
>> +--- ipvsadm-1.26/ipvsadm.spec 2011-02-08 00:25:36.000000000 +0000
>> ++++ ipvsadm-1.26.owrt/ipvsadm.spec 1970-01-01 01:00:00.000000000 +0100
>
> This part is irrelevant and should be removed...
Thank you for spotting. It is now removed.
>
>> +@@ -1,100 +0,0 @@
>> +-%define prefix /usr
>> +-
>> +-Summary: Utility to administer the Linux Virtual Server
>> +-Name: ipvsadm
>> +-Version: 1.26
>> +-Release: 1
>> +-License: GPL
>> +-URL: http://www.LinuxVirtualServer.org/
>> +-Group: Applications/System
>> +-Source0: http://www.LinuxVirtualServer.org/software/ipvsadm-%{version}.tar.gz
>> +-BuildRoot: /var/tmp/%name-%{PACKAGE_VERSION}-root
>> +-Provides: %{name}-%{version}
>> +-Conflicts: piranha <= 0.4.14
>> +-
>> +-%description
>> +-ipvsadm is a utility to administer the IP Virtual Server services
>> +-offered by the latest Linux kernel 2.6.x.
>> +-
>> +-
>> +-%prep
>> +-%setup -n %{name}-%{version}
>> +-
>> +-
>> +-%build
>> +-CFLAGS="${RPM_OPT_FLAGS}" make
>> +-
>> +-
>> +-%install
>> +-rm -rf $RPM_BUILD_ROOT
>> +-mkdir -p ${RPM_BUILD_ROOT}/{sbin,%{_mandir}/man8,etc/rc.d/init.d}
>> +-make install BUILD_ROOT=${RPM_BUILD_ROOT} MANDIR=%{_mandir}
>> +-
>> +-
>> +-%files
>> +-%defattr(-,root,root)
>> +-%doc README
>> +-%config /etc/rc.d/init.d/ipvsadm
>> +-/sbin/ipvsadm*
>> +-%{_mandir}/man8/ipvsadm*
>> +-
>> +-%post
>> +-/sbin/chkconfig --add ipvsadm
>> +-
>> +-%preun
>> +-/sbin/chkconfig --del ipvsadm
>> +-
>> +-
>> +-%clean
>> +-rm -rf $RPM_BUILD_DIR/%{name}
>> +-rm -rf $RPM_BUILD_ROOT
>> +-
>> +-
>> +-%changelog
>> +-* Thu Jun 23 2005 Steve Nielsen <snielsen at comscore.com>
>> +-- Respect rpmmacros that might be set (by using rpm --eval)
>> +-
>> +-* Sat Dec 20 2003 Wensong Zhang <wensong at linux-vs.org>
>> +-- tidy up the description
>> +-
>> +-* Sat Apr 5 2003 Wensong Zhang <wensong at linux-vs.org>
>> +-- Removed the unnecessary Docdir setting.
>> +-
>> +-* Thu Dec 16 2001 Wensong Zhang <wensong at linuxvirtualserver.org>
>> +-- Changed to install ipvsadm man pages according to the %{_mandir}
>> +-
>> +-* Thu Dec 30 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
>> +-- update the %file section
>> +-
>> +-* Thu Dec 17 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
>> +-- Added a if-condition to keep both new or old rpm utility building
>> +- the package happily.
>> +-
>> +-* Tue Dec 12 2000 P.Copeland <bryce at redhat.com>
>> +-- Small modifications to make the compiler happy in RH7 and the Alpha
>> +-- Fixed the documentation file that got missed off in building
>> +- the rpm
>> +-- Made a number of -pedantic mods though popt will not compile with
>> +- -pedantic
>> +-
>> +-* Wed Aug 9 2000 Horms <horms at vergenet.net>
>> +-- Removed Obseletes tag as ipvsadm is back in /sbin where it belongs
>> +- as it is more or less analogous to both route and ipchains both of
>> +- which reside in /sbin.
>> +-- Create directory to install init script into. Init scripts won't install
>> +- into build directory unless this is done
>> +-
>> +-* Thu Jul 6 2000 Wensong Zhang <wensong at linuxvirtualserver.org>
>> +-- Changed to build rpms on the ipvsadm tar ball directly
>> +-
>> +-* Wed Jun 21 2000 P.Copeland <copeland at redhat.com>
>> +-- fixed silly install permission settings
>> +-
>> +-* Mon Jun 19 2000 P.Copeland <copeland at redhat.com>
>> +-- Added 'dist' and 'rpms' to the Makefile
>> +-- Added Obsoletes tag since there were early versions
>> +- of ipvsadm-*.rpm that installed in /sbin
>> +-- Obsolete tag was a bit vicious re: piranha
>> +-
>> +-* Mon Apr 10 2000 Horms <horms at vergenet.net>
>> +-- created for version 1.9
>> +diff -Naur ipvsadm-1.26/libipvs/ip_vs.h ipvsadm-1.26.owrt/libipvs/ip_vs.h
>> +--- ipvsadm-1.26/libipvs/ip_vs.h 2011-02-07 02:38:57.000000000 +0000
>> ++++ ipvsadm-1.26.owrt/libipvs/ip_vs.h 2016-01-24 19:59:27.304631247 +0000
>> +@@ -10,6 +10,7 @@
>> + #include <sys/socket.h>
>> + #include <arpa/inet.h>
>> + #include <linux/types.h> /* For __beXX types in userland */
>> ++#include <sys/types.h>
>> +
>> + #ifdef LIBIPVS_USE_NL
>> + #include <netlink/netlink.h>
>> +diff -Naur ipvsadm-1.26/libipvs/libipvs.c ipvsadm-1.26.owrt/libipvs/libipvs.c
>> +--- ipvsadm-1.26/libipvs/libipvs.c 2011-02-07 02:38:57.000000000 +0000
>> ++++ ipvsadm-1.26.owrt/libipvs/libipvs.c 2016-01-24 20:02:49.840430677 +0000
>> +@@ -32,7 +32,7 @@
>> + struct ip_vs_getinfo ipvs_info;
>> +
>> + #ifdef LIBIPVS_USE_NL
>> +-static struct nl_handle *sock = NULL;
>> ++static struct nl_sock *sock = NULL;
>
> Am I right that this is for converting from the use of libnl1 to
> libnl3 style api?
I tried first with libnl but for some odd reasons it gave AF_INET errors and
thus it could not parse IP addresses correctly.
>
>> + static int family, try_nl = 1;
>> + #endif
>> +
>> +@@ -73,7 +73,7 @@
>> + {
>> + int err = EINVAL;
>> +
>> +- sock = nl_handle_alloc();
>> ++ sock = nl_socket_alloc();
>> + if (!sock) {
>> + nlmsg_free(msg);
>> + return -1;
>> +@@ -88,7 +88,7 @@
>> +
>> + /* To test connections and set the family */
>> + if (msg == NULL) {
>> +- nl_handle_destroy(sock);
>> ++ nl_socket_free(sock);
>> + sock = NULL;
>> + return 0;
>> + }
>> +@@ -104,12 +104,12 @@
>> +
>> + nlmsg_free(msg);
>> +
>> +- nl_handle_destroy(sock);
>> ++ nl_socket_free(sock);
>> +
>> + return 0;
>> +
>> + fail_genl:
>> +- nl_handle_destroy(sock);
>> ++ nl_socket_free(sock);
>> + sock = NULL;
>> + nlmsg_free(msg);
>> + errno = err;
>> +diff -Naur ipvsadm-1.26/Makefile ipvsadm-1.26.owrt/Makefile
>> +--- ipvsadm-1.26/Makefile 2011-02-08 00:24:23.000000000 +0000
>> ++++ ipvsadm-1.26.owrt/Makefile 2016-01-24 12:40:39.427307725 +0000
>> +@@ -37,18 +37,17 @@
>> +
>> + CC = gcc
>> + INCLUDE =
>> +-SBIN = $(BUILD_ROOT)/sbin
>> ++SBIN = $(DESTDIR)/usr/sbin
>> + MANDIR = usr/man
>> +-MAN = $(BUILD_ROOT)/$(MANDIR)/man8
>> +-INIT = $(BUILD_ROOT)/etc/rc.d/init.d
>> ++INIT = $(DESTDIR)/etc/rc.d/init.d
>> + MKDIR = mkdir
>> + INSTALL = install
>> + STATIC_LIBS = libipvs/libipvs.a
>> +
>> + ifeq "${ARCH}" "sparc64"
>> +- CFLAGS = -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow
>> ++ CFLAGS += -Wall -Wunused -Wstrict-prototypes -g -m64 -pipe -mcpu=ultrasparc -mcmodel=medlow
>> + else
>> +- CFLAGS = -Wall -Wunused -Wstrict-prototypes -g
>> ++ CFLAGS += -Wall -Wunused -Wstrict-prototypes -g
>> + endif
>> +
>> +
>> +@@ -104,12 +103,6 @@
>> + $(INSTALL) -m 0755 ipvsadm $(SBIN)
>> + $(INSTALL) -m 0755 ipvsadm-save $(SBIN)
>> + $(INSTALL) -m 0755 ipvsadm-restore $(SBIN)
>> +- [ -d $(MAN) ] || $(MKDIR) -p $(MAN)
>> +- $(INSTALL) -m 0644 ipvsadm.8 $(MAN)
>> +- $(INSTALL) -m 0644 ipvsadm-save.8 $(MAN)
>> +- $(INSTALL) -m 0644 ipvsadm-restore.8 $(MAN)
>> +- [ -d $(INIT) ] || $(MKDIR) -p $(INIT)
>> +- $(INSTALL) -m 0755 ipvsadm.sh $(INIT)/ipvsadm
>> +
>> + clean:
>> + rm -f ipvsadm $(NAME).spec $(NAME)-$(VERSION).tar.gz
>
> Another patch can be applied to ipvsadm Makefile to let target
> `ipvsadm` depend on `$(STATIC_LIBS)`. This is required for correct
> description of dependency for parallel build. You may want to check
> https://github.com/yousong/build-scripts/blob/master/build-ipvsadm.sh#L35
>
> yousong
I prefer to keep the modifications of the original Makefile to a minimum.
It works fine as it is.
--
Mauro Mozzarelli
Phone: +44 7941 727378
eMail: mauro at ezplanet.net
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list