spielwiese. (Posts about snapshot.)https://spielwiese.fontein.de/tag/snapshot.atom2024-01-05T07:10:21ZfelixNikolaautomatic snapshots with btrfs.https://spielwiese.fontein.de/2014/04/27/automatic-snapshots-with-btrfs/2014-04-27T15:30:10+02:002014-04-27T15:30:10+02:00felix<p>last summer, after buying a new four terabyte harddisk for my main computer (replacing the old and notoriously full one terabyte harddisk), i wanted to try something new. instead of using ext2/3/4, i decided to switch to the <a href="https://en.wikipedia.org/wiki/Btrfs">btrfs</a> filesystem. the main feature why i wanted to use btrfs was the ability to quickly create snapshots of the current disk content on the fly, thus being able to browse through how the disk looked some time ago. the snapshots are essentially only the difference between the old data and the new, thus they are essentially free if the disk content isn’t changing a lot between the snapshots. which, at least for me, is usually the case.<br>
i’m using btrfs only for the <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/home partition</code></span>, to which i added a subdirectory <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/home/backup</code></span> to store backups. in this post, i want to explain how to set up a simple system which makes a snapshot every ten minutes, and cleans up older snapshots so that</p>
<ul>
<li>for snapshots older than a day, only one snapshot is left for every hour, and</li>
<li>for snapshots older than a week, only one snapshot is left for every day, and</li>
<li>for snapshots older than a year, only one snapshot is left for every month.</li>
</ul>
<p>so even with a lot of changes inbetween, the number of snapshots shouldn’t be too big, and thus not too much space will be wasted, while still allowing to access old (and deleted!) data. note that changing the interval from every ten to, say, <i>every minute</i> should be no problem. if you ever accidently delete something, you’ll have no problem to resurrect the file even if you only notice some hours, days, weeks or even months later. (providing that the file has already been around for at least a similar time interval.)</p>
<p>one note regarding btrfs in general. while btrfs is still marked experimental, it seems to be pretty stable in practice. the only caveat is that you should <b>never</b> fill btrfs disks too much. always make sure enough space is left. that shouldn’t be a problem for my four terabyte disk for quite some time, but in case you love to quickly fill space, better get more than one drive and join them (via raid zero or something like that). also, note that one btrfs filesystem can span over several partitions and disks, and that it can internally do several raid modes. in fact, that’s something i want to try out soon, by combining a bunch of older harddisks i’ve still lying around in a jbod array and putting a raid one btrfs filesystem over all of them. note that btrfs will in the future allow to configure this even more refined (like increasing redundancy, or also using different configurations <i>per file</i>), and that it’s always possible to update a filesystem <i>on the fly</i> while it is mounted.</p>
<h4>creating read-only snapshots.</h4>
<p>creating a read-only snapshot is simple: just run <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>btrfs subvolume snapshot -r /home /home/backup/name_of_snapshot</code></span>. (if you want snapshots you can also write to, drop the <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>-r</code></span>.) for example, you could create a little shell script:<br>
</p><div class="code-bash"><pre class="code literal-block"><span></span><span class="linenos">1</span><span class="ch">#!/bin/bash</span>
<span class="linenos">2</span><span class="nv">TIMESTAMP</span><span class="o">=</span><span class="sb">`</span>date<span class="w"> </span>+<span class="s2">"%Y-%m-%d-%H%M%S"</span><span class="sb">`</span>
<span class="linenos">3</span>btrfs<span class="w"> </span>subvolume<span class="w"> </span>snapshot<span class="w"> </span>-r<span class="w"> </span>/home<span class="w"> </span>/home/backup/<span class="nv">$TIMESTAMP</span>
<span class="linenos">4</span>rm<span class="w"> </span>-rf<span class="w"> </span>/home/backup/<span class="nv">$TIMESTAMP</span>/backup/20*
</pre></div><br>
this creates a read-only snapshot based on the current date, and cleans up the <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/backup</code></span> subdirectory of <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/home/backup</code></span> in the snapshot. after all, we don’t want to recursively increase the tree’s depth by having links to all older snapshots in each snapshot.
<p>setting up your computer to execute this script regularly is quite simple. let’s say it is stored as <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/home/backup/snapshot.sh</code></span> with read and execution priviledges for <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>root</code></span>; then you could run <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>crontab -e</code></span> as <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>root</code></span> and add a line like<br>
<span class="code-unformatted inline-code"><code class="code literal-block"><span></span>1,11,21,31,41,51 * * * * root /bin/bash -c "/home/backup/snapshot.sh &>> /var/log/snapshot.log"</code></span><br>
this runs the script at xx:01, xx:11, xx:21, xx:31, xx:41 and xx:51 for every hour xx on every day during the whole year. the script’s output (which should be essentially something like <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>Create a snapshot of '/home' in '/home/backup/2014-04-27-000100'</code></span>) is stored in a log file <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/var/log/snapshot.log</code></span>.</p>
<h4>cleaning up.</h4>
<p>cleaning up is a little more complicated. deleting a snapshot itself is easy: just run <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>btrfs subvolume delete /home/backup/name_of_snapshot</code></span>. to delete snapshots according to the rules i wrote up above, i wrote a little python script:<br>
</p><div class="code-python"><pre class="code literal-block"><span></span><span class="linenos"> 1</span><span class="ch">#!/usr/bin/python2</span>
<span class="linenos"> 2</span><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">os.path</span><span class="o">,</span> <span class="nn">datetime</span><span class="o">,</span> <span class="nn">subprocess</span>
<span class="linenos"> 3</span>
<span class="linenos"> 4</span><span class="k">class</span> <span class="nc">CannotParse</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="linenos"> 5</span> <span class="k">pass</span>
<span class="linenos"> 6</span>
<span class="linenos"> 7</span><span class="c1"># Find all directories in /home/backup</span>
<span class="linenos"> 8</span><span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span>
<span class="linenos"> 9</span><span class="n">td_day</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="linenos">10</span><span class="n">td_week</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">weeks</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="linenos">11</span><span class="n">td_month</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">31</span><span class="p">)</span>
<span class="linenos">12</span><span class="n">monthold</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
<span class="linenos">13</span><span class="n">weekold</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
<span class="linenos">14</span><span class="n">dayold</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
<span class="linenos">15</span><span class="n">rest</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
<span class="linenos">16</span><span class="k">for</span> <span class="n">file</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="s1">'/home/backup'</span><span class="p">):</span>
<span class="linenos">17</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">file</span><span class="p">):</span>
<span class="linenos">18</span> <span class="c1"># Interpret name as timestamp</span>
<span class="linenos">19</span> <span class="n">data</span> <span class="o">=</span> <span class="n">file</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'-'</span><span class="p">)</span>
<span class="linenos">20</span> <span class="k">try</span><span class="p">:</span>
<span class="linenos">21</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
<span class="linenos">22</span> <span class="n">year</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="linenos">23</span> <span class="n">month</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="linenos">24</span> <span class="n">day</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="linenos">25</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
<span class="linenos">26</span> <span class="n">hour</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">])</span>
<span class="linenos">27</span> <span class="n">minute</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">2</span><span class="p">:</span><span class="mi">4</span><span class="p">])</span>
<span class="linenos">28</span> <span class="n">second</span> <span class="o">=</span> <span class="mi">0</span>
<span class="linenos">29</span> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">==</span> <span class="mi">6</span><span class="p">:</span>
<span class="linenos">30</span> <span class="n">hour</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">])</span>
<span class="linenos">31</span> <span class="n">minute</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">2</span><span class="p">:</span><span class="mi">4</span><span class="p">])</span>
<span class="linenos">32</span> <span class="n">second</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">4</span><span class="p">:</span><span class="mi">6</span><span class="p">])</span>
<span class="linenos">33</span> <span class="k">else</span><span class="p">:</span>
<span class="linenos">34</span> <span class="k">raise</span> <span class="n">CannotParse</span><span class="p">()</span>
<span class="linenos">35</span> <span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="n">year</span><span class="p">,</span> <span class="n">month</span><span class="p">,</span> <span class="n">day</span><span class="p">,</span> <span class="n">hour</span><span class="p">,</span> <span class="n">minute</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
<span class="linenos">36</span> <span class="n">isodate</span> <span class="o">=</span> <span class="n">timestamp</span><span class="o">.</span><span class="n">isocalendar</span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span><span class="n">hour</span><span class="p">,</span> <span class="n">minute</span><span class="p">,</span> <span class="n">second</span><span class="p">)</span>
<span class="linenos">37</span> <span class="k">else</span><span class="p">:</span>
<span class="linenos">38</span> <span class="k">raise</span> <span class="n">CannotParse</span><span class="p">()</span>
<span class="linenos">39</span>
<span class="linenos">40</span> <span class="n">age</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="n">timestamp</span>
<span class="linenos">41</span> <span class="k">if</span> <span class="n">age</span> <span class="o">>=</span> <span class="n">td_month</span><span class="p">:</span>
<span class="linenos">42</span> <span class="nb">id</span> <span class="o">=</span> <span class="n">isodate</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">]</span>
<span class="linenos">43</span> <span class="n">d</span> <span class="o">=</span> <span class="n">monthold</span>
<span class="linenos">44</span> <span class="k">elif</span> <span class="n">age</span> <span class="o">>=</span> <span class="n">td_week</span><span class="p">:</span>
<span class="linenos">45</span> <span class="nb">id</span> <span class="o">=</span> <span class="n">isodate</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span>
<span class="linenos">46</span> <span class="n">d</span> <span class="o">=</span> <span class="n">weekold</span>
<span class="linenos">47</span> <span class="k">elif</span> <span class="n">age</span> <span class="o">>=</span> <span class="n">td_day</span><span class="p">:</span>
<span class="linenos">48</span> <span class="nb">id</span> <span class="o">=</span> <span class="n">isodate</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">4</span><span class="p">]</span>
<span class="linenos">49</span> <span class="n">d</span> <span class="o">=</span> <span class="n">dayold</span>
<span class="linenos">50</span> <span class="k">else</span><span class="p">:</span>
<span class="linenos">51</span> <span class="nb">id</span> <span class="o">=</span> <span class="n">isodate</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">6</span><span class="p">]</span>
<span class="linenos">52</span> <span class="n">d</span> <span class="o">=</span> <span class="n">rest</span>
<span class="linenos">53</span> <span class="k">if</span> <span class="nb">id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
<span class="linenos">54</span> <span class="n">d</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
<span class="linenos">55</span> <span class="n">d</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">timestamp</span><span class="p">,</span> <span class="n">file</span><span class="p">])</span>
<span class="linenos">56</span> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="linenos">57</span> <span class="k">pass</span>
<span class="linenos">58</span>
<span class="linenos">59</span><span class="k">def</span> <span class="nf">work</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">title</span><span class="p">):</span>
<span class="linenos">60</span> <span class="k">for</span> <span class="nb">id</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
<span class="linenos">61</span> <span class="nb">list</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
<span class="linenos">62</span> <span class="nb">list</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="linenos">63</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="linenos">64</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="linenos">65</span> <span class="n">retcode</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">call</span><span class="p">([</span><span class="s1">'btrfs'</span><span class="p">,</span> <span class="s1">'subvolume'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">,</span> <span class="s1">'/home/backup/'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">])])</span>
<span class="linenos">66</span> <span class="k">if</span> <span class="n">retcode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="linenos">67</span> <span class="nb">print</span> <span class="s1">'Error! (Return code '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">retcode</span><span class="p">)</span> <span class="o">+</span> <span class="s1">')'</span>
<span class="linenos">68</span>
<span class="linenos">69</span><span class="n">work</span><span class="p">(</span><span class="n">monthold</span><span class="p">,</span> <span class="s2">"MONTH OLD:"</span><span class="p">)</span>
<span class="linenos">70</span><span class="n">work</span><span class="p">(</span><span class="n">weekold</span><span class="p">,</span> <span class="s2">"WEEK OLD:"</span><span class="p">)</span>
<span class="linenos">71</span><span class="n">work</span><span class="p">(</span><span class="n">dayold</span><span class="p">,</span> <span class="s2">"DAY OLD:"</span><span class="p">)</span>
<span class="linenos">72</span><span class="n">work</span><span class="p">(</span><span class="n">rest</span><span class="p">,</span> <span class="s2">"REST:"</span><span class="p">)</span>
</pre></div>
<p>i stored it as <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/home/backup/cleanup.py</code></span> and made it runnable by <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>root</code></span>, and scheduled it to be run every hour at a fixed minute offset (say, xx:59) by running <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>crontab -e</code></span> and adding<br>
<span class="code-unformatted inline-code"><code class="code literal-block"><span></span>59 * * * * root /bin/bash -c "/home/backup/cleanup.py &>> /var/log/snapshot.log"</code></span><br>
again, the output is put into <span class="code-unformatted inline-code"><code class="code literal-block"><span></span>/var/log/snapshot.log</code></span>.</p>more snapshots.https://spielwiese.fontein.de/2011/01/10/more-snapshots/2011-01-10T19:07:29+01:002011-01-10T19:07:29+01:00felix<p>here are some more snapshots i made while roaming through the house:</p>
<div class="lazygal" id="lazygal-gallery-lazygal_2011__01__10__snapshot_1"><noscript><div class="lazygal-image-container" style="width: 49.0%; margin: 0.5%; width: calc(50.0% - 2px); margin: calc(1px + 0px); max-width: 442px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/sh-01.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 66.36363636363637%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/sh-01-bw-440x292.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div><div class="lazygal-image-container" style="width: 49.0%; margin: 0.5%; width: calc(50.0% - 2px); margin: calc(1px + 0px); max-width: 442px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/sh-02.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 66.36363636363637%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/sh-02-bw-440x292.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div><br><div class="lazygal-image-container" style="width: 32.33333333333333%; margin: 0.5%; width: calc(33.33333333333333% - 2px); margin: calc(1px + 0px); max-width: 294px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/sh-03.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 150.68493150684932%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/sh-03-bw-292x440.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div><div class="lazygal-image-container" style="width: 32.33333333333333%; margin: 0.5%; width: calc(33.33333333333333% - 2px); margin: calc(1px + 0px); max-width: 294px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/sh-04.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 150.68493150684932%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/sh-04-bw-292x440.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div><div class="lazygal-image-container" style="width: 32.33333333333333%; margin: 0.5%; width: calc(33.33333333333333% - 2px); margin: calc(1px + 0px); max-width: 294px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/sh-05.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 150.68493150684932%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/sh-05-bw-292x440.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div></noscript></div><script type="text/javascript">/*<![CDATA[*/lazygal.register_gallery([['/photos/2011/01/sh-01.jpeg',1024,681,50,'',['/photos/2011/01/sh-01-bw-440x292.jpeg','/photos/2011/01/sh-01-col-440x292.jpeg'],440,292],['/photos/2011/01/sh-02.jpeg',1024,681,50,'',['/photos/2011/01/sh-02-bw-440x292.jpeg','/photos/2011/01/sh-02-col-440x292.jpeg'],440,292],['/photos/2011/01/sh-03.jpeg',681,1024,33,'',['/photos/2011/01/sh-03-bw-292x440.jpeg','/photos/2011/01/sh-03-col-292x440.jpeg'],292,440],['/photos/2011/01/sh-04.jpeg',681,1024,33,'',['/photos/2011/01/sh-04-bw-292x440.jpeg','/photos/2011/01/sh-04-col-292x440.jpeg'],292,440],['/photos/2011/01/sh-05.jpeg',681,1024,33,'',['/photos/2011/01/sh-05-bw-292x440.jpeg','/photos/2011/01/sh-05-col-292x440.jpeg'],292,440]],[[0,1],[2,3,4]],document.getElementById("lazygal-gallery-lazygal_2011__01__10__snapshot_1"));/*]]>*/</script>
<p>and finally, a little christmas tree:</p>
<div class="lazygal" id="lazygal-gallery-lazygal_2011__01__10__snapshot_2"><noscript><div class="lazygal-image-container" style="width: 49.45045045045045%; margin: 0.5%; width: calc(50.45045045045045% - 2px); margin: calc(1px + 0px); max-width: 446px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/xmas.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 150.45045045045043%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/xmas-bw-444x668.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div></noscript></div><script type="text/javascript">/*<![CDATA[*/lazygal.register_gallery([['/photos/2011/01/xmas.jpeg',681,1024,50,'',['/photos/2011/01/xmas-bw-444x668.jpeg','/photos/2011/01/xmas-col-444x668.jpeg'],444,668]],[[0]],document.getElementById("lazygal-gallery-lazygal_2011__01__10__snapshot_2"));/*]]>*/</script>project 52-2011/01: snapshot.https://spielwiese.fontein.de/2011/01/10/project-52-201101-snapshot/2011-01-10T18:56:46+01:002011-01-10T18:56:46+01:00felix<p>i finally got around to do my first <a href="https://spielwiese.fontein.de/2011/01/06/project-52/">project 52</a> shot for the first week (i.e. last week). the topic was</p>
<p class="centerbox"><a href="http://www.mondgras.de/sari02/index.php/2011/01/03/p52-11-01-wochenthema/">schnappschuss</a>.</p>
<p>while walking around the house, i happened to watch out of my window and had this fantastic view, which ended up as a snapshot. please click the photo to get a larger version:</p>
<div class="lazygal" id="lazygal-gallery-lazygal_2011__projekt52_1"><noscript><div class="lazygal-image-container" style="width: 99.0%; margin: 0.5%; width: calc(100.0% - 2px); margin: calc(1px + 0px); max-width: 890px;"><div class="lazygal-image-outercont"><a href="https://spielwiese.fontein.de/photos/2011/01/p52-01.jpeg" style="width: 100%;"><span class="lazygal-image-outer" style="width: 100%;"><span class="lazygal-ka" style="padding-top: 66.44144144144144%;"></span><img src="https://spielwiese.fontein.de/photos/2011/01/p52-01-col-888x590.jpeg" class="lazygal-image-scale" alt=""></span></a></div></div></noscript></div><script type="text/javascript">/*<![CDATA[*/lazygal.register_gallery([['/photos/2011/01/p52-01.jpeg',2048,1363,100,'',['/photos/2011/01/p52-01-col-888x590.jpeg','/photos/2011/01/p52-01-col-888x590.jpeg'],888,590]],[[0]],document.getElementById("lazygal-gallery-lazygal_2011__projekt52_1"));/*]]>*/</script>
<p class="techdetails">technical details: 1/6400s, f/1.4, 50mm, iso 200.</p>