Rsync (or any other cygwin daemon) as a Windows service
Today I was asked to quickly put together a script to replicate files/directories from a central server to a number of XP clients. This would be dead simple if it was not for Windows.
The customer originally thought of robocopy/xcopy but I dont' really trust them: error reporting is kinda difficult to read and copying over cifs is slow and unreliable. So I set out to build it on top of rsync, but to do that I had to find a way to get rsync installed as a service on all the clients.
Turns out it's quite easy. I started from a clean cygwin install to which I added rsync and cygrunsrv. The latter is the native cygwin tool that can be use to run any tradition *nix daemon as a native Windows service.
Even a basic install like this will be in the order of 50MB or so which is too large for quick deployments. I then started trimming all the stuff that was not essential to the rsync service.
At the end of the trimming process I was left with a mere 10MB, which after being compressed in a nice nsis setup (source here) went down to 5MB. That should be small enough.
This is the complete list of files that I kept from the original cygwin install. I deleted all uneeded programs (like awk, groff, etc), man pages, static libraries, header files, timezones and even language translations (except a few basic ones). Please note that the rsyncd.conf was created by me with the settings needed on this specific occasion:
Now the only thing missing is a bat with the commands used to install the service:
For ssh, telnet, amanda anythin else the steps are quite the same: start from the list above and add the needed dll and binaries. A nsis script that you can use as a template is available here.
The customer originally thought of robocopy/xcopy but I dont' really trust them: error reporting is kinda difficult to read and copying over cifs is slow and unreliable. So I set out to build it on top of rsync, but to do that I had to find a way to get rsync installed as a service on all the clients.
Turns out it's quite easy. I started from a clean cygwin install to which I added rsync and cygrunsrv. The latter is the native cygwin tool that can be use to run any tradition *nix daemon as a native Windows service.
Even a basic install like this will be in the order of 50MB or so which is too large for quick deployments. I then started trimming all the stuff that was not essential to the rsync service.
At the end of the trimming process I was left with a mere 10MB, which after being compressed in a nice nsis setup (source here) went down to 5MB. That should be small enough.
This is the complete list of files that I kept from the original cygwin install. I deleted all uneeded programs (like awk, groff, etc), man pages, static libraries, header files, timezones and even language translations (except a few basic ones). Please note that the rsyncd.conf was created by me with the settings needed on this specific occasion:
. ./bin ./bin/afmtodit ./bin/apropos ./bin/ash.exe ./bin/awk ./bin/bash.exe ./bin/bashbug ./bin/bzcmp ./bin/bzdiff ./bin/bzegrep ./bin/bzfgrep ./bin/bzgrep ./bin/bzless ./bin/bzmore ./bin/chem ./bin/chroot.exe ./bin/copy-user-registry-fstab ./bin/cp.exe ./bin/cygattr-1.dll ./bin/cygbz2-1.dll ./bin/cygcheck.exe ./bin/cygdrop.exe ./bin/cygform-10.dll ./bin/cygformw-10.dll ./bin/cyggcc_s-1.dll ./bin/cyghistory7.dll ./bin/cygiconv-2.dll ./bin/cygintl-8.dll ./bin/cyglsa-config ./bin/cyglsa.dll ./bin/cyglsa64.dll ./bin/cyglzma-5.dll ./bin/cygmagic-1.dll ./bin/cygmenu-10.dll ./bin/cygmenuw-10.dll ./bin/cygmp-3.dll ./bin/cygncurses++-10.dll ./bin/cygncurses++w-10.dll ./bin/cygncursesw-10.dll ./bin/cygpanel-10.dll ./bin/cygpanelw-10.dll ./bin/cygpath.exe ./bin/cygpcre-0.dll ./bin/cygpcreposix-0.dll ./bin/cygpopt-0.dll ./bin/cygreadline7.dll ./bin/cygrunsrv.exe ./bin/cygserver-config ./bin/cygsigsegv-2.dll ./bin/cygstart.exe ./bin/cygtic-10.dll ./bin/cygticw-10.dll ./bin/cygwin-console-helper.exe ./bin/cygwin1.dll ./bin/cygz.dll ./bin/df.exe ./bin/env.exe ./bin/eqn2graph ./bin/gdiffmk ./bin/gettext.sh ./bin/grap2graph ./bin/groffer ./bin/grog ./bin/gunzip ./bin/gzexe ./bin/igawk ./bin/install-info.exe.manifest ./bin/install.exe.manifest ./bin/ipck ./bin/kill.exe ./bin/ls.exe ./bin/lzcat ./bin/lzcmp ./bin/lzdiff ./bin/lzegrep ./bin/lzfgrep ./bin/lzgrep ./bin/lzless ./bin/lzma ./bin/lzmore ./bin/man2dvi ./bin/manlint ./bin/manpath ./bin/md5sum.exe ./bin/mintty.exe ./bin/mkdir.exe ./bin/mmroff ./bin/neqn ./bin/nroff ./bin/pdfroff ./bin/pdftexi2dvi ./bin/peflagsall ./bin/pic2graph ./bin/pwd.exe ./bin/rebaseall ./bin/rm.exe ./bin/roff2dvi ./bin/roff2html ./bin/roff2pdf ./bin/roff2ps ./bin/roff2text ./bin/roff2x ./bin/rsync.exe ./bin/run.exe ./bin/sh.exe ./bin/sleep.exe ./bin/stty.exe ./bin/su.exe ./bin/tail.exe ./bin/texi2dvi ./bin/texi2pdf ./bin/touch.exe ./bin/uncompress ./bin/unlzma ./bin/unxz ./bin/updatedb ./bin/users.exe ./bin/vdir.exe ./bin/wc.exe ./bin/whatis ./bin/which.exe ./bin/xzcat ./bin/xzcmp ./bin/xzdiff ./bin/xzegrep ./bin/xzfgrep ./bin/xzgrep ./bin/xzless ./bin/xzmore ./bin/zcat ./bin/zcmp ./bin/zdiff ./bin/zegrep ./bin/zfgrep ./bin/zforce ./bin/zgrep ./bin/zless ./bin/zmore ./bin/znew ./bin/[.exe ./Cygwin.bat ./Cygwin.ico ./dev ./dev/fd ./dev/mqueue ./dev/shm ./dev/stderr ./dev/stdin ./dev/stdout ./etc ./etc/alternatives ./etc/alternatives/README ./etc/bash.bashrc ./etc/bash.bash_logout ./etc/defaults ./etc/defaults/etc ./etc/defaults/etc/bash.bashrc ./etc/defaults/etc/bash.bash_logout ./etc/defaults/etc/cygserver.conf ./etc/defaults/etc/DIR_COLORS ./etc/defaults/etc/man.conf ./etc/defaults/etc/profile ./etc/defaults/etc/profile.d ./etc/defaults/etc/profile.d/lang.csh ./etc/defaults/etc/profile.d/lang.sh ./etc/defaults/etc/skel ./etc/defaults/etc/skel/.bashrc ./etc/defaults/etc/skel/.bash_profile ./etc/defaults/etc/skel/.inputrc ./etc/defaults/etc/skel/.profile ./etc/DIR_COLORS ./etc/fstab ./etc/fstab.d ./etc/group ./etc/hosts ./etc/man.conf ./etc/mtab ./etc/networks ./etc/passwd ./etc/postinstall ./etc/postinstall/000-cygwin-post-install.sh.done ./etc/postinstall/base-files-mketc.sh.done ./etc/postinstall/base-files-profile.sh.done ./etc/postinstall/bash.sh.done ./etc/postinstall/coreutils.sh.done ./etc/postinstall/man.sh.done ./etc/postinstall/terminfo.sh.done ./etc/postinstall/update-info-dir.sh.done ./etc/preremove ./etc/preremove/base-files-manifest.lst ./etc/preremove/base-files.sh ./etc/preremove/coreutils-manifest.lst ./etc/preremove/coreutils.sh ./etc/preremove/man.sh ./etc/profile ./etc/profile.d ./etc/profile.d/lang.csh ./etc/profile.d/lang.sh ./etc/protocols ./etc/rsyncd.conf ./etc/services ./etc/setup ./etc/setup/alternatives.lst.gz ./etc/setup/base-cygwin.lst.gz ./etc/setup/base-files.lst.gz ./etc/setup/bash.lst.gz ./etc/setup/bzip2.lst.gz ./etc/setup/coreutils.lst.gz ./etc/setup/cygrunsrv.lst.gz ./etc/setup/cygutils.lst.gz ./etc/setup/cygwin-doc.lst.gz ./etc/setup/cygwin.lst.gz ./etc/setup/dash.lst.gz ./etc/setup/diffutils.lst.gz ./etc/setup/dos2unix.lst.gz ./etc/setup/editrights.lst.gz ./etc/setup/file.lst.gz ./etc/setup/findutils.lst.gz ./etc/setup/gawk.lst.gz ./etc/setup/gettext.lst.gz ./etc/setup/grep.lst.gz ./etc/setup/groff.lst.gz ./etc/setup/gzip.lst.gz ./etc/setup/installed.db ./etc/setup/ipc-utils.lst.gz ./etc/setup/less.lst.gz ./etc/setup/libattr1.lst.gz ./etc/setup/libbz2_1.lst.gz ./etc/setup/libgcc1.lst.gz ./etc/setup/libgmp3.lst.gz ./etc/setup/libiconv2.lst.gz ./etc/setup/libintl8.lst.gz ./etc/setup/liblzma5.lst.gz ./etc/setup/libncurses10.lst.gz ./etc/setup/libncursesw10.lst.gz ./etc/setup/libpcre0.lst.gz ./etc/setup/libpopt0.lst.gz ./etc/setup/libreadline7.lst.gz ./etc/setup/libsigsegv2.lst.gz ./etc/setup/libstdc++6.lst.gz ./etc/setup/login.lst.gz ./etc/setup/man.lst.gz ./etc/setup/mintty.lst.gz ./etc/setup/rebase.lst.gz ./etc/setup/rsync.lst.gz ./etc/setup/run.lst.gz ./etc/setup/sed.lst.gz ./etc/setup/setup.rc ./etc/setup/tar.lst.gz ./etc/setup/terminfo.lst.gz ./etc/setup/texinfo.lst.gz ./etc/setup/timestamp ./etc/setup/tzcode.lst.gz ./etc/setup/which.lst.gz ./etc/setup/xz.lst.gz ./etc/setup/zlib0.lst.gz ./etc/setup/_update-info-dir.lst.gz ./etc/skel ./etc/skel/.bashrc ./etc/skel/.bash_profile ./etc/skel/.inputrc ./etc/skel/.profile ./home ./lib ./service_install.bat ./service_uninstall.bat ./tmp ./usr ./usr/local ./usr/local/bin ./usr/local/etc ./usr/local/lib ./usr/sbin ./usr/sbin/alternatives.exe ./usr/sbin/backup ./usr/sbin/cygserver.exe ./usr/sbin/makewhatis ./usr/sbin/restore ./usr/sbin/tzselect ./usr/sbin/update-alternatives ./usr/sbin/zdump.exe ./usr/sbin/zic.exe ./usr/share ./usr/share/awk ./usr/share/awk/assert.awk ./usr/share/awk/bits2str.awk ./usr/share/awk/cliff_rand.awk ./usr/share/awk/ctime.awk ./usr/share/awk/ftrans.awk ./usr/share/awk/getopt.awk ./usr/share/awk/gettime.awk ./usr/share/awk/group.awk ./usr/share/awk/join.awk ./usr/share/awk/libintl.awk ./usr/share/awk/noassign.awk ./usr/share/awk/ord.awk ./usr/share/awk/passwd.awk ./usr/share/awk/quicksort.awk ./usr/share/awk/readable.awk ./usr/share/awk/rewind.awk ./usr/share/awk/round.awk ./usr/share/awk/strtonum.awk ./usr/share/awk/walkarray.awk ./usr/share/awk/zerofile.awk ./usr/share/file ./usr/share/file/magic ./usr/share/gettext ./usr/share/gettext/ABOUT-NLS ./usr/share/locale ./usr/share/locale/en@boldquot ./usr/share/locale/en@boldquot/LC_MESSAGES ./usr/share/locale/en@boldquot/LC_MESSAGES/bash.mo ./usr/share/locale/en@boldquot/LC_MESSAGES/gettext-runtime.mo ./usr/share/locale/en@quot ./usr/share/locale/en@quot/LC_MESSAGES ./usr/share/locale/en@quot/LC_MESSAGES/bash.mo ./usr/share/locale/en@quot/LC_MESSAGES/gettext-runtime.mo ./usr/share/locale/en_GB ./usr/share/locale/en_GB/LC_MESSAGES ./usr/share/locale/en_GB/LC_MESSAGES/alternatives.mo ./usr/share/locale/eu ./usr/share/locale/eu/LC_MESSAGES ./usr/share/locale/eu/LC_MESSAGES/coreutils.mo ./usr/share/locale/eu/LC_MESSAGES/grep.mo ./usr/share/locale/eu/LC_MESSAGES/sed.mo ./usr/share/locale/eu/LC_MESSAGES/tar.mo ./usr/share/locale/eu/LC_TIME ./usr/share/locale/eu/LC_TIME/coreutils.mo ./usr/share/locale/it ./usr/share/locale/it/LC_MESSAGES ./usr/share/locale/it/LC_MESSAGES/alternatives.mo ./usr/share/locale/it/LC_MESSAGES/coreutils.mo ./usr/share/locale/it/LC_MESSAGES/diffutils.mo ./usr/share/locale/it/LC_MESSAGES/findutils.mo ./usr/share/locale/it/LC_MESSAGES/gawk.mo ./usr/share/locale/it/LC_MESSAGES/gettext-runtime.mo ./usr/share/locale/it/LC_MESSAGES/grep.mo ./usr/share/locale/it/LC_MESSAGES/sed.mo ./usr/share/locale/it/LC_MESSAGES/tar.mo ./usr/share/locale/it/LC_MESSAGES/xz.mo ./usr/share/locale/it/LC_TIME ./usr/share/locale/it/LC_TIME/coreutils.mo ./usr/share/locale/locale.alias ./usr/share/magic ./usr/share/misc ./usr/share/tabset ./usr/share/tabset/std ./usr/share/tabset/stdcrt ./usr/share/tabset/vt100 ./usr/share/tabset/vt300 ./usr/share/terminfo ./usr/share/terminfo/41 ./usr/share/terminfo/41/Apple_Terminal ./usr/share/terminfo/45 ./usr/share/terminfo/45/Eterm ./usr/share/terminfo/45/Eterm-256color ./usr/share/terminfo/45/Eterm-88color ./usr/share/terminfo/45/Eterm-color ./usr/share/terminfo/61 ./usr/share/terminfo/61/ansi ./usr/share/terminfo/61/ansi80x25 ./usr/share/terminfo/61/ansis ./usr/share/terminfo/63 ./usr/share/terminfo/63/cons25 ./usr/share/terminfo/63/cygwin ./usr/share/terminfo/63/cygwin-1p5 ./usr/share/terminfo/63/cygwin-old ./usr/share/terminfo/64 ./usr/share/terminfo/64/dumb ./usr/share/terminfo/67 ./usr/share/terminfo/67/gnome ./usr/share/terminfo/67/gnome+pcfkeys ./usr/share/terminfo/67/gnome-2007 ./usr/share/terminfo/67/gnome-2008 ./usr/share/terminfo/67/gnome-256color ./usr/share/terminfo/67/gnome-fc5 ./usr/share/terminfo/67/gnome-rh62 ./usr/share/terminfo/67/gnome-rh72 ./usr/share/terminfo/67/gnome-rh80 ./usr/share/terminfo/67/gnome-rh90 ./usr/share/terminfo/68 ./usr/share/terminfo/68/hurd ./usr/share/terminfo/6a ./usr/share/terminfo/6a/jfbterm ./usr/share/terminfo/6b ./usr/share/terminfo/6b/kon ./usr/share/terminfo/6b/kon2 ./usr/share/terminfo/6c ./usr/share/terminfo/6c/linux ./usr/share/terminfo/6d ./usr/share/terminfo/6d/mach ./usr/share/terminfo/6d/mach-bold ./usr/share/terminfo/6d/mach-color ./usr/share/terminfo/6d/mlterm ./usr/share/terminfo/6d/mrxvt ./usr/share/terminfo/6e ./usr/share/terminfo/6e/nsterm ./usr/share/terminfo/6e/nsterm-old ./usr/share/terminfo/6e/nxterm ./usr/share/terminfo/70 ./usr/share/terminfo/70/pcansi ./usr/share/terminfo/70/putty ./usr/share/terminfo/70/putty-256color ./usr/share/terminfo/70/putty-vt100 ./usr/share/terminfo/72 ./usr/share/terminfo/72/rxvt ./usr/share/terminfo/72/rxvt+pcfkeys ./usr/share/terminfo/72/rxvt-16color ./usr/share/terminfo/72/rxvt-256color ./usr/share/terminfo/72/rxvt-88color ./usr/share/terminfo/72/rxvt-basic ./usr/share/terminfo/72/rxvt-color ./usr/share/terminfo/72/rxvt-cygwin ./usr/share/terminfo/72/rxvt-cygwin-native ./usr/share/terminfo/72/rxvt-xpm ./usr/share/terminfo/73 ./usr/share/terminfo/73/screen ./usr/share/terminfo/73/screen+fkeys ./usr/share/terminfo/73/screen-16color ./usr/share/terminfo/73/screen-16color-bce ./usr/share/terminfo/73/screen-16color-bce-s ./usr/share/terminfo/73/screen-16color-s ./usr/share/terminfo/73/screen-256color ./usr/share/terminfo/73/screen-256color-bce ./usr/share/terminfo/73/screen-256color-bce-s ./usr/share/terminfo/73/screen-256color-s ./usr/share/terminfo/73/screen-bce ./usr/share/terminfo/73/screen-s ./usr/share/terminfo/73/screen-w ./usr/share/terminfo/73/screen.Eterm ./usr/share/terminfo/73/screen.linux ./usr/share/terminfo/73/screen.mlterm ./usr/share/terminfo/73/screen.rxvt ./usr/share/terminfo/73/screen.teraterm ./usr/share/terminfo/73/screen.xterm-new ./usr/share/terminfo/73/screen.xterm-r6 ./usr/share/terminfo/73/screen.xterm-xfree86 ./usr/share/terminfo/73/screen2 ./usr/share/terminfo/73/screen3 ./usr/share/terminfo/73/sun ./usr/share/terminfo/73/sun1 ./usr/share/terminfo/73/sun2 ./usr/share/terminfo/74 ./usr/share/terminfo/74/teraterm ./usr/share/terminfo/76 ./usr/share/terminfo/76/vs100 ./usr/share/terminfo/76/vt100 ./usr/share/terminfo/76/vt100-am ./usr/share/terminfo/76/vt100-nav ./usr/share/terminfo/76/vt102 ./usr/share/terminfo/76/vt200 ./usr/share/terminfo/76/vt220 ./usr/share/terminfo/76/vt52 ./usr/share/terminfo/77 ./usr/share/terminfo/77/wsvt25 ./usr/share/terminfo/77/wsvt25m ./usr/share/terminfo/78 ./usr/share/terminfo/78/xfce ./usr/share/terminfo/78/xterm ./usr/share/terminfo/78/xterm+256color ./usr/share/terminfo/78/xterm+88color ./usr/share/terminfo/78/xterm+app ./usr/share/terminfo/78/xterm+edit ./usr/share/terminfo/78/xterm+noapp ./usr/share/terminfo/78/xterm+pc+edit ./usr/share/terminfo/78/xterm+pcc0 ./usr/share/terminfo/78/xterm+pcc1 ./usr/share/terminfo/78/xterm+pcc2 ./usr/share/terminfo/78/xterm+pcc3 ./usr/share/terminfo/78/xterm+pce2 ./usr/share/terminfo/78/xterm+pcf0 ./usr/share/terminfo/78/xterm+pcf2 ./usr/share/terminfo/78/xterm+pcfkeys ./usr/share/terminfo/78/xterm+r6f2 ./usr/share/terminfo/78/xterm+sl ./usr/share/terminfo/78/xterm+sl-twm ./usr/share/terminfo/78/xterm+vt+edit ./usr/share/terminfo/78/xterm-1002 ./usr/share/terminfo/78/xterm-1003 ./usr/share/terminfo/78/xterm-16color ./usr/share/terminfo/78/xterm-24 ./usr/share/terminfo/78/xterm-256color ./usr/share/terminfo/78/xterm-88color ./usr/share/terminfo/78/xterm-8bit ./usr/share/terminfo/78/xterm-basic ./usr/share/terminfo/78/xterm-bold ./usr/share/terminfo/78/xterm-color ./usr/share/terminfo/78/xterm-hp ./usr/share/terminfo/78/xterm-new ./usr/share/terminfo/78/xterm-nic ./usr/share/terminfo/78/xterm-noapp ./usr/share/terminfo/78/xterm-old ./usr/share/terminfo/78/xterm-pcolor ./usr/share/terminfo/78/xterm-r5 ./usr/share/terminfo/78/xterm-r6 ./usr/share/terminfo/78/xterm-sco ./usr/share/terminfo/78/xterm-sun ./usr/share/terminfo/78/xterm-vt220 ./usr/share/terminfo/78/xterm-vt52 ./usr/share/terminfo/78/xterm-xf86-v32 ./usr/share/terminfo/78/xterm-xf86-v33 ./usr/share/terminfo/78/xterm-xf86-v333 ./usr/share/terminfo/78/xterm-xf86-v40 ./usr/share/terminfo/78/xterm-xf86-v43 ./usr/share/terminfo/78/xterm-xf86-v44 ./usr/share/terminfo/78/xterm-xfree86 ./usr/share/terminfo/78/xterm-xi ./usr/share/terminfo/78/xterm1 ./usr/share/terminfo/78/xtermc ./usr/share/terminfo/78/xtermm ./usr/share/terminfo/78/xterms ./usr/share/terminfo/78/xterms-sun ./usr/share/texinfo ./usr/share/texinfo/texinfo.cat ./usr/share/texinfo/texinfo.dtd ./usr/share/texinfo/texinfo.xsl ./usr/src ./usr/tmp ./var ./var/cache ./var/cache/man ./var/cache/man/.keep-man ./var/lib ./var/lib/alternatives ./var/lib/alternatives/.keep-alternatives ./var/log ./var/run ./var/run/utmp ./var/tmp
Now the only thing missing is a bat with the commands used to install the service:
c: cd c:\cygwin\bin\ cygrunsrv -I "RSYNC" -d "Rsync server" -p /bin/rsync.exe -a "--daemon --no-detach" net start RSYNC
For ssh, telnet, amanda anythin else the steps are quite the same: start from the list above and add the needed dll and binaries. A nsis script that you can use as a template is available here.