{"id":6983,"date":"2018-07-30T19:02:28","date_gmt":"2018-07-30T09:02:28","guid":{"rendered":"http:\/\/nsrd.info\/blog\/?p=6983"},"modified":"2018-12-11T07:21:59","modified_gmt":"2018-12-10T21:21:59","slug":"basics-getting-started-with-boostfs","status":"publish","type":"post","link":"https:\/\/nsrd.info\/blog\/2018\/07\/30\/basics-getting-started-with-boostfs\/","title":{"rendered":"Basics &#8211; Getting started with BoostFS"},"content":{"rendered":"<h1>Intro<\/h1>\n<p>One of the things I&#8217;m keen to try in NetWorker 18.1 is the new Orchestrated Application Protection (OAP) feature of NMDA, but in order to get to the point of testing that, I had to first do some configuration around BoostFS. BoostFS has been around for a while, of course, but it&#8217;s just been one of those things that has been sitting on my TODO list for ages: something else always pops up.<\/p>\n<p>Now, if you&#8217;re not familiar with BoostFS, here&#8217;s a quick overview: while it&#8217;s always desirable to have a full client\/agent available for anything you want to protect, sometimes that&#8217;s not going to be possible. New databases for instance, are emerging on the market regularly, and there&#8217;s a depressing number of databases where the developers don&#8217;t give any real consideration towards backup \u2013 they literally only provide an option to dump the live database: nothing in any way more substantial than that. Rather than trying to invent an agent for every conceivable database that comes onto the market, BoostFS gives you the option of mounting a share (over Boost, not NFS or CIFS) directly from the Data Domain to the host you need to provide some form of agentless backup for. You can then write data to this mounted directory&nbsp;<em>while getting all the benefit of source side deduplication<\/em>. In short, this:<\/p>\n<figure id=\"attachment_6871\" aria-describedby=\"caption-attachment-6871\" style=\"width: 657px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/nsrd.info\/blog\/wp-content\/uploads\/2018\/07\/BoostFS-Windows-Linux.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-6871\" src=\"https:\/\/nsrd.info\/blog\/wp-content\/uploads\/2018\/07\/BoostFS-Windows-Linux.png\" alt=\"BoostFS - Windows &amp; Linux\" width=\"657\" height=\"823\" srcset=\"https:\/\/nsrd.info\/blog\/wp-content\/uploads\/2018\/07\/BoostFS-Windows-Linux.png 657w, https:\/\/nsrd.info\/blog\/wp-content\/uploads\/2018\/07\/BoostFS-Windows-Linux-239x300.png 239w, https:\/\/nsrd.info\/blog\/wp-content\/uploads\/2018\/07\/BoostFS-Windows-Linux-160x200.png 160w\" sizes=\"auto, (max-width: 657px) 100vw, 657px\" \/><\/a><figcaption id=\"caption-attachment-6871\" class=\"wp-caption-text\">BoostFS &#8211; Windows &amp; Linux<\/figcaption><\/figure>\n<p>Since OAP leverages BoostFS, I wanted to make sure I could get a basic BoostFS connection running for my environment before I went on to testing out OAP.<\/p>\n<p>To get BoostFS installed, and on a system that I could subsequently run some OAP testing with, I spun up a new Linux virtual machine. (While BoostFS is now available for Windows as well, I&#8217;m still a Unix sysadmin at heart, so my tests will always run towards Linux\/Unix ahead of Windows, unless absolutely necessary.)<\/p>\n<p>The sequence for getting BoostFS enabled and running for a system is as follows:<\/p>\n<ul>\n<li>Get Boost configuration complete on the Data Domain<\/li>\n<li>Install the Boost Plugin on the system that&#8217;ll be mounting a Boost storage unit from the Data Domain<\/li>\n<li>Configure the Boost Plugin, including security settings<\/li>\n<li>Mount the device<\/li>\n<li>Go nuts with the awesome potential of BoostFS!<\/li>\n<\/ul>\n<p>The last is entirely optional, of course, but I personally think BoostFS is pretty cool, so to me, that last point is pretty justified.<\/p>\n<h1>Boost configuration on Data Domain<\/h1>\n<p>If you&#8217;ve configured a Data Domain for Boost connectivity in any other scenario, you&#8217;ll see that this is pretty similar in terms of requirements.<\/p>\n<p>First, make sure the filesystem is running on the Data Domain:<\/p>\n<pre>sysadmin@neutronium# <strong>filesys status<\/strong>\nThe filesystem is enabled and running.<\/pre>\n<p>Next, make sure Boost itself is enabled:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost status<\/strong>\nDD Boost status: enabled<\/pre>\n<p>(Of course, if it isn&#8217;t, do the old &#8220;ddboost enable&#8221; to enable it.)<\/p>\n<p>You also want to make sure distributed segment processing is enabled &#8211; without that, the entire point of BoostFS is pretty much useless. To check on that, run:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost option show<\/strong>\nOption                         Value \n------------------------------ -------\ndistributed-segment-processing enabled\nvirtual-synthetics             enabled\nglobal-authentication-mode     none \nglobal-encryption-strength     none \n------------------------------ -------<\/pre>\n<p>Now, next you need to make sure you&#8217;ve got a Boost user. That&#8217;s something I already had, since the Data Domain in question is being used by NetWorker. You can have multiple Boost users, and if you&#8217;re going to be handing out Boost access\/storage units to multiple teams, that&#8217;s a very good security approach, anyway. In my case, it&#8217;s just me in my lab, and I tend to trust myself, so I stayed with the same Boost user account, and was able to move on to creating a storage unit:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost storage-unit create BoostFSMidkemia user boost<\/strong>\nCreated storage-unit \"BoostFSMidkemia\" for \"boost\".<\/pre>\n<p>You can confirm the storage unit is available using the &#8216;show&#8217; command, viz.:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost storage-unit show<\/strong>\nName            Pre-Comp (GiB) Status User Report Physical\n                                              Size (MiB) \n--------------- -------------- ------ ----- ---------------\nStorageUnit1               0.0 RW     boost               -\norilla                  1924.0 RW     boost               -\nBoostFSMidkemia            0.0 RW     boost               -\n--------------- -------------- ------ ----- ---------------\nD     : Deleted\nQ     : Quota Defined\nRO    : Read Only\nRW    : Read Write\nRD    : Replication Destination<\/pre>\n<p>There&#8217;s some other options around configuring client groups, logical stream limits, etc., but I didn&#8217;t need to worry about that for my configuration and was able to move on to the next step.<\/p>\n<h1>Install the Boost Plugin on the Host<\/h1>\n<p>You&#8217;ll need to download the relevant Boost client first. The product page (including downloads and documentation) can be found on the support website, <strong><a href=\"https:\/\/support.emc.com\/products\/41514_Data-Domain-Boost-\u2013-File-System\" target=\"_blank\" rel=\"noopener\">here<\/a><\/strong>. Download the version that&#8217;s right for you, and install it via the standard OS methods. For me, that was as simple as:<\/p>\n<pre>[root@midkemia ~]# <strong>rpm -ivh DDBoostFS-1.2.0.1-595646.rhel.x86_64.rpm<\/strong> \nPreparing... ########################################### [100%]<\/pre>\n<p>(Rest of output removed.)<\/p>\n<p>For Linux, you&#8217;ll need to ensure you have the fuse and fuse-libs packages installed, as well. They&#8217;re prerequisites of BoostFS on Linux. (After I installed the plugin, I also edited my root user&#8217;s .bash_profile to add <strong>\/opt\/emc\/boostfs\/bin<\/strong> to the execution path.)<\/p>\n<h1>Configure the Boost Plugin<\/h1>\n<p>If you go into the \/opt\/emc\/boostfs\/etc directory, you&#8217;ll find a sample boostfs.conf file. You can either choose to edit this file to suit what you need to do, or create it from scratch, following the installation guide. I chose to create it from scratch, and my resultant file looked like the following:<\/p>\n<pre>[root@midkemia ~]# <strong>cat \/opt\/emc\/boostfs\/etc\/boostfs.conf<\/strong> \n[global]\ndata-domain-system=neutronium.turbamentis.int\nstorage-unit=BoostFSMidkemia\nlockbox-path=\/opt\/emc\/boostfs\/lockbox\/boostfs.lockbox\nlog-enabled=true\nlog-level=info\nlog-dir=\/opt\/emc\/boostfs\/log\nlog-file=output.log\nlog-maxsize=100\nlog-rotate-num=4\n\n[\/neutronium\/boostfs]\ndata-domain-system=neutronium.turbamentis.int\nstorage-unit=BoostFSMidkemia\nsecurity=lockbox\nmtboost-enabled=true\nmtboost-threads=16\nmax-connections=128<\/pre>\n<p>BoostFS can authenticate in one of two different ways: lockbox, and Kerberos. I chose to use the lockbox format, which required the following commands to setup:<\/p>\n<pre>[root@midkemia etc]# <strong>boostfs lockbox set -u boost -d neutronium.turbamentis.int -s BoostFSMidkemia<\/strong>\nEnter storage unit user password: <strong><em>frozenWeaselsTasteFunny<\/em><\/strong>\nEnter storage unit user password again to confirm: <strong><em>frozenWeaselsTasteFunny<\/em><\/strong>\nLockbox entry set<\/pre>\n<p>(No, that&#8217;s not really the password I used, and I&#8217;m sorry if I&#8217;ve picked your random password there.)<\/p>\n<p>The Lockbox can be shared amongst multiple hosts. I only wanted to use it on my current host, but to be on the safe side I ran the host access command as well:<\/p>\n<pre>[root@midkemia etc]# <strong>boostfs lockbox add-hosts midkemia<\/strong>\nLockbox add host(s) completed<\/pre>\n<p>In the configuration file, I&#8217;d specified that I&#8217;d be mounting the storage unit I&#8217;d created at \/neutronium\/boostfs, so that had to be created:<\/p>\n<pre>[root@midkemia etc]# <strong>mkdir -p \/neutronium\/boostfs<\/strong><\/pre>\n<p>With this all done, I was ready to mount the filesystem:<\/p>\n<pre>[root@midkemia etc]# <strong>boostfs mount \/neutronium\/boostfs<\/strong>\n\nmount: Mounting neutronium.turbamentis.int:BoostFSMidkemia on \/neutronium\/boostfs\n\n[root@midkemia etc]# <strong>df -h<\/strong>\nFilesystem            Size  Used Avail Use% Mounted on\n\/dev\/mapper\/vg_midkemia-lv_root\n                       21G  3.0G   17G  15% \/\ntmpfs                 939M     0  939M   0% \/dev\/shm\n\/dev\/sda1             477M   69M  384M  16% \/boot\nboostfs               354G   19G  335G   6% \/neutronium\/boostfs<\/pre>\n<p>There you go!<\/p>\n<h1>Go Nuts with the Awesome Potential of BoostFS<\/h1>\n<p>Right, once you&#8217;ve got the filesystem mounted, you may want to make sure that you&#8217;re really getting distributed segment processing taking place \u2013 i.e., getting client side Boost running. This is actually pretty straight forward \u2013 all you need to do is copy some files into the mount point while watching your stats on the Data Domain.<\/p>\n<p>To test this out, I created a tar file of \/usr on the server, as \/tmp\/usr.tar, and prepared to copy that into the mounted Boost directory.<\/p>\n<pre>[root@midkemia ~]# <strong>du -hs \/usr<\/strong>\n2.2G \/usr\n[root@midkemia ~]# <strong>tar cf \/tmp\/usr.tar \/usr<\/strong>\ntar: Removing leading `\/' from member names\ntar: Removing leading `\/' from hard link targets\n[root@midkemia ~]# <strong>du -hs \/tmp\/usr.tar<\/strong>\n2.1G \/tmp\/usr.tar<\/pre>\n<p>(That&#8217;s not compression, that&#8217;s just tar being a bit more efficient on storage given it&#8217;s lumping all the content into the same file.)<\/p>\n<p>Now, to monitor the Boost protocol in action, I opened a ssh session onto the Data Domain server as the &#8216;sysadmin&#8217; user, and prepared to run the following command:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost show stats interval 2 count 100<\/strong><\/pre>\n<p>The goal was to run that command while the copy was taking place, the copy command being:<\/p>\n<pre>[root@midkemia ~]# <strong>cp \/tmp\/usr.tar \/neutronium\/boostfs\/<\/strong><\/pre>\n<p>So nothing special there &#8211; I&#8217;m not trying to do anything fancy, I just want the file copy to take place. While the copy was taking place, this was the output from the &#8220;show stats&#8221; command. (Note that the spacing is exactly per the output of the command, pasting it into the blog window removes all spaces and I&#8217;ve got to manually add them back in!)<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost show stats interval 2 count 100<\/strong>\n07\/30 01:01:18\nBackup          Post-comp       Network         Restore         Network         Backup  Restore\nKB\/s            Written KB\/s    In KB\/s         KB\/s            Out KB\/s        Conn    Conn \n--------------- --------------- --------------- --------------- --------------- ------- -------\n              0               0               0               0               0       0       0\n          5,817             280             280               0               0       1       0\n         48,360           7,039           7,041               0               0       1       0\n         77,083           6,045           6,047               0               0       1       0 \n         73,787           7,237           7,239               0               0       1       0\n         56,310           2,178           2,178               0               0       1       0\n&lt;snip&gt;\n         50,389           6,846           6,847               0               0       1       0\n          1,654             343             343               0               0       0       0\n              0               0               0               0               0       0       0\n^C<\/pre>\n<p>Hang on, what witch-craft is that? This is the first copy, and I&#8217;m already getting deduplication? Well, there&#8217;s a couple of reasons of course \u2013 deduplication starts from the first chunk of data you send to a Data Domain, of course, but even more so in this case, I&#8217;ve been using this Data Domain for NetWorker backups&nbsp;<em>of Linux systems<\/em>, so a lot of data it&#8217;s seeing here (given tar does not compress) is the same as content it already has on the system. And because deduplication is global, it doesn&#8217;t matter that the content has already been stored by NetWorker.<\/p>\n<p>In fact, we can check on what sort of deduplication we achieved:<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost storage-unit show compression BoostFSMidkemia<\/strong>\n\nList of files in BoostFSMidkemia and their compression info:\n\nusr.tar:\nTotal files: 1; bytes\/storage_used: 5.1\n       Logical Bytes:        2,201,384,960\n      Original Bytes:        2,208,642,332\n Globally Compressed:          799,457,063\n  Locally Compressed:          427,029,578\n           Meta-data:            3,330,296<\/pre>\n<p>And to prove the point, I copied the file again, giving it a new filename on the Data Domain, resulting in the following stats (abbreviated, again):<\/p>\n<pre>sysadmin@neutronium# <strong>ddboost show stats interval 2 count 100<\/strong>\n07\/30 01:13:35\nBackup          Post-comp       Network         Restore         Network         Backup  Restore\nKB\/s            Written KB\/s    In KB\/s         KB\/s Out        KB\/s            Conn    Conn \n--------------- --------------- --------------- --------------- --------------- ------- -------\n          7,768               0               0               0               0       1       0\n         71,879               0               0               0               0       1       0\n         69,936               0               0               0               0       1       0\n         67,928               0               0               0               0       1       0\n         69,935               0               0               0               0       1       0<\/pre>\n<p>And that&#8217;s really all there is to it. With that effort, I&#8217;ve got a source-side deduplication mount point from my Data Domain, ready for database dumps, file copies, etc. Of course, BoostFS isn&#8217;t about replacing say, a NetWorker or Avamar client, but it will give you an option when you need to provide protection for something more esoteric than a conventional client \u2013 e.g., a NoSQL database, etc.<\/p>\n<p>I&#8217;ll be leveraging the install I&#8217;ve done here in an upcoming blog post when I try out OAP \u2013 stay tuned for that.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro One of the things I&#8217;m keen to try in NetWorker 18.1 is the new Orchestrated Application Protection (OAP) feature&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[6,1181,9],"tags":[1243,1460,275],"class_list":["post-6983","post","type-post","status-publish","format-standard","hentry","category-basics","category-data-domain-2","category-databases","tag-basics","tag-boostfs","tag-data-domain"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pKpIN-1OD","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/posts\/6983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/comments?post=6983"}],"version-history":[{"count":4,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/posts\/6983\/revisions"}],"predecessor-version":[{"id":7345,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/posts\/6983\/revisions\/7345"}],"wp:attachment":[{"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/media?parent=6983"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/categories?post=6983"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nsrd.info\/blog\/wp-json\/wp\/v2\/tags?post=6983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}