Specifically I would like to track my grub.conf
(/boot/grub/grub.conf
) and some oracle files (i.e. /db/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
).
I attempted using links; however etckeeper/git only tracks where the link points to, not the actual contents. And I can not create hard links as the files are on another volume.
I know I could setup another GIT repository but I would rather have it all within etckeeper.
Update
Based on nealmcb's answer I came up with the following script:
#!/bin/sh
set -e
# Based on nealmcb's idea/script from http://serverfault.com/questions/211425/
# If you want other configuration data or files on the system also
# opportunistically tracked via etckeeper, use this script to copy them in.
# If there is a hook of some sort available related to the files
# you're mirroring, you can call etckeeper directly and track them
# proactively, rather than just opportunistically here.
MIRROR_ROOT=/etc/etckeeper.mirror.d
echo "etckeeper: mirroring outside files to $MIRROR_ROOT/:"
mirror_dir() {
LOCAL_PATH=$1
echo " $LOCAL_PATH"
mkdir -p $MIRROR_ROOT/$LOCAL_PATH
rsync -a $LOCAL_PATH/ $MIRROR_ROOT/$LOCAL_PATH
}
mirror_dir "/boot/grub"
mirror_dir "/root"
To add or remove a path you simply add or remove the mirror_dir
call at the bottom.
I edited the above script to also include plain files.
maybe someone should add a possibility to configure this outside a script (in the etckeeper config?) and send this as a patch to joey hess?
etckeeper does allow you to integrate it with other systems.
I also wanted to track changes made by update-grub in /boot, so I put the code below in
/etc/etckeeper/commit.d/20mirror-outside-files
This way any time etckeeper is called for other reasons (when I install software, sometimes nightly, etc), it will grab and track revisions in the latest grub configuration.
I invented the convention to put this stuff under /etc/Mirror/path-to-outside-file, e.g.
/etc/Mirror/boot/grub/grub.cfg
but if anyone has precedent for another such convention, I'd love to hear about it.Update:
Note that for some reason etckeeper doesn't run this when you do an apt-get remove or purge, e.g. to delete an old kernel. Odd.... But you can run
sudo etckeeper commit
manually in that case, or after a manualupdate-grub
.etckeeper now has a
-d
option to indicate on which directory it must operate.While hooks to trigger etckeeper generally use construct as
etckeeper pre-install
, ..., you will have to add hooks that useetckeeper pre-install -d /boot/grub
instead. This shall avoid file duplication in your approach.Note that if you consider that systemd target, service, ..., files are configuration files (I do - after all, files under
/lib/systemd
are not that different from files under/etc/init.d
) then this-d
option will help you to keep track of what happen in/lib/systemd
.From synopsis:
etckeeper init -d /directory
But beware! the next time you run it, or next week, if you forget
-d path
, it'll could create a new standalone local repo with the default location in/etc
.So I'd recommend committing this important detail to it's config, in etckeeper.conf. A quick,
grep /etc \``which etckeeper\``
, reveals:ETCKEEPER_DIR=/etc
, and so just use this variable in etckeeper.conf.From a desire to "keep" other stuff, file attributes included,
etckeeper init -d /
worked for me, but later forgetting the detail is annoying. So best to save this detail. Also,uninit
does not undo using the VCS, it just deletes the whole local repo.I don't think etckeeper will do this, but there are a couple of solutions:
reverse the links: put a link out on the filesystem to a file in /etc/
script the copying of those files into /etc (backup) and out of /etc (restore). Then use those scripts periodically or in an appropriate git hook.
I prefer the global setting in etckeeper.conf
while having a .gitignore that is blacklisting everything but some specific files:
etckeeper init worked, etckeeper add as well. However an etckeeper commit still scans all the / tree and doesn't come back. I already removed 20warn-problem-files , because I know the specific files being added. Debugging with bash -x shows