<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex Sleat &#187; udev</title>
	<atom:link href="https://alexsleat.co.uk/tag/udev/feed/" rel="self" type="application/rss+xml" />
	<link>https://alexsleat.co.uk</link>
	<description>/home/alex</description>
	<lastBuildDate>Tue, 19 Jun 2012 19:25:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Auto Sync Kindle in Ubuntu</title>
		<link>https://alexsleat.co.uk/2011/01/17/auto-sync-kindle-in-ubuntu/</link>
		<comments>https://alexsleat.co.uk/2011/01/17/auto-sync-kindle-in-ubuntu/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 12:23:21 +0000</pubDate>
		<dc:creator>Alex</dc:creator>
				<category><![CDATA[blog1]]></category>
		<category><![CDATA[Kindle]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[10.04]]></category>
		<category><![CDATA[10.10]]></category>
		<category><![CDATA[9.04]]></category>
		<category><![CDATA[9.10]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[diy kindle stand]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[guide]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[isadora]]></category>
		<category><![CDATA[julia]]></category>
		<category><![CDATA[karmic]]></category>
		<category><![CDATA[katya]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[kindle 3]]></category>
		<category><![CDATA[kindle 3 stand]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[linux mint]]></category>
		<category><![CDATA[lisa]]></category>
		<category><![CDATA[lucid]]></category>
		<category><![CDATA[maverick]]></category>
		<category><![CDATA[reader]]></category>
		<category><![CDATA[rsync]]></category>
		<category><![CDATA[rules.d]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[udev]]></category>

		<guid isPermaLink="false">https://alexsleat.co.uk/?p=11625</guid>
		<description><![CDATA[<br/><p></p> <p>For Christmas I got a Kindle 3 and it was instantly filled with Free eBooks (http://www.gutenberg.org/wiki/Main_Page) and research papers (PDFs). I found myself wanting to be able to automatically synchronize it with a folder on my desktop when it was plugged in and found no one else had posted online how to do [...]]]></description>
			<content:encoded><![CDATA[<br/><p><a href="https://alexsleat.co.uk/wp-content/uploads/2011/01/2010-12-27-14.11.38.jpg"><img class="size-large wp-image-11639 alignleft" title="DIY Kindle Stand" src="https://alexsleat.co.uk/wp-content/uploads/2011/01/2010-12-27-14.11.38-1024x614.jpg" alt="" width="368" height="221" /></a></p>
<p>For Christmas I got a Kindle 3 and it was instantly filled with Free eBooks (http://www.gutenberg.org/wiki/Main_Page) and research papers (PDFs). I found myself wanting to be able to automatically synchronize it with a folder on my desktop when it was plugged in and found no one else had posted online how to do this, so I began researching into udev and rsync to get something working.</p>
<p><strong>Setting up udev rules to run a script when the Kindle is plugged in.</strong></p>
<p>Firstly, we need to find some parameters of the Kindle which are unique to it so that udev can identify that it is the Kindle being plugged in and not another USB mass storage device. We&#8217;ll need to find out where the device is mounted in /dev/ which can be a little tricky because this folder is pretty full.</p>
<p>An easier way to do this is to first, without the Kindle plugged in do the following command (list the directory and pipe the output to a file called dev1 in the home dir):</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">ls</span> /dev/ &gt; ~/dev1</div>
<p>Now plug the Kindle in and redo the command, changing the destination output:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">ls</span> /dev/ &gt; ~/dev2</div>
<p>The difference between the two files will show what has changed in the /dev/ directory:</p>
<div class="dean_ch" style="white-space: wrap;"> sdiff ~/dev1 ~/dev2</div>
<p>The output for mine (<em>show in the image below</em>) shows that 3 things changed when I plugged in the Kindle, sdb, sdb1 and sg2 directorys were added (shown by the &gt; sign to the left). The folder I am looking for is the sdb1, this is where the mass storage device is found.<br />
<a href="https://alexsleat.co.uk/wp-content/uploads/2011/01/Screenshot-alex@icarus-Desktop-.png"><img class="aligncenter size-full wp-image-11630" title="sdiff /dev/" src="https://alexsleat.co.uk/wp-content/uploads/2011/01/Screenshot-alex@icarus-Desktop-.png" alt="" width="953" height="488" /></a></p>
<p>Write down where it&#8217;s found in /dev/ and then you can clean up those two files you previously made:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">rm</span> ~/dev1 | <span class="kw2">rm</span> ~/dev2</div>
<p>The next thing we want to do is use udevadm to collect some useful information about the device which we can do by the following command (I have chosen to pipe the output to a file called kindle in the home dir, because the output was pretty big. If you don&#8217;t want to remove the &gt; ~/kindle from the end of the command):</p>
<div class="dean_ch" style="white-space: wrap;">udevadm info -a -p $<span class="br0">&#40;</span>udevadm info -q path -n /dev/sdb1<span class="br0">&#41;</span> &gt; ~/kindle</div>
<p><strong>WARNING:</strong> This can look pretty daunting but, (in the words of Douglas Adams) <strong>Don&#8217;t Panic.</strong></p>
<div style="overflow: auto; height: 350px; border: 1px solid black;">
<div class="dean_ch" style="white-space: wrap;"> &nbsp;looking at device <span class="st0">&#8216;/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/host21/target21:0:0/21:0:0:0/block/sdb/sdb1&#8242;</span>:<br />
&nbsp; &nbsp; <span class="re2">KERNEL=</span>=<span class="st0">&quot;sdb1&quot;</span><br />
&nbsp; &nbsp; <span class="re2">SUBSYSTEM=</span>=<span class="st0">&quot;block&quot;</span><br />
&nbsp; &nbsp; <span class="re2">DRIVER=</span>=<span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span>partition<span class="br0">&#125;</span>==<span class="st0">&quot;1&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span>start<span class="br0">&#125;</span>==<span class="st0">&quot;16&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span><span class="kw2">size</span><span class="br0">&#125;</span>==<span class="st0">&quot;6410672&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span>alignment_offset<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span>discard_alignment<span class="br0">&#125;</span>==<span class="st0">&quot;4294959104&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span><span class="kw2">stat</span><span class="br0">&#125;</span>==<span class="st0">&quot; &nbsp; &nbsp; 151 &nbsp; &nbsp; 3389 &nbsp; &nbsp; 4239 &nbsp; &nbsp; 3776 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; 2424 &nbsp; &nbsp; 3776&quot;</span><br />
&nbsp; &nbsp; ATTR<span class="br0">&#123;</span>inflight<span class="br0">&#125;</span>==<span class="st0">&quot; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp; &nbsp; &nbsp;0&quot;</span></p>
<p>&nbsp; looking at parent device <span class="st0">&#8216;/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/host21/target21:0:0/21:0:0:0/block/sdb&#8217;</span>:<br />
&nbsp; &nbsp; <span class="re2">KERNELS=</span>=<span class="st0">&quot;sdb&quot;</span><br />
&nbsp; &nbsp; <span class="re2">SUBSYSTEMS=</span>=<span class="st0">&quot;block&quot;</span><br />
&nbsp; &nbsp; <span class="re2">DRIVERS=</span>=<span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>range<span class="br0">&#125;</span>==<span class="st0">&quot;16&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>ext_range<span class="br0">&#125;</span>==<span class="st0">&quot;256&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>removable<span class="br0">&#125;</span>==<span class="st0">&quot;1&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>ro<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span><span class="kw2">size</span><span class="br0">&#125;</span>==<span class="st0">&quot;6410688&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>alignment_offset<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>discard_alignment<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>capability<span class="br0">&#125;</span>==<span class="st0">&quot;51&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span><span class="kw2">stat</span><span class="br0">&#125;</span>==<span class="st0">&quot; &nbsp; &nbsp; 156 &nbsp; &nbsp; 3389 &nbsp; &nbsp; 4279 &nbsp; &nbsp; 3808 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; &nbsp; &nbsp;0 &nbsp; &nbsp; 2456 &nbsp; &nbsp; 3808&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>inflight<span class="br0">&#125;</span>==<span class="st0">&quot; &nbsp; &nbsp; &nbsp; 0 &nbsp; &nbsp; &nbsp; &nbsp;0&quot;</span></p>
<p>&nbsp; looking at parent device <span class="st0">&#8216;/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/host21/target21:0:0/21:0:0:0&#8242;</span>:<br />
&nbsp; &nbsp; <span class="re2">KERNELS=</span>=<span class="st0">&quot;21:0:0:0&quot;</span><br />
&nbsp; &nbsp; <span class="re2">SUBSYSTEMS=</span>=<span class="st0">&quot;scsi&quot;</span><br />
&nbsp; &nbsp; <span class="re2">DRIVERS=</span>=<span class="st0">&quot;sd&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>device_blocked<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span><span class="kw3">type</span><span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>scsi_level<span class="br0">&#125;</span>==<span class="st0">&quot;3&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>vendor<span class="br0">&#125;</span>==<span class="st0">&quot;Kindle &nbsp;&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>model<span class="br0">&#125;</span>==<span class="st0">&quot;Internal Storage&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span><span class="kw2">rev</span><span class="br0">&#125;</span>==<span class="st0">&quot;0100&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>state<span class="br0">&#125;</span>==<span class="st0">&quot;running&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>timeout<span class="br0">&#125;</span>==<span class="st0">&quot;30&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>iocounterbits<span class="br0">&#125;</span>==<span class="st0">&quot;32&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>iorequest_cnt<span class="br0">&#125;</span>==<span class="st0">&quot;0xe1&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>iodone_cnt<span class="br0">&#125;</span>==<span class="st0">&quot;0xe1&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>ioerr_cnt<span class="br0">&#125;</span>==<span class="st0">&quot;0&#215;1&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>modalias<span class="br0">&#125;</span>==<span class="st0">&quot;scsi:t-0&#215;00&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>evt_media_change<span class="br0">&#125;</span>==<span class="st0">&quot;0&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>dh_state<span class="br0">&#125;</span>==<span class="st0">&quot;detached&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>queue_depth<span class="br0">&#125;</span>==<span class="st0">&quot;1&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>queue_type<span class="br0">&#125;</span>==<span class="st0">&quot;none&quot;</span><br />
&nbsp; &nbsp; ATTRS<span class="br0">&#123;</span>max_sectors<span class="br0">&#125;</span>==<span class="st0">&quot;240&quot;</span></div>
</div>
<p>While this many look daunting, what you want to do if find some attributes from the output which mean only your Kindle will be found when looking for them all, the problem I have found is that, with udev rules you cannot go too far down in the parent tree which stops me being able to use the Kindles serial to identify it. This could mean that my computer will sync any Kindle that&#8217;s plugged into it but I don&#8217;t have 2 to check. The following are the attributes I chose:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="re2">KERNEL=</span>=<span class="st0">&quot;sd?&quot;</span>, ATTRS<span class="br0">&#123;</span>vendor<span class="br0">&#125;</span>==<span class="st0">&quot;Kindle &nbsp;&quot;</span>, ATTRS<span class="br0">&#123;</span>modalias<span class="br0">&#125;</span>==<span class="st0">&quot;scsi:t-0&#215;00&quot;</span></div>
<p>Now you&#8217;ll want to write the udev rule in /etc/udev/rules.d/</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw3">cd</span> /etc/udev/rules.d/</div>
<p>According to the readme the numbers represent the priority of the rule (higher overriding lower) followed by a descriptive name and it must end in .rules eg (xx-description.rules).</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">sudo</span> gedit <span class="nu0">81</span>-kindle-<span class="kw2">sync</span>.rules</div>
<p>The following is the whole line I used for the udev rule, the only addition to the above is the RUN+=&#8221;/home/alex/.scripts/kindlesync.sh&#8221; which will run the script in that directory, this script contains the rsync command.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="re2">KERNEL=</span>=<span class="st0">&quot;sd?&quot;</span>, ATTRS<span class="br0">&#123;</span>vendor<span class="br0">&#125;</span>==<span class="st0">&quot;Kindle &nbsp;&quot;</span>, ATTRS<span class="br0">&#123;</span>modalias<span class="br0">&#125;</span>==<span class="st0">&quot;scsi:t-0&#215;00&quot;</span>, RUN+=<span class="st0">&quot;/home/alex/.scripts/./kindlesync.sh&quot;</span></div>
<p>Save and close the file and then restart the udev service:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">sudo</span> service udev restart</div>
<p><strong>Writing a script to sync a folder on the Desktop with a folder on the Kindle using rsync:</strong><br />
Change the first directory from &#8220;/home/alex/ebooks/kindle_sync&#8221; to the directory on your computer where you want to keep the files that will be synced onto your Kindle and the second from &#8220;/media/Kindle/documents/sync/&#8221; to the location on your mounted Kindle where you want the files to be stored, save this file as kindlesync.sh. This is the script you call from the udev rules so for mine it&#8217;s saved as &#8220;/home/alex/.scripts/kindlesync.sh&#8221;.</p>
<div class="dean_ch" style="white-space: wrap;"><span class="re3">#!/bin/bash</span></p>
<p><span class="re3">#Sync</span><br />
rsync -av /home/alex/eBooks/kindle_sync/ /media/Kindle/documents/<span class="kw2">sync</span>/</div>
<p>Go to the location of the script and make it executable with the following command:</p>
<div class="dean_ch" style="white-space: wrap;"><span class="kw2">chmod</span> +x kindlesync.<span class="kw2">sh</span></div>
<p>Now try plugging in your Kindle and make sure it syncs up!</p>
<p><strong>Problems</strong></p>
<p>In the udev rule, ACTION==&#8221;add&#8221; can be used to specify when the Kindle is first plugged in, however when trying to use this Ubuntu&#8217;s auto-mounting service mounts the drive after the script is ran so the sync becomes useless. Without this it runs the script 3 times, twice before it has mounted and then once it has mounted &#8211; this is currently the best I have found but it&#8217;s extremely messy.</p>
]]></content:encoded>
			<wfw:commentRss>https://alexsleat.co.uk/2011/01/17/auto-sync-kindle-in-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
