]> pere.pagekite.me Git - homepage.git/blob - blog/tags/isenkram/index.html
fac73bcb51a77bbaf272aea6ede504ecb8e9784a
[homepage.git] / blog / tags / isenkram / index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
4 <head>
5 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
6 <title>Petter Reinholdtsen: Entries Tagged isenkram</title>
7 <link rel="stylesheet" type="text/css" media="screen" href="http://people.skolelinux.org/pere/blog/style.css" />
8 <link rel="stylesheet" type="text/css" media="screen" href="http://people.skolelinux.org/pere/blog/vim.css" />
9 <link rel="alternate" title="RSS Feed" href="isenkram.rss" type="application/rss+xml" />
10 </head>
11 <body>
12 <div class="title">
13 <h1>
14 <a href="http://people.skolelinux.org/pere/blog/">Petter Reinholdtsen</a>
15
16 </h1>
17
18 </div>
19
20
21 <h3>Entries tagged "isenkram".</h3>
22
23 <div class="entry">
24 <div class="title">
25 <a href="http://people.skolelinux.org/pere/blog/Appstream_just_learned_how_to_map_hardware_to_packages_too_.html">Appstream just learned how to map hardware to packages too!</a>
26 </div>
27 <div class="date">
28 23rd December 2016
29 </div>
30 <div class="body">
31 <p>I received a very nice Christmas present today. As my regular
32 readers probably know, I have been working on the
33 <a href="http://packages.qa.debian.org/isenkram">the Isenkram
34 system</a> for many years. The goal of the Isenkram system is to make
35 it easier for users to figure out what to install to get a given piece
36 of hardware to work in Debian, and a key part of this system is a way
37 to map hardware to packages. Isenkram have its own mapping database,
38 and also uses data provided by each package using the AppStream
39 metadata format. And today,
40 <a href="https://tracker.debian.org/pkg/appstream">AppStream</a> in
41 Debian learned to look up hardware the same way Isenkram is doing it,
42 ie using fnmatch():</p>
43
44 <p><pre>
45 % appstreamcli what-provides modalias \
46 usb:v1130p0202d0100dc00dsc00dp00ic03isc00ip00in00
47 Identifier: pymissile [generic]
48 Name: pymissile
49 Summary: Control original Striker USB Missile Launcher
50 Package: pymissile
51 % appstreamcli what-provides modalias usb:v0694p0002d0000
52 Identifier: libnxt [generic]
53 Name: libnxt
54 Summary: utility library for talking to the LEGO Mindstorms NXT brick
55 Package: libnxt
56 ---
57 Identifier: t2n [generic]
58 Name: t2n
59 Summary: Simple command-line tool for Lego NXT
60 Package: t2n
61 ---
62 Identifier: python-nxt [generic]
63 Name: python-nxt
64 Summary: Python driver/interface/wrapper for the Lego Mindstorms NXT robot
65 Package: python-nxt
66 ---
67 Identifier: nbc [generic]
68 Name: nbc
69 Summary: C compiler for LEGO Mindstorms NXT bricks
70 Package: nbc
71 %
72 </pre></p>
73
74 <p>A similar query can be done using the combined AppStream and
75 Isenkram databases using the isenkram-lookup tool:</p>
76
77 <p><pre>
78 % isenkram-lookup usb:v1130p0202d0100dc00dsc00dp00ic03isc00ip00in00
79 pymissile
80 % isenkram-lookup usb:v0694p0002d0000
81 libnxt
82 nbc
83 python-nxt
84 t2n
85 %
86 </pre></p>
87
88 <p>You can find modalias values relevant for your machine using
89 <tt>cat $(find /sys/devices/ -name modalias)</tt>.
90
91 <p>If you want to make this system a success and help Debian users
92 make the most of the hardware they have, please
93 help<a href="https://wiki.debian.org/AppStream/Guidelines">add
94 AppStream metadata for your package following the guidelines</a>
95 documented in the wiki. So far only 11 packages provide such
96 information, among the several hundred hardware specific packages in
97 Debian. The Isenkram database on the other hand contain 101 packages,
98 mostly related to USB dongles. Most of the packages with hardware
99 mapping in AppStream are LEGO Mindstorms related, because I have, as
100 part of my involvement in
101 <a href="https://wiki.debian.org/LegoDesigners">the Debian LEGO
102 team</a> given priority to making sure LEGO users get proposed the
103 complete set of packages in Debian for that particular hardware. The
104 team also got a nice Christmas present today. The
105 <a href="https://tracker.debian.org/pkg/nxt-firmware">nxt-firmware
106 package</a> made it into Debian. With this package in place, it is
107 now possible to use the LEGO Mindstorms NXT unit with only free
108 software, as the nxt-firmware package contain the source and firmware
109 binaries for the NXT brick.</p>
110
111 <p>As usual, if you use Bitcoin and want to show your support of my
112 activities, please send Bitcoin donations to my address
113 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&label=PetterReinholdtsenBlog">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
114
115 </div>
116 <div class="tags">
117
118
119 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
120
121
122 </div>
123 </div>
124 <div class="padding"></div>
125
126 <div class="entry">
127 <div class="title">
128 <a href="http://people.skolelinux.org/pere/blog/Isenkram_updated_with_a_lot_more_hardware_package_mappings.html">Isenkram updated with a lot more hardware-package mappings</a>
129 </div>
130 <div class="date">
131 20th December 2016
132 </div>
133 <div class="body">
134 <p><a href="http://packages.qa.debian.org/isenkram">The Isenkram
135 system</a> I wrote two years ago to make it easier in Debian to find
136 and install packages to get your hardware dongles to work, is still
137 going strong. It is a system to look up the hardware present on or
138 connected to the current system, and map the hardware to Debian
139 packages. It can either be done using the tools in isenkram-cli or
140 using the user space daemon in the isenkram package. The latter will
141 notify you, when inserting new hardware, about what packages to
142 install to get the dongle working. It will even provide a button to
143 click on to ask packagekit to install the packages.</p>
144
145 <p>Here is an command line example from my Thinkpad laptop:</p>
146
147 <p><pre>
148 % isenkram-lookup
149 bluez
150 cheese
151 ethtool
152 fprintd
153 fprintd-demo
154 gkrellm-thinkbat
155 hdapsd
156 libpam-fprintd
157 pidgin-blinklight
158 thinkfan
159 tlp
160 tp-smapi-dkms
161 tp-smapi-source
162 tpb
163 %
164 </pre></p>
165
166 <p>It can also list the firware package providing firmware requested
167 by the load kernel modules, which in my case is an empty list because
168 I have all the firmware my machine need:
169
170 <p><pre>
171 % /usr/sbin/isenkram-autoinstall-firmware -l
172 info: did not find any firmware files requested by loaded kernel modules. exiting
173 %
174 </pre></p>
175
176 <p>The last few days I had a look at several of the around 250
177 packages in Debian with udev rules. These seem like good candidates
178 to install when a given hardware dongle is inserted, and I found
179 several that should be proposed by isenkram. I have not had time to
180 check all of them, but am happy to report that now there are 97
181 packages packages mapped to hardware by Isenkram. 11 of these
182 packages provide hardware mapping using AppStream, while the rest are
183 listed in the modaliases file provided in isenkram.</p>
184
185 <p>These are the packages with hardware mappings at the moment. The
186 <strong>marked packages</strong> are also announcing their hardware
187 support using AppStream, for everyone to use:</p>
188
189 <p>air-quality-sensor, alsa-firmware-loaders, argyll,
190 <strong>array-info</strong>, avarice, avrdude, b43-fwcutter,
191 bit-babbler, bluez, bluez-firmware, <strong>brltty</strong>,
192 <strong>broadcom-sta-dkms</strong>, calibre, cgminer, cheese, colord,
193 <strong>colorhug-client</strong>, dahdi-firmware-nonfree, dahdi-linux,
194 dfu-util, dolphin-emu, ekeyd, ethtool, firmware-ipw2x00, fprintd,
195 fprintd-demo, <strong>galileo</strong>, gkrellm-thinkbat, gphoto2,
196 gpsbabel, gpsbabel-gui, gpsman, gpstrans, gqrx-sdr, gr-fcdproplus,
197 gr-osmosdr, gtkpod, hackrf, hdapsd, hdmi2usb-udev, hpijs-ppds, hplip,
198 ipw3945-source, ipw3945d, kde-config-tablet, kinect-audio-setup,
199 <strong>libnxt</strong>, libpam-fprintd, <strong>lomoco</strong>,
200 madwimax, minidisc-utils, mkgmap, msi-keyboard, mtkbabel,
201 <strong>nbc</strong>, <strong>nqc</strong>, nut-hal-drivers, ola,
202 open-vm-toolbox, open-vm-tools, openambit, pcgminer, pcmciautils,
203 pcscd, pidgin-blinklight, printer-driver-splix,
204 <strong>pymissile</strong>, python-nxt, qlandkartegt,
205 qlandkartegt-garmin, rosegarden, rt2x00-source, sispmctl,
206 soapysdr-module-hackrf, solaar, squeak-plugins-scratch, sunxi-tools,
207 <strong>t2n</strong>, thinkfan, thinkfinger-tools, tlp, tp-smapi-dkms,
208 tp-smapi-source, tpb, tucnak, uhd-host, usbmuxd, viking,
209 virtualbox-ose-guest-x11, w1retap, xawtv, xserver-xorg-input-vmmouse,
210 xserver-xorg-input-wacom, xserver-xorg-video-qxl,
211 xserver-xorg-video-vmware, yubikey-personalization and
212 zd1211-firmware</p>
213
214 <p>If you know of other packages, please let me know with a wishlist
215 bug report against the isenkram-cli package, and ask the package
216 maintainer to
217 <a href="https://wiki.debian.org/AppStream/Guidelines">add AppStream
218 metadata according to the guidelines</a> to provide the information
219 for everyone. In time, I hope to get rid of the isenkram specific
220 hardware mapping and depend exclusively on AppStream.</p>
221
222 <p>Note, the AppStream metadata for broadcom-sta-dkms is matching too
223 much hardware, and suggest that the package with with any ethernet
224 card. See <a href="http://bugs.debian.org/838735">bug #838735</a> for
225 the details. I hope the maintainer find time to address it soon. In
226 the mean time I provide an override in isenkram.</p>
227
228 </div>
229 <div class="tags">
230
231
232 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
233
234
235 </div>
236 </div>
237 <div class="padding"></div>
238
239 <div class="entry">
240 <div class="title">
241 <a href="http://people.skolelinux.org/pere/blog/Isenkram__Appstream_and_udev_make_life_as_a_LEGO_builder_easier.html">Isenkram, Appstream and udev make life as a LEGO builder easier</a>
242 </div>
243 <div class="date">
244 7th October 2016
245 </div>
246 <div class="body">
247 <p><a href="http://packages.qa.debian.org/isenkram">The Isenkram
248 system</a> provide a practical and easy way to figure out which
249 packages support the hardware in a given machine. The command line
250 tool <tt>isenkram-lookup</tt> and the tasksel options provide a
251 convenient way to list and install packages relevant for the current
252 hardware during system installation, both user space packages and
253 firmware packages. The GUI background daemon on the other hand provide
254 a pop-up proposing to install packages when a new dongle is inserted
255 while using the computer. For example, if you plug in a smart card
256 reader, the system will ask if you want to install <tt>pcscd</tt> if
257 that package isn't already installed, and if you plug in a USB video
258 camera the system will ask if you want to install <tt>cheese</tt> if
259 cheese is currently missing. This already work just fine.</p>
260
261 <p>But Isenkram depend on a database mapping from hardware IDs to
262 package names. When I started no such database existed in Debian, so
263 I made my own data set and included it with the isenkram package and
264 made isenkram fetch the latest version of this database from git using
265 http. This way the isenkram users would get updated package proposals
266 as soon as I learned more about hardware related packages.</p>
267
268 <p>The hardware is identified using modalias strings. The modalias
269 design is from the Linux kernel where most hardware descriptors are
270 made available as a strings that can be matched using filename style
271 globbing. It handle USB, PCI, DMI and a lot of other hardware related
272 identifiers.</p>
273
274 <p>The downside to the Isenkram specific database is that there is no
275 information about relevant distribution / Debian version, making
276 isenkram propose obsolete packages too. But along came AppStream, a
277 cross distribution mechanism to store and collect metadata about
278 software packages. When I heard about the proposal, I contacted the
279 people involved and suggested to add a hardware matching rule using
280 modalias strings in the specification, to be able to use AppStream for
281 mapping hardware to packages. This idea was accepted and AppStream is
282 now a great way for a package to announce the hardware it support in a
283 distribution neutral way. I wrote
284 <a href="http://people.skolelinux.org/pere/blog/Using_appstream_with_isenkram_to_install_hardware_related_packages_in_Debian.html">a
285 recipe on how to add such meta-information</a> in a blog post last
286 December. If you have a hardware related package in Debian, please
287 announce the relevant hardware IDs using AppStream.</p>
288
289 <p>In Debian, almost all packages that can talk to a LEGO Mindestorms
290 RCX or NXT unit, announce this support using AppStream. The effect is
291 that when you insert such LEGO robot controller into your Debian
292 machine, Isenkram will propose to install the packages needed to get
293 it working. The intention is that this should allow the local user to
294 start programming his robot controller right away without having to
295 guess what packages to use or which permissions to fix.</p>
296
297 <p>But when I sat down with my son the other day to program our NXT
298 unit using his Debian Stretch computer, I discovered something
299 annoying. The local console user (ie my son) did not get access to
300 the USB device for programming the unit. This used to work, but no
301 longer in Jessie and Stretch. After some investigation and asking
302 around on #debian-devel, I discovered that this was because udev had
303 changed the mechanism used to grant access to local devices. The
304 ConsoleKit mechanism from <tt>/lib/udev/rules.d/70-udev-acl.rules</tt>
305 no longer applied, because LDAP users no longer was added to the
306 plugdev group during login. Michael Biebl told me that this method
307 was obsolete and the new method used ACLs instead. This was good
308 news, as the plugdev mechanism is a mess when using a remote user
309 directory like LDAP. Using ACLs would make sure a user lost device
310 access when she logged out, even if the user left behind a background
311 process which would retain the plugdev membership with the ConsoleKit
312 setup. Armed with this knowledge I moved on to fix the access problem
313 for the LEGO Mindstorms related packages.</p>
314
315 <p>The new system uses a udev tag, 'uaccess'. It can either be
316 applied directly for a device, or is applied in
317 /lib/udev/rules.d/70-uaccess.rules for classes of devices. As the
318 LEGO Mindstorms udev rules did not have a class, I decided to add the
319 tag directly in the udev rules files included in the packages. Here
320 is one example. For the nqc C compiler for the RCX, the
321 <tt>/lib/udev/rules.d/60-nqc.rules</tt> file now look like this:
322
323 <p><pre>
324 SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0694", ATTR{idProduct}=="0001", \
325 SYMLINK+="rcx-%k", TAG+="uaccess"
326 </pre></p>
327
328 <p>The key part is the 'TAG+="uaccess"' at the end. I suspect all
329 packages using plugdev in their /lib/udev/rules.d/ files should be
330 changed to use this tag (either directly or indirectly via
331 <tt>70-uaccess.rules</tt>). Perhaps a lintian check should be created
332 to detect this?</p>
333
334 <p>I've been unable to find good documentation on the uaccess feature.
335 It is unclear to me if the uaccess tag is an internal implementation
336 detail like the udev-acl tag used by
337 <tt>/lib/udev/rules.d/70-udev-acl.rules</tt>. If it is, I guess the
338 indirect method is the preferred way. Michael
339 <a href="https://github.com/systemd/systemd/issues/4288">asked for more
340 documentation from the systemd project</a> and I hope it will make
341 this clearer. For now I use the generic classes when they exist and
342 is already handled by <tt>70-uaccess.rules</tt>, and add the tag
343 directly if no such class exist.</p>
344
345 <p>To learn more about the isenkram system, please check out
346 <a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">my
347 blog posts tagged isenkram</a>.</p>
348
349 <p>To help out making life for LEGO constructors in Debian easier,
350 please join us on our IRC channel
351 <a href="irc://irc.debian.org/%23debian-lego">#debian-lego</a> and join
352 the <a href="https://alioth.debian.org/projects/debian-lego/">Debian
353 LEGO team</a> in the Alioth project we created yesterday. A mailing
354 list is not yet created, but we are working on it. :)</p>
355
356 <p>As usual, if you use Bitcoin and want to show your support of my
357 activities, please send Bitcoin donations to my address
358 <b><a href="bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b&label=PetterReinholdtsenBlog">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b</a></b>.</p>
359
360 </div>
361 <div class="tags">
362
363
364 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
365
366
367 </div>
368 </div>
369 <div class="padding"></div>
370
371 <div class="entry">
372 <div class="title">
373 <a href="http://people.skolelinux.org/pere/blog/Isenkram_with_PackageKit_support___new_version_0_23_available_in_Debian_unstable.html">Isenkram with PackageKit support - new version 0.23 available in Debian unstable</a>
374 </div>
375 <div class="date">
376 25th May 2016
377 </div>
378 <div class="body">
379 <p><a href="https://tracker.debian.org/pkg/isenkram">The isenkram
380 system</a> is a user-focused solution in Debian for handling hardware
381 related packages. The idea is to have a database of mappings between
382 hardware and packages, and pop up a dialog suggesting for the user to
383 install the packages to use a given hardware dongle. Some use cases
384 are when you insert a Yubikey, it proposes to install the software
385 needed to control it; when you insert a braille reader list it
386 proposes to install the packages needed to send text to the reader;
387 and when you insert a ColorHug screen calibrator it suggests to
388 install the driver for it. The system work well, and even have a few
389 command line tools to install firmware packages and packages for the
390 hardware already in the machine (as opposed to hotpluggable hardware).</p>
391
392 <p>The system was initially written using aptdaemon, because I found
393 good documentation and example code on how to use it. But aptdaemon
394 is going away and is generally being replaced by
395 <a href="http://www.freedesktop.org/software/PackageKit/">PackageKit</a>,
396 so Isenkram needed a rewrite. And today, thanks to the great patch
397 from my college Sunil Mohan Adapa in the FreedomBox project, the
398 rewrite finally took place. I've just uploaded a new version of
399 Isenkram into Debian Unstable with the patch included, and the default
400 for the background daemon is now to use PackageKit. To check it out,
401 install the <tt>isenkram</tt> package and insert some hardware dongle
402 and see if it is recognised.</p>
403
404 <p>If you want to know what kind of packages isenkram would propose for
405 the machine it is running on, you can check out the isenkram-lookup
406 program. This is what it look like on a Thinkpad X230:</p>
407
408 <p><blockquote><pre>
409 % isenkram-lookup
410 bluez
411 cheese
412 fprintd
413 fprintd-demo
414 gkrellm-thinkbat
415 hdapsd
416 libpam-fprintd
417 pidgin-blinklight
418 thinkfan
419 tleds
420 tp-smapi-dkms
421 tp-smapi-source
422 tpb
423 %p
424 </pre></blockquote></p>
425
426 <p>The hardware mappings come from several places. The preferred way
427 is for packages to announce their hardware support using
428 <a href="https://www.freedesktop.org/software/appstream/docs/">the
429 cross distribution appstream system</a>.
430 See
431 <a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">previous
432 blog posts about isenkram</a> to learn how to do that.</p>
433
434 </div>
435 <div class="tags">
436
437
438 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
439
440
441 </div>
442 </div>
443 <div class="padding"></div>
444
445 <div class="entry">
446 <div class="title">
447 <a href="http://people.skolelinux.org/pere/blog/Using_appstream_with_isenkram_to_install_hardware_related_packages_in_Debian.html">Using appstream with isenkram to install hardware related packages in Debian</a>
448 </div>
449 <div class="date">
450 20th December 2015
451 </div>
452 <div class="body">
453 <p>Around three years ago, I created
454 <a href="http://packages.qa.debian.org/isenkram">the isenkram
455 system</a> to get a more practical solution in Debian for handing
456 hardware related packages. A GUI system in the isenkram package will
457 present a pop-up dialog when some hardware dongle supported by
458 relevant packages in Debian is inserted into the machine. The same
459 lookup mechanism to detect packages is available as command line
460 tools in the isenkram-cli package. In addition to mapping hardware,
461 it will also map kernel firmware files to packages and make it easy to
462 install needed firmware packages automatically. The key for this
463 system to work is a good way to map hardware to packages, in other
464 words, allow packages to announce what hardware they will work
465 with.</p>
466
467 <p>I started by providing data files in the isenkram source, and
468 adding code to download the latest version of these data files at run
469 time, to ensure every user had the most up to date mapping available.
470 I also added support for storing the mapping in the Packages file in
471 the apt repositories, but did not push this approach because while I
472 was trying to figure out how to best store hardware/package mappings,
473 <a href="http://www.freedesktop.org/software/appstream/docs/">the
474 appstream system</a> was announced. I got in touch and suggested to
475 add the hardware mapping into that data set to be able to use
476 appstream as a data source, and this was accepted at least for the
477 Debian version of appstream.</p>
478
479 <p>A few days ago using appstream in Debian for this became possible,
480 and today I uploaded a new version 0.20 of isenkram adding support for
481 appstream as a data source for mapping hardware to packages. The only
482 package so far using appstream to announce its hardware support is my
483 pymissile package. I got help from Matthias Klumpp with figuring out
484 how do add the required
485 <a href="https://appstream.debian.org/html/sid/main/metainfo/pymissile.html">metadata
486 in pymissile</a>. I added a file debian/pymissile.metainfo.xml with
487 this content:</p>
488
489 <blockquote><pre>
490 &lt;?xml version="1.0" encoding="UTF-8"?&gt;
491 &lt;component&gt;
492 &lt;id&gt;pymissile&lt;/id&gt;
493 &lt;metadata_license&gt;MIT&lt;/metadata_license&gt;
494 &lt;name&gt;pymissile&lt;/name&gt;
495 &lt;summary&gt;Control original Striker USB Missile Launcher&lt;/summary&gt;
496 &lt;description&gt;
497 &lt;p&gt;
498 Pymissile provides a curses interface to control an original
499 Marks and Spencer / Striker USB Missile Launcher, as well as a
500 motion control script to allow a webcamera to control the
501 launcher.
502 &lt;/p&gt;
503 &lt;/description&gt;
504 &lt;provides&gt;
505 &lt;modalias&gt;usb:v1130p0202d*&lt;/modalias&gt;
506 &lt;/provides&gt;
507 &lt;/component&gt;
508 </pre></blockquote>
509
510 <p>The key for isenkram is the component/provides/modalias value,
511 which is a glob style match rule for hardware specific strings
512 (modalias strings) provided by the Linux kernel. In this case, it
513 will map to all USB devices with vendor code 1130 and product code
514 0202.</p>
515
516 <p>Note, it is important that the license of all the metadata files
517 are compatible to have permissions to aggregate them into archive wide
518 appstream files. Matthias suggested to use MIT or BSD licenses for
519 these files. A challenge is figuring out a good id for the data, as
520 it is supposed to be globally unique and shared across distributions
521 (in other words, best to coordinate with upstream what to use). But
522 it can be changed later or, so we went with the package name as
523 upstream for this project is dormant.</p>
524
525 <p>To get the metadata file installed in the correct location for the
526 mirror update scripts to pick it up and include its content the
527 appstream data source, the file must be installed in the binary
528 package under /usr/share/appdata/. I did this by adding the following
529 line to debian/pymissile.install:</p>
530
531 <blockquote><pre>
532 debian/pymissile.metainfo.xml usr/share/appdata
533 </pre></blockquote>
534
535 <p>With that in place, the command line tool isenkram-lookup will list
536 all packages useful on the current computer automatically, and the GUI
537 pop-up handler will propose to install the package not already
538 installed if a hardware dongle is inserted into the machine in
539 question.</p>
540
541 <p>Details of the modalias field in appstream is available from the
542 <a href="https://wiki.debian.org/DEP-11">DEP-11</a> proposal.</p>
543
544 <p>To locate the modalias values of all hardware present in a machine,
545 try running this command on the command line:</p>
546
547 <blockquote><pre>
548 cat $(find /sys/devices/|grep modalias)
549 </pre></blockquote>
550
551 <p>To learn more about the isenkram system, please check out
552 <a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">my
553 blog posts tagged isenkram</a>.</p>
554
555 </div>
556 <div class="tags">
557
558
559 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
560
561
562 </div>
563 </div>
564 <div class="padding"></div>
565
566 <div class="entry">
567 <div class="title">
568 <a href="http://people.skolelinux.org/pere/blog/Debian_Jessie__PXE_and_automatic_firmware_installation.html">Debian Jessie, PXE and automatic firmware installation</a>
569 </div>
570 <div class="date">
571 17th October 2014
572 </div>
573 <div class="body">
574 <p>When PXE installing laptops with Debian, I often run into the
575 problem that the WiFi card require some firmware to work properly.
576 And it has been a pain to fix this using preseeding in Debian.
577 Normally something more is needed. But thanks to
578 <a href="https://packages.qa.debian.org/i/isenkram.html">my isenkram
579 package</a> and its recent tasksel extension, it has now become easy
580 to do this using simple preseeding.</p>
581
582 <p>The isenkram-cli package provide tasksel tasks which will install
583 firmware for the hardware found in the machine (actually, requested by
584 the kernel modules for the hardware). (It can also install user space
585 programs supporting the hardware detected, but that is not the focus
586 of this story.)</p>
587
588 <p>To get this working in the default installation, two preeseding
589 values are needed. First, the isenkram-cli package must be installed
590 into the target chroot (aka the hard drive) before tasksel is executed
591 in the pkgsel step of the debian-installer system. This is done by
592 preseeding the base-installer/includes debconf value to include the
593 isenkram-cli package. The package name is next passed to debootstrap
594 for installation. With the isenkram-cli package in place, tasksel
595 will automatically use the isenkram tasks to detect hardware specific
596 packages for the machine being installed and install them, because
597 isenkram-cli contain tasksel tasks.</p>
598
599 <p>Second, one need to enable the non-free APT repository, because
600 most firmware unfortunately is non-free. This is done by preseeding
601 the apt-mirror-setup step. This is unfortunate, but for a lot of
602 hardware it is the only option in Debian.</p>
603
604 <p>The end result is two lines needed in your preseeding file to get
605 firmware installed automatically by the installer:</p>
606
607 <p><blockquote><pre>
608 base-installer base-installer/includes string isenkram-cli
609 apt-mirror-setup apt-setup/non-free boolean true
610 </pre></blockquote></p>
611
612 <p>The current version of isenkram-cli in testing/jessie will install
613 both firmware and user space packages when using this method. It also
614 do not work well, so use version 0.15 or later. Installing both
615 firmware and user space packages might give you a bit more than you
616 want, so I decided to split the tasksel task in two, one for firmware
617 and one for user space programs. The firmware task is enabled by
618 default, while the one for user space programs is not. This split is
619 implemented in the package currently in unstable.</p>
620
621 <p>If you decide to give this a go, please let me know (via email) how
622 this recipe work for you. :)</p>
623
624 <p>So, I bet you are wondering, how can this work. First and
625 foremost, it work because tasksel is modular, and driven by whatever
626 files it find in /usr/lib/tasksel/ and /usr/share/tasksel/. So the
627 isenkram-cli package place two files for tasksel to find. First there
628 is the task description file (/usr/share/tasksel/descs/isenkram.desc):</p>
629
630 <p><blockquote><pre>
631 Task: isenkram-packages
632 Section: hardware
633 Description: Hardware specific packages (autodetected by isenkram)
634 Based on the detected hardware various hardware specific packages are
635 proposed.
636 Test-new-install: show show
637 Relevance: 8
638 Packages: for-current-hardware
639
640 Task: isenkram-firmware
641 Section: hardware
642 Description: Hardware specific firmware packages (autodetected by isenkram)
643 Based on the detected hardware various hardware specific firmware
644 packages are proposed.
645 Test-new-install: mark show
646 Relevance: 8
647 Packages: for-current-hardware-firmware
648 </pre></blockquote></p>
649
650 <p>The key parts are Test-new-install which indicate how the task
651 should be handled and the Packages line referencing to a script in
652 /usr/lib/tasksel/packages/. The scripts use other scripts to get a
653 list of packages to install. The for-current-hardware-firmware script
654 look like this to list relevant firmware for the machine:
655
656 <p><blockquote><pre>
657 #!/bin/sh
658 #
659 PATH=/usr/sbin:$PATH
660 export PATH
661 isenkram-autoinstall-firmware -l
662 </pre></blockquote></p>
663
664 <p>With those two pieces in place, the firmware is installed by
665 tasksel during the normal d-i run. :)</p>
666
667 <p>If you want to test what tasksel will install when isenkram-cli is
668 installed, run <tt>DEBIAN_PRIORITY=critical tasksel --test
669 --new-install</tt> to get the list of packages that tasksel would
670 install.</p>
671
672 <p><a href="https://wiki.debian.org/DebianEdu/">Debian Edu</a> will be
673 pilots in testing this feature, as isenkram is used there now to
674 install firmware, replacing the earlier scripts.</p>
675
676 </div>
677 <div class="tags">
678
679
680 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>, <a href="http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin</a>.
681
682
683 </div>
684 </div>
685 <div class="padding"></div>
686
687 <div class="entry">
688 <div class="title">
689 <a href="http://people.skolelinux.org/pere/blog/Install_hardware_dependent_packages_using_tasksel__Isenkram_0_7_.html">Install hardware dependent packages using tasksel (Isenkram 0.7)</a>
690 </div>
691 <div class="date">
692 23rd April 2014
693 </div>
694 <div class="body">
695 <p>It would be nice if it was easier in Debian to get all the hardware
696 related packages relevant for the computer installed automatically.
697 So I implemented one, using
698 <a href="http://packages.qa.debian.org/isenkram">my Isenkram
699 package</a>. To use it, install the tasksel and isenkram packages and
700 run tasksel as user root. You should be presented with a new option,
701 "Hardware specific packages (autodetected by isenkram)". When you
702 select it, tasksel will install the packages isenkram claim is fit for
703 the current hardware, hot pluggable or not.<p>
704
705 <p>The implementation is in two files, one is the tasksel menu entry
706 description, and the other is the script used to extract the list of
707 packages to install. The first part is in
708 <tt>/usr/share/tasksel/descs/isenkram.desc</tt> and look like
709 this:</p>
710
711 <p><blockquote><pre>
712 Task: isenkram
713 Section: hardware
714 Description: Hardware specific packages (autodetected by isenkram)
715 Based on the detected hardware various hardware specific packages are
716 proposed.
717 Test-new-install: mark show
718 Relevance: 8
719 Packages: for-current-hardware
720 </pre></blockquote></p>
721
722 <p>The second part is in
723 <tt>/usr/lib/tasksel/packages/for-current-hardware</tt> and look like
724 this:</p>
725
726 <p><blockquote><pre>
727 #!/bin/sh
728 #
729 (
730 isenkram-lookup
731 isenkram-autoinstall-firmware -l
732 ) | sort -u
733 </pre></blockquote></p>
734
735 <p>All in all, a very short and simple implementation making it
736 trivial to install the hardware dependent package we all may want to
737 have installed on our machines. I've not been able to find a way to
738 get tasksel to tell you exactly which packages it plan to install
739 before doing the installation. So if you are curious or careful,
740 check the output from the isenkram-* command line tools first.</p>
741
742 <p>The information about which packages are handling which hardware is
743 fetched either from the isenkram package itself in
744 /usr/share/isenkram/, from git.debian.org or from the APT package
745 database (using the Modaliases header). The APT package database
746 parsing have caused a nasty resource leak in the isenkram daemon (bugs
747 <a href="http://bugs.debian.org/719837">#719837</a> and
748 <a href="http://bugs.debian.org/730704">#730704</a>). The cause is in
749 the python-apt code (bug
750 <a href="http://bugs.debian.org/745487">#745487</a>), but using a
751 workaround I was able to get rid of the file descriptor leak and
752 reduce the memory leak from ~30 MiB per hardware detection down to
753 around 2 MiB per hardware detection. It should make the desktop
754 daemon a lot more useful. The fix is in version 0.7 uploaded to
755 unstable today.</p>
756
757 <p>I believe the current way of mapping hardware to packages in
758 Isenkram is is a good draft, but in the future I expect isenkram to
759 use the AppStream data source for this. A proposal for getting proper
760 AppStream support into Debian is floating around as
761 <a href="https://wiki.debian.org/DEP-11">DEP-11</a>, and
762 <a href="https://wiki.debian.org/SummerOfCode2014/Projects#SummerOfCode2014.2FProjects.2FAppStreamDEP11Implementation.AppStream.2FDEP-11_for_the_Debian_Archive">GSoC
763 project</a> will take place this summer to improve the situation. I
764 look forward to seeing the result, and welcome patches for isenkram to
765 start using the information when it is ready.</p>
766
767 <p>If you want your package to map to some specific hardware, either
768 add a "Xb-Modaliases" header to your control file like I did in
769 <a href="http://packages.qa.debian.org/pymissile">the pymissile
770 package</a> or submit a bug report with the details to the isenkram
771 package. See also
772 <a href="http://people.skolelinux.org/pere/blog/tags/isenkram/">all my
773 blog posts tagged isenkram</a> for details on the notation. I expect
774 the information will be migrated to AppStream eventually, but for the
775 moment I got no better place to store it.</p>
776
777 </div>
778 <div class="tags">
779
780
781 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
782
783
784 </div>
785 </div>
786 <div class="padding"></div>
787
788 <div class="entry">
789 <div class="title">
790 <a href="http://people.skolelinux.org/pere/blog/Automatically_locate_and_install_required_firmware_packages_on_Debian__Isenkram_0_4_.html">Automatically locate and install required firmware packages on Debian (Isenkram 0.4)</a>
791 </div>
792 <div class="date">
793 25th June 2013
794 </div>
795 <div class="body">
796 <p>It annoys me when the computer fail to do automatically what it is
797 perfectly capable of, and I have to do it manually to get things
798 working. One such task is to find out what firmware packages are
799 needed to get the hardware on my computer working. Most often this
800 affect the wifi card, but some times it even affect the RAID
801 controller or the ethernet card. Today I pushed version 0.4 of the
802 <a href="http://packages.qa.debian.org/isenkram">Isenkram package</a>
803 including a new script isenkram-autoinstall-firmware handling the
804 process of asking all the loaded kernel modules what firmware files
805 they want, find debian packages providing these files and install the
806 debian packages. Here is a test run on my laptop:</p>
807
808 <p><pre>
809 # isenkram-autoinstall-firmware
810 info: kernel drivers requested extra firmware: ipw2200-bss.fw ipw2200-ibss.fw ipw2200-sniffer.fw
811 info: fetching http://http.debian.net/debian/dists/squeeze/Contents-i386.gz
812 info: locating packages with the requested firmware files
813 info: Updating APT sources after adding non-free APT source
814 info: trying to install firmware-ipw2x00
815 firmware-ipw2x00
816 firmware-ipw2x00
817 Preconfiguring packages ...
818 Selecting previously deselected package firmware-ipw2x00.
819 (Reading database ... 259727 files and directories currently installed.)
820 Unpacking firmware-ipw2x00 (from .../firmware-ipw2x00_0.28+squeeze1_all.deb) ...
821 Setting up firmware-ipw2x00 (0.28+squeeze1) ...
822 #
823 </pre></p>
824
825 <p>When all the requested firmware is present, a simple message is
826 printed instead:</p>
827
828 <p><pre>
829 # isenkram-autoinstall-firmware
830 info: did not find any firmware files requested by loaded kernel modules. exiting
831 #
832 </pre></p>
833
834 <p>It could use some polish, but it is already working well and saving
835 me some time when setting up new machines. :)</p>
836
837 <p>So, how does it work? It look at the set of currently loaded
838 kernel modules, and look up each one of them using modinfo, to find
839 the firmware files listed in the module meta-information. Next, it
840 download the Contents file from a nearby APT mirror, and search for
841 the firmware files in this file to locate the package with the
842 requested firmware file. If the package is in the non-free section, a
843 non-free APT source is added and the package is installed using
844 <tt>apt-get install</tt>. The end result is a slightly better working
845 machine.</p>
846
847 <p>I hope someone find time to implement a more polished version of
848 this script as part of the hw-detect debian-installer module, to
849 finally fix <a href="http://bugs.debian.org/655507">BTS report
850 #655507</a>. There really is no need to insert USB sticks with
851 firmware during a PXE install when the packages already are available
852 from the nearby Debian mirror.</p>
853
854 </div>
855 <div class="tags">
856
857
858 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
859
860
861 </div>
862 </div>
863 <div class="padding"></div>
864
865 <div class="entry">
866 <div class="title">
867 <a href="http://people.skolelinux.org/pere/blog/Isenkram_0_2_finally_in_the_Debian_archive.html">Isenkram 0.2 finally in the Debian archive</a>
868 </div>
869 <div class="date">
870 3rd April 2013
871 </div>
872 <div class="body">
873 <p>Today the <a href="http://packages.qa.debian.org/isenkram">Isenkram
874 package</a> finally made it into the archive, after lingering in NEW
875 for many months. I uploaded it to the Debian experimental suite
876 2013-01-27, and today it was accepted into the archive.</p>
877
878 <p>Isenkram is a system for suggesting to users what packages to
879 install to work with a pluggable hardware device. The suggestion pop
880 up when the device is plugged in. For example if a Lego Mindstorm NXT
881 is inserted, it will suggest to install the program needed to program
882 the NXT controller. Give it a go, and report bugs and suggestions to
883 BTS. :)</p>
884
885 </div>
886 <div class="tags">
887
888
889 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
890
891
892 </div>
893 </div>
894 <div class="padding"></div>
895
896 <div class="entry">
897 <div class="title">
898 <a href="http://people.skolelinux.org/pere/blog/Welcome_to_the_world__Isenkram_.html">Welcome to the world, Isenkram!</a>
899 </div>
900 <div class="date">
901 22nd January 2013
902 </div>
903 <div class="body">
904 <p>Yesterday, I
905 <a href="http://people.skolelinux.org/pere/blog/First_prototype_ready_making_hardware_easier_to_use_in_Debian.html">asked
906 for testers</a> for my prototype for making Debian better at handling
907 pluggable hardware devices, which I
908 <a href="http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">set
909 out to create</a> earlier this month. Several valuable testers showed
910 up, and caused me to really want to to open up the development to more
911 people. But before I did this, I want to come up with a sensible name
912 for this project. Today I finally decided on a new name, and I have
913 renamed the project from hw-support-handler to this new name. In the
914 process, I moved the source to git and made it available as a
915 <a href="http://anonscm.debian.org/gitweb/?p=collab-maint/isenkram.git">collab-maint</a>
916 repository in Debian. The new name? It is <strong>Isenkram</strong>.
917 To fetch and build the latest version of the source, use</p>
918
919 <pre>
920 git clone http://anonscm.debian.org/git/collab-maint/isenkram.git
921 cd isenkram && git-buildpackage -us -uc
922 </pre>
923
924 <p>I have not yet adjusted all files to use the new name yet. If you
925 want to hack on the source or improve the package, please go ahead.
926 But please talk to me first on IRC or via email before you do major
927 changes, to make sure we do not step on each others toes. :)</p>
928
929 <p>If you wonder what 'isenkram' is, it is a Norwegian word for iron
930 stuff, typically meaning tools, nails, screws, etc. Typical hardware
931 stuff, in other words. I've been told it is the Norwegian variant of
932 the German word eisenkram, for those that are familiar with that
933 word.</p>
934
935 <p><strong>Update 2013-01-26</strong>: Added -us -us to build
936 instructions, to avoid confusing people with an error from the signing
937 process.</p>
938
939 <p><strong>Update 2013-01-27</strong>: Switch to HTTP URL for the git
940 clone argument to avoid the need for authentication.</p>
941
942 </div>
943 <div class="tags">
944
945
946 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
947
948
949 </div>
950 </div>
951 <div class="padding"></div>
952
953 <div class="entry">
954 <div class="title">
955 <a href="http://people.skolelinux.org/pere/blog/First_prototype_ready_making_hardware_easier_to_use_in_Debian.html">First prototype ready making hardware easier to use in Debian</a>
956 </div>
957 <div class="date">
958 21st January 2013
959 </div>
960 <div class="body">
961 <p>Early this month I set out to try to
962 <a href="http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">improve
963 the Debian support for pluggable hardware devices</a>. Now my
964 prototype is working, and it is ready for a larger audience. To test
965 it, fetch the
966 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/">source
967 from the Debian Edu subversion repository</a>, build and install the
968 package. You might have to log out and in again activate the
969 autostart script.</p>
970
971 <p>The design is simple:</p>
972
973 <ul>
974
975 <li>Add desktop entry in /usr/share/autostart/ causing a program
976 hw-support-handlerd to start when the user log in.</li>
977
978 <li>This program listen for kernel events about new hardware (directly
979 from the kernel like udev does), not using HAL dbus events as I
980 initially did.</li>
981
982 <li>When new hardware is inserted, look up the hardware modalias in
983 the APT database, a database
984 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/modaliases?view=markup">available
985 via HTTP</a> and a database available as part of the package.</li>
986
987 <li>If a package is mapped to the hardware in question, the package
988 isn't installed yet and this is the first time the hardware was
989 plugged in, show a desktop notification suggesting to install the
990 package or packages.</li>
991
992 <li>If the user click on the 'install package now' button, ask
993 aptdaemon via the PackageKit API to install the requrired package.</li>
994
995 <li>aptdaemon ask for root password or sudo password, and install the
996 package while showing progress information in a window.</li>
997
998 </ul>
999
1000 <p>I still need to come up with a better name for the system. Here
1001 are some screen shots showing the prototype in action. First the
1002 notification, then the password request, and finally the request to
1003 approve all the dependencies. Sorry for the Norwegian Bokmål GUI.</p>
1004
1005 <p><img src="http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-1-notification.png">
1006 <br><img src="http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-2-password.png">
1007 <br><img src="http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-3-dependencies.png">
1008 <br><img src="http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-4-installing.png">
1009 <br><img src="http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-5-installing-details.png" width="70%"></p>
1010
1011 <p>The prototype still need to be improved with longer timeouts, but
1012 is already useful. The database of hardware to package mappings also
1013 need more work. It is currently compatible with the Ubuntu way of
1014 storing such information in the package control file, but could be
1015 changed to use other formats instead or in addition to the current
1016 method. I've dropped the use of discover for this mapping, as the
1017 modalias approach is more flexible and easier to use on Linux as long
1018 as the Linux kernel expose its modalias strings directly.</p>
1019
1020 <p><strong>Update 2013-01-21 16:50</strong>: Due to popular demand,
1021 here is the command required to check out and build the source: Use
1022 '<tt>svn checkout
1023 svn://svn.debian.org/debian-edu/trunk/src/hw-support-handler/; cd
1024 hw-support-handler; debuild</tt>'. If you lack debuild, install the
1025 devscripts package.</p>
1026
1027 <p><strong>Update 2013-01-23 12:00</strong>: The project is now
1028 renamed to Isenkram and the source moved from the Debian Edu
1029 subversion repository to a Debian collab-maint git repository. See
1030 <a href="http://people.skolelinux.org/pere/blog/Welcome_to_the_world__Isenkram_.html">build
1031 instructions</a> for details.</p>
1032
1033 </div>
1034 <div class="tags">
1035
1036
1037 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
1038
1039
1040 </div>
1041 </div>
1042 <div class="padding"></div>
1043
1044 <div class="entry">
1045 <div class="title">
1046 <a href="http://people.skolelinux.org/pere/blog/Using_modalias_info_to_find_packages_handling_my_hardware.html">Using modalias info to find packages handling my hardware</a>
1047 </div>
1048 <div class="date">
1049 15th January 2013
1050 </div>
1051 <div class="body">
1052 <p>Yesterday, I wrote about the
1053 <a href="http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html">modalias
1054 values provided by the Linux kernel</a> following my hope for
1055 <a href="http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">better
1056 dongle support in Debian</a>. Using this knowledge, I have tested how
1057 modalias values attached to package names can be used to map packages
1058 to hardware. This allow the system to look up and suggest relevant
1059 packages when I plug in some new hardware into my machine, and replace
1060 discover and discover-data as the database used to map hardware to
1061 packages.</p>
1062
1063 <p>I create a modaliases file with entries like the following,
1064 containing package name, kernel module name (if relevant, otherwise
1065 the package name) and globs matching the relevant hardware
1066 modalias.</p>
1067
1068 <p><blockquote>
1069 Package: package-name
1070 <br>Modaliases: module(modaliasglob, modaliasglob, modaliasglob)</p>
1071 </blockquote></p>
1072
1073 <p>It is fairly trivial to write code to find the relevant packages
1074 for a given modalias value using this file.</p>
1075
1076 <p>An entry like this would suggest the video and picture application
1077 cheese for many USB web cameras (interface bus class 0E01):</p>
1078
1079 <p><blockquote>
1080 Package: cheese
1081 <br>Modaliases: cheese(usb:v*p*d*dc*dsc*dp*ic0Eisc01ip*)</p>
1082 </blockquote></p>
1083
1084 <p>An entry like this would suggest the pcmciautils package when a
1085 CardBus bridge (bus class 0607) PCI device is present:</p>
1086
1087 <p><blockquote>
1088 Package: pcmciautils
1089 <br>Modaliases: pcmciautils(pci:v*d*sv*sd*bc06sc07i*)
1090 </blockquote></p>
1091
1092 <p>An entry like this would suggest the package colorhug-client when
1093 plugging in a ColorHug with USB IDs 04D8:F8DA:</p>
1094
1095 <p><blockquote>
1096 Package: colorhug-client
1097 <br>Modaliases: colorhug-client(usb:v04D8pF8DAd*)</p>
1098 </blockquote></p>
1099
1100 <p>I believe the format is compatible with the format of the Packages
1101 file in the Debian archive. Ubuntu already uses their Packages file
1102 to store their mappings from packages to hardware.</p>
1103
1104 <p>By adding a XB-Modaliases: header in debian/control, any .deb can
1105 announce the hardware it support in a way my prototype understand.
1106 This allow those publishing packages in an APT source outside the
1107 Debian archive as well as those backporting packages to make sure the
1108 hardware mapping are included in the package meta information. I've
1109 tested such header in the pymissile package, and its modalias mapping
1110 is working as it should with my prototype. It even made it to Ubuntu
1111 Raring.</p>
1112
1113 <p>To test if it was possible to look up supported hardware using only
1114 the shell tools available in the Debian installer, I wrote a shell
1115 implementation of the lookup code. The idea is to create files for
1116 each modalias and let the shell do the matching. Please check out and
1117 try the
1118 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/hw-support-lookup?view=co">hw-support-lookup</a>
1119 shell script. It run without any extra dependencies and fetch the
1120 hardware mappings from the Debian archive and the subversion
1121 repository where I currently work on my prototype.</p>
1122
1123 <p>When I use it on a machine with a yubikey inserted, it suggest to
1124 install yubikey-personalization:</p>
1125
1126 <p><blockquote>
1127 % ./hw-support-lookup
1128 <br>yubikey-personalization
1129 <br>%
1130 </blockquote></p>
1131
1132 <p>When I run it on my Thinkpad X40 with a PCMCIA/CardBus slot, it
1133 propose to install the pcmciautils package:</p>
1134
1135 <p><blockquote>
1136 % ./hw-support-lookup
1137 <br>pcmciautils
1138 <br>%
1139 </blockquote></p>
1140
1141 <p>If you know of any hardware-package mapping that should be added to
1142 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/modaliases?view=co">my
1143 database</a>, please tell me about it.</p>
1144
1145 <p>It could be possible to generate several of the mappings between
1146 packages and hardware. One source would be to look at packages with
1147 kernel modules, ie packages with *.ko files in /lib/modules/, and
1148 extract their modalias information. Another would be to look at
1149 packages with udev rules, ie packages with files in
1150 /lib/udev/rules.d/, and extract their vendor/model information to
1151 generate a modalias matching rule. I have not tested any of these to
1152 see if it work.</p>
1153
1154 <p>If you want to help implementing a system to let us propose what
1155 packages to install when new hardware is plugged into a Debian
1156 machine, please send me an email or talk to me on
1157 <a href="irc://irc.debian.org/%23debian-devel">#debian-devel</a>.</p>
1158
1159 </div>
1160 <div class="tags">
1161
1162
1163 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
1164
1165
1166 </div>
1167 </div>
1168 <div class="padding"></div>
1169
1170 <div class="entry">
1171 <div class="title">
1172 <a href="http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html">Modalias strings - a practical way to map "stuff" to hardware</a>
1173 </div>
1174 <div class="date">
1175 14th January 2013
1176 </div>
1177 <div class="body">
1178 <p>While looking into how to look up Debian packages based on hardware
1179 information, to find the packages that support a given piece of
1180 hardware, I refreshed my memory regarding modalias values, and decided
1181 to document the details. Here are my findings so far, also available
1182 in
1183 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/">the
1184 Debian Edu subversion repository</a>:
1185
1186 <p><strong>Modalias decoded</strong></p>
1187
1188 <p>This document try to explain what the different types of modalias
1189 values stands for. It is in part based on information from
1190 &lt;URL: <a href="https://wiki.archlinux.org/index.php/Modalias">https://wiki.archlinux.org/index.php/Modalias</a> &gt;,
1191 &lt;URL: <a href="http://unix.stackexchange.com/questions/26132/how-to-assign-usb-driver-to-device">http://unix.stackexchange.com/questions/26132/how-to-assign-usb-driver-to-device</a> &gt;,
1192 &lt;URL: <a href="http://code.metager.de/source/history/linux/stable/scripts/mod/file2alias.c">http://code.metager.de/source/history/linux/stable/scripts/mod/file2alias.c</a> &gt; and
1193 &lt;URL: <a href="http://cvs.savannah.gnu.org/viewvc/dmidecode/dmidecode.c?root=dmidecode&view=markup">http://cvs.savannah.gnu.org/viewvc/dmidecode/dmidecode.c?root=dmidecode&view=markup</a> &gt;.
1194
1195 <p>The modalias entries for a given Linux machine can be found using
1196 this shell script:</p>
1197
1198 <pre>
1199 find /sys -name modalias -print0 | xargs -0 cat | sort -u
1200 </pre>
1201
1202 <p>The supported modalias globs for a given kernel module can be found
1203 using modinfo:</p>
1204
1205 <pre>
1206 % /sbin/modinfo psmouse | grep alias:
1207 alias: serio:ty05pr*id*ex*
1208 alias: serio:ty01pr*id*ex*
1209 %
1210 </pre>
1211
1212 <p><strong>PCI subtype</strong></p>
1213
1214 <p>A typical PCI entry can look like this. This is an Intel Host
1215 Bridge memory controller:</p>
1216
1217 <p><blockquote>
1218 pci:v00008086d00002770sv00001028sd000001ADbc06sc00i00
1219 </blockquote></p>
1220
1221 <p>This represent these values:</p>
1222
1223 <pre>
1224 v 00008086 (vendor)
1225 d 00002770 (device)
1226 sv 00001028 (subvendor)
1227 sd 000001AD (subdevice)
1228 bc 06 (bus class)
1229 sc 00 (bus subclass)
1230 i 00 (interface)
1231 </pre>
1232
1233 <p>The vendor/device values are the same values outputted from 'lspci
1234 -n' as 8086:2770. The bus class/subclass is also shown by lspci as
1235 0600. The 0600 class is a host bridge. Other useful bus values are
1236 0300 (VGA compatible card) and 0200 (Ethernet controller).</p>
1237
1238 <p>Not sure how to figure out the interface value, nor what it
1239 means.</p>
1240
1241 <p><strong>USB subtype</strong></p>
1242
1243 <p>Some typical USB entries can look like this. This is an internal
1244 USB hub in a laptop:</p>
1245
1246 <p><blockquote>
1247 usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
1248 </blockquote></p>
1249
1250 <p>Here is the values included in this alias:</p>
1251
1252 <pre>
1253 v 1D6B (device vendor)
1254 p 0001 (device product)
1255 d 0206 (bcddevice)
1256 dc 09 (device class)
1257 dsc 00 (device subclass)
1258 dp 00 (device protocol)
1259 ic 09 (interface class)
1260 isc 00 (interface subclass)
1261 ip 00 (interface protocol)
1262 </pre>
1263
1264 <p>The 0900 device class/subclass means hub. Some times the relevant
1265 class is in the interface class section. For a simple USB web camera,
1266 these alias entries show up:</p>
1267
1268 <p><blockquote>
1269 usb:v0AC8p3420d5000dcEFdsc02dp01ic01isc01ip00
1270 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic01isc02ip00
1271 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic0Eisc01ip00
1272 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic0Eisc02ip00
1273 </blockquote></p>
1274
1275 <p>Interface class 0E01 is video control, 0E02 is video streaming (aka
1276 camera), 0101 is audio control device and 0102 is audio streaming (aka
1277 microphone). Thus this is a camera with microphone included.</p>
1278
1279 <p><strong>ACPI subtype</strong></p>
1280
1281 <p>The ACPI type is used for several non-PCI/USB stuff. This is an IR
1282 receiver in a Thinkpad X40:</p>
1283
1284 <p><blockquote>
1285 acpi:IBM0071:PNP0511:
1286 </blockquote></p>
1287
1288 <p>The values between the colons are IDs.</p>
1289
1290 <p><strong>DMI subtype</strong></p>
1291
1292 <p>The DMI table contain lots of information about the computer case
1293 and model. This is an entry for a IBM Thinkpad X40, fetched from
1294 /sys/devices/virtual/dmi/id/modalias:</p>
1295
1296 <p><blockquote>
1297 dmi:bvnIBM:bvr1UETB6WW(1.66):bd06/15/2005:svnIBM:pn2371H4G:pvrThinkPadX40:rvnIBM:rn2371H4G:rvrNotAvailable:cvnIBM:ct10:cvrNotAvailable:
1298 </blockquote></p>
1299
1300 <p>The values present are</p>
1301
1302 <pre>
1303 bvn IBM (BIOS vendor)
1304 bvr 1UETB6WW(1.66) (BIOS version)
1305 bd 06/15/2005 (BIOS date)
1306 svn IBM (system vendor)
1307 pn 2371H4G (product name)
1308 pvr ThinkPadX40 (product version)
1309 rvn IBM (board vendor)
1310 rn 2371H4G (board name)
1311 rvr NotAvailable (board version)
1312 cvn IBM (chassis vendor)
1313 ct 10 (chassis type)
1314 cvr NotAvailable (chassis version)
1315 </pre>
1316
1317 <p>The chassis type 10 is Notebook. Other interesting values can be
1318 found in the dmidecode source:</p>
1319
1320 <pre>
1321 3 Desktop
1322 4 Low Profile Desktop
1323 5 Pizza Box
1324 6 Mini Tower
1325 7 Tower
1326 8 Portable
1327 9 Laptop
1328 10 Notebook
1329 11 Hand Held
1330 12 Docking Station
1331 13 All In One
1332 14 Sub Notebook
1333 15 Space-saving
1334 16 Lunch Box
1335 17 Main Server Chassis
1336 18 Expansion Chassis
1337 19 Sub Chassis
1338 20 Bus Expansion Chassis
1339 21 Peripheral Chassis
1340 22 RAID Chassis
1341 23 Rack Mount Chassis
1342 24 Sealed-case PC
1343 25 Multi-system
1344 26 CompactPCI
1345 27 AdvancedTCA
1346 28 Blade
1347 29 Blade Enclosing
1348 </pre>
1349
1350 <p>The chassis type values are not always accurately set in the DMI
1351 table. For example my home server is a tower, but the DMI modalias
1352 claim it is a desktop.</p>
1353
1354 <p><strong>SerIO subtype</strong></p>
1355
1356 <p>This type is used for PS/2 mouse plugs. One example is from my
1357 test machine:</p>
1358
1359 <p><blockquote>
1360 serio:ty01pr00id00ex00
1361 </blockquote></p>
1362
1363 <p>The values present are</p>
1364
1365 <pre>
1366 ty 01 (type)
1367 pr 00 (prototype)
1368 id 00 (id)
1369 ex 00 (extra)
1370 </pre>
1371
1372 <p>This type is supported by the psmouse driver. I am not sure what
1373 the valid values are.</p>
1374
1375 <p><strong>Other subtypes</strong></p>
1376
1377 <p>There are heaps of other modalias subtypes according to
1378 file2alias.c. There is the rest of the list from that source: amba,
1379 ap, bcma, ccw, css, eisa, hid, i2c, ieee1394, input, ipack, isapnp,
1380 mdio, of, parisc, pcmcia, platform, scsi, sdio, spi, ssb, vio, virtio,
1381 vmbus, x86cpu and zorro. I did not spend time documenting all of
1382 these, as they do not seem relevant for my intended use with mapping
1383 hardware to packages when new stuff is inserted during run time.</p>
1384
1385 <p><strong>Looking up kernel modules using modalias values</strong></p>
1386
1387 <p>To check which kernel modules provide support for a given modalias,
1388 one can use the following shell script:</p>
1389
1390 <pre>
1391 for id in $(find /sys -name modalias -print0 | xargs -0 cat | sort -u); do \
1392 echo "$id" ; \
1393 /sbin/modprobe --show-depends "$id"|sed 's/^/ /' ; \
1394 done
1395 </pre>
1396
1397 <p>The output can look like this (only the first few entries as the
1398 list is very long on my test machine):</p>
1399
1400 <pre>
1401 acpi:ACPI0003:
1402 insmod /lib/modules/2.6.32-5-686/kernel/drivers/acpi/ac.ko
1403 acpi:device:
1404 FATAL: Module acpi:device: not found.
1405 acpi:IBM0068:
1406 insmod /lib/modules/2.6.32-5-686/kernel/drivers/char/nvram.ko
1407 insmod /lib/modules/2.6.32-5-686/kernel/drivers/leds/led-class.ko
1408 insmod /lib/modules/2.6.32-5-686/kernel/net/rfkill/rfkill.ko
1409 insmod /lib/modules/2.6.32-5-686/kernel/drivers/platform/x86/thinkpad_acpi.ko
1410 acpi:IBM0071:PNP0511:
1411 insmod /lib/modules/2.6.32-5-686/kernel/lib/crc-ccitt.ko
1412 insmod /lib/modules/2.6.32-5-686/kernel/net/irda/irda.ko
1413 insmod /lib/modules/2.6.32-5-686/kernel/drivers/net/irda/nsc-ircc.ko
1414 [...]
1415 </pre>
1416
1417 <p>If you want to help implementing a system to let us propose what
1418 packages to install when new hardware is plugged into a Debian
1419 machine, please send me an email or talk to me on
1420 <a href="irc://irc.debian.org/%23debian-devel">#debian-devel</a>.</p>
1421
1422 <p><strong>Update 2013-01-15:</strong> Rewrite "cat $(find ...)" to
1423 "find ... -print0 | xargs -0 cat" to make sure it handle directories
1424 in /sys/ with space in them.</p>
1425
1426 </div>
1427 <div class="tags">
1428
1429
1430 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
1431
1432
1433 </div>
1434 </div>
1435 <div class="padding"></div>
1436
1437 <div class="entry">
1438 <div class="title">
1439 <a href="http://people.skolelinux.org/pere/blog/Moved_the_pymissile_Debian_packaging_to_collab_maint.html">Moved the pymissile Debian packaging to collab-maint</a>
1440 </div>
1441 <div class="date">
1442 10th January 2013
1443 </div>
1444 <div class="body">
1445 <p>As part of my investigation on how to improve the support in Debian
1446 for hardware dongles, I dug up my old Mark and Spencer USB Rocket
1447 Launcher and updated the Debian package
1448 <a href="http://packages.qa.debian.org/pymissile">pymissile</a> to make
1449 sure udev will fix the device permissions when it is plugged in. I
1450 also added a "Modaliases" header to test it in the Debian archive and
1451 hopefully make the package be proposed by jockey in Ubuntu when a user
1452 plug in his rocket launcher. In the process I moved the source to a
1453 git repository under collab-maint, to make it easier for any DD to
1454 contribute. <a href="http://code.google.com/p/pymissile/">Upstream</a>
1455 is not very active, but the software still work for me even after five
1456 years of relative silence. The new git repository is not listed in
1457 the uploaded package yet, because I want to test the other changes a
1458 bit more before I upload the new version. If you want to check out
1459 the new version with a .desktop file included, visit the
1460 <a href="http://anonscm.debian.org/gitweb/?p=collab-maint/pymissile.git">gitweb
1461 view</a> or use "<tt>git clone
1462 git://anonscm.debian.org/collab-maint/pymissile.git</tt>".</p>
1463
1464 </div>
1465 <div class="tags">
1466
1467
1468 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>, <a href="http://people.skolelinux.org/pere/blog/tags/robot">robot</a>.
1469
1470
1471 </div>
1472 </div>
1473 <div class="padding"></div>
1474
1475 <div class="entry">
1476 <div class="title">
1477 <a href="http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">Lets make hardware dongles easier to use in Debian</a>
1478 </div>
1479 <div class="date">
1480 9th January 2013
1481 </div>
1482 <div class="body">
1483 <p>One thing that annoys me with Debian and Linux distributions in
1484 general, is that there is a great package management system with the
1485 ability to automatically install software packages by downloading them
1486 from the distribution mirrors, but no way to get it to automatically
1487 install the packages I need to use the hardware I plug into my
1488 machine. Even if the package to use it is easily available from the
1489 Linux distribution. When I plug in a LEGO Mindstorms NXT, it could
1490 suggest to automatically install the python-nxt, nbc and t2n packages
1491 I need to talk to it. When I plug in a Yubikey, it could propose the
1492 yubikey-personalization package. The information required to do this
1493 is available, but no-one have pulled all the pieces together.</p>
1494
1495 <p>Some years ago, I proposed to
1496 <a href="http://lists.debian.org/debian-devel/2010/05/msg01206.html">use
1497 the discover subsystem to implement this</a>. The idea is fairly
1498 simple:
1499
1500 <ul>
1501
1502 <li>Add a desktop entry in /usr/share/autostart/ pointing to a program
1503 starting when a user log in.</li>
1504
1505 <li>Set this program up to listen for kernel events emitted when new
1506 hardware is inserted into the computer.</li>
1507
1508 <li>When new hardware is inserted, look up the hardware ID in a
1509 database mapping to packages, and take note of any non-installed
1510 packages.</li>
1511
1512 <li>Show a message to the user proposing to install the discovered
1513 package, and make it easy to install it.</li>
1514
1515 </ul>
1516
1517 <p>I am not sure what the best way to implement this is, but my
1518 initial idea was to use dbus events to discover new hardware, the
1519 discover database to find packages and
1520 <a href="http://www.packagekit.org/">PackageKit</a> to install
1521 packages.</p>
1522
1523 <p>Yesterday, I found time to try to implement this idea, and the
1524 draft package is now checked into
1525 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/">the
1526 Debian Edu subversion repository</a>. In the process, I updated the
1527 <a href="http://packages.qa.debian.org/d/discover-data.html">discover-data</a>
1528 package to map the USB ids of LEGO Mindstorms and Yubikey devices to
1529 the relevant packages in Debian, and uploaded a new version
1530 2.2013.01.09 to unstable. I also discovered that the current
1531 <a href="http://packages.qa.debian.org/d/discover.html">discover</a>
1532 package in Debian no longer discovered any USB devices, because
1533 /proc/bus/usb/devices is no longer present. I ported it to use
1534 libusb as a fall back option to get it working. The fixed package
1535 version 2.1.2-6 is now in experimental (didn't upload it to unstable
1536 because of the freeze).</p>
1537
1538 <p>With this prototype in place, I can insert my Yubikey, and get this
1539 desktop notification to show up (only once, the first time it is
1540 inserted):</p>
1541
1542 <p align="center"><img src="http://people.skolelinux.org/pere/blog/images/2013-01-09-hw-autoinstall.png"></p>
1543
1544 <p>For this prototype to be really useful, some way to automatically
1545 install the proposed packages by pressing the "Please install
1546 program(s)" button should to be implemented.</p>
1547
1548 <p>If this idea seem useful to you, and you want to help make it
1549 happen, please help me update the discover-data database with mappings
1550 from hardware to Debian packages. Check if 'discover-pkginstall -l'
1551 list the package you would like to have installed when a given
1552 hardware device is inserted into your computer, and report bugs using
1553 reportbug if it isn't. Or, if you know of a better way to provide
1554 such mapping, please let me know.</p>
1555
1556 <p>This prototype need more work, and there are several questions that
1557 should be considered before it is ready for production use. Is dbus
1558 the correct way to detect new hardware? At the moment I look for HAL
1559 dbus events on the system bus, because that is the events I could see
1560 on my Debian Squeeze KDE desktop. Are there better events to use?
1561 How should the user be notified? Is the desktop notification
1562 mechanism the best option, or should the background daemon raise a
1563 popup instead? How should packages be installed? When should they
1564 not be installed?</p>
1565
1566 <p>If you want to help getting such feature implemented in Debian,
1567 please send me an email. :)</p>
1568
1569 </div>
1570 <div class="tags">
1571
1572
1573 Tags: <a href="http://people.skolelinux.org/pere/blog/tags/debian">debian</a>, <a href="http://people.skolelinux.org/pere/blog/tags/english">english</a>, <a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram</a>.
1574
1575
1576 </div>
1577 </div>
1578 <div class="padding"></div>
1579
1580 <p style="text-align: right;"><a href="isenkram.rss"><img src="http://people.skolelinux.org/pere/blog/xml.gif" alt="RSS Feed" width="36" height="14" /></a></p>
1581 <div id="sidebar">
1582
1583
1584
1585 <h2>Archive</h2>
1586 <ul>
1587
1588 <li>2017
1589 <ul>
1590
1591 <li><a href="http://people.skolelinux.org/pere/blog/archive/2017/01/">January (4)</a></li>
1592
1593 <li><a href="http://people.skolelinux.org/pere/blog/archive/2017/02/">February (3)</a></li>
1594
1595 <li><a href="http://people.skolelinux.org/pere/blog/archive/2017/03/">March (5)</a></li>
1596
1597 <li><a href="http://people.skolelinux.org/pere/blog/archive/2017/04/">April (2)</a></li>
1598
1599 </ul></li>
1600
1601 <li>2016
1602 <ul>
1603
1604 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/01/">January (3)</a></li>
1605
1606 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/02/">February (2)</a></li>
1607
1608 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/03/">March (3)</a></li>
1609
1610 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/04/">April (8)</a></li>
1611
1612 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/05/">May (8)</a></li>
1613
1614 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/06/">June (2)</a></li>
1615
1616 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/07/">July (2)</a></li>
1617
1618 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/08/">August (5)</a></li>
1619
1620 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/09/">September (2)</a></li>
1621
1622 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/10/">October (3)</a></li>
1623
1624 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/11/">November (8)</a></li>
1625
1626 <li><a href="http://people.skolelinux.org/pere/blog/archive/2016/12/">December (5)</a></li>
1627
1628 </ul></li>
1629
1630 <li>2015
1631 <ul>
1632
1633 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/01/">January (7)</a></li>
1634
1635 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/02/">February (6)</a></li>
1636
1637 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/03/">March (1)</a></li>
1638
1639 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/04/">April (4)</a></li>
1640
1641 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/05/">May (3)</a></li>
1642
1643 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/06/">June (4)</a></li>
1644
1645 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/07/">July (6)</a></li>
1646
1647 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/08/">August (2)</a></li>
1648
1649 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/09/">September (2)</a></li>
1650
1651 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/10/">October (9)</a></li>
1652
1653 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/11/">November (6)</a></li>
1654
1655 <li><a href="http://people.skolelinux.org/pere/blog/archive/2015/12/">December (3)</a></li>
1656
1657 </ul></li>
1658
1659 <li>2014
1660 <ul>
1661
1662 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/01/">January (2)</a></li>
1663
1664 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/02/">February (3)</a></li>
1665
1666 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/03/">March (8)</a></li>
1667
1668 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/04/">April (7)</a></li>
1669
1670 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/05/">May (1)</a></li>
1671
1672 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/06/">June (2)</a></li>
1673
1674 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/07/">July (2)</a></li>
1675
1676 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/08/">August (2)</a></li>
1677
1678 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/09/">September (5)</a></li>
1679
1680 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/10/">October (6)</a></li>
1681
1682 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/11/">November (3)</a></li>
1683
1684 <li><a href="http://people.skolelinux.org/pere/blog/archive/2014/12/">December (5)</a></li>
1685
1686 </ul></li>
1687
1688 <li>2013
1689 <ul>
1690
1691 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/01/">January (11)</a></li>
1692
1693 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/02/">February (9)</a></li>
1694
1695 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/03/">March (9)</a></li>
1696
1697 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/04/">April (6)</a></li>
1698
1699 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/05/">May (9)</a></li>
1700
1701 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/06/">June (10)</a></li>
1702
1703 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/07/">July (7)</a></li>
1704
1705 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/08/">August (3)</a></li>
1706
1707 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/09/">September (5)</a></li>
1708
1709 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/10/">October (7)</a></li>
1710
1711 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/11/">November (9)</a></li>
1712
1713 <li><a href="http://people.skolelinux.org/pere/blog/archive/2013/12/">December (3)</a></li>
1714
1715 </ul></li>
1716
1717 <li>2012
1718 <ul>
1719
1720 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/01/">January (7)</a></li>
1721
1722 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/02/">February (10)</a></li>
1723
1724 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/03/">March (17)</a></li>
1725
1726 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/04/">April (12)</a></li>
1727
1728 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/05/">May (12)</a></li>
1729
1730 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/06/">June (20)</a></li>
1731
1732 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/07/">July (17)</a></li>
1733
1734 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/08/">August (6)</a></li>
1735
1736 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/09/">September (9)</a></li>
1737
1738 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/10/">October (17)</a></li>
1739
1740 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/11/">November (10)</a></li>
1741
1742 <li><a href="http://people.skolelinux.org/pere/blog/archive/2012/12/">December (7)</a></li>
1743
1744 </ul></li>
1745
1746 <li>2011
1747 <ul>
1748
1749 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/01/">January (16)</a></li>
1750
1751 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/02/">February (6)</a></li>
1752
1753 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/03/">March (6)</a></li>
1754
1755 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/04/">April (7)</a></li>
1756
1757 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/05/">May (3)</a></li>
1758
1759 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/06/">June (2)</a></li>
1760
1761 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/07/">July (7)</a></li>
1762
1763 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/08/">August (6)</a></li>
1764
1765 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/09/">September (4)</a></li>
1766
1767 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/10/">October (2)</a></li>
1768
1769 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/11/">November (3)</a></li>
1770
1771 <li><a href="http://people.skolelinux.org/pere/blog/archive/2011/12/">December (1)</a></li>
1772
1773 </ul></li>
1774
1775 <li>2010
1776 <ul>
1777
1778 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/01/">January (2)</a></li>
1779
1780 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/02/">February (1)</a></li>
1781
1782 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/03/">March (3)</a></li>
1783
1784 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/04/">April (3)</a></li>
1785
1786 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/05/">May (9)</a></li>
1787
1788 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/06/">June (14)</a></li>
1789
1790 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/07/">July (12)</a></li>
1791
1792 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/08/">August (13)</a></li>
1793
1794 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/09/">September (7)</a></li>
1795
1796 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/10/">October (9)</a></li>
1797
1798 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/11/">November (13)</a></li>
1799
1800 <li><a href="http://people.skolelinux.org/pere/blog/archive/2010/12/">December (12)</a></li>
1801
1802 </ul></li>
1803
1804 <li>2009
1805 <ul>
1806
1807 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/01/">January (8)</a></li>
1808
1809 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/02/">February (8)</a></li>
1810
1811 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/03/">March (12)</a></li>
1812
1813 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/04/">April (10)</a></li>
1814
1815 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/05/">May (9)</a></li>
1816
1817 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/06/">June (3)</a></li>
1818
1819 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/07/">July (4)</a></li>
1820
1821 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/08/">August (3)</a></li>
1822
1823 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/09/">September (1)</a></li>
1824
1825 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/10/">October (2)</a></li>
1826
1827 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/11/">November (3)</a></li>
1828
1829 <li><a href="http://people.skolelinux.org/pere/blog/archive/2009/12/">December (3)</a></li>
1830
1831 </ul></li>
1832
1833 <li>2008
1834 <ul>
1835
1836 <li><a href="http://people.skolelinux.org/pere/blog/archive/2008/11/">November (5)</a></li>
1837
1838 <li><a href="http://people.skolelinux.org/pere/blog/archive/2008/12/">December (7)</a></li>
1839
1840 </ul></li>
1841
1842 </ul>
1843
1844
1845
1846 <h2>Tags</h2>
1847 <ul>
1848
1849 <li><a href="http://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (13)</a></li>
1850
1851 <li><a href="http://people.skolelinux.org/pere/blog/tags/amiga">amiga (1)</a></li>
1852
1853 <li><a href="http://people.skolelinux.org/pere/blog/tags/aros">aros (1)</a></li>
1854
1855 <li><a href="http://people.skolelinux.org/pere/blog/tags/bankid">bankid (4)</a></li>
1856
1857 <li><a href="http://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (9)</a></li>
1858
1859 <li><a href="http://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (16)</a></li>
1860
1861 <li><a href="http://people.skolelinux.org/pere/blog/tags/bsa">bsa (2)</a></li>
1862
1863 <li><a href="http://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (2)</a></li>
1864
1865 <li><a href="http://people.skolelinux.org/pere/blog/tags/debian">debian (148)</a></li>
1866
1867 <li><a href="http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (158)</a></li>
1868
1869 <li><a href="http://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (3)</a></li>
1870
1871 <li><a href="http://people.skolelinux.org/pere/blog/tags/digistan">digistan (10)</a></li>
1872
1873 <li><a href="http://people.skolelinux.org/pere/blog/tags/dld">dld (16)</a></li>
1874
1875 <li><a href="http://people.skolelinux.org/pere/blog/tags/docbook">docbook (23)</a></li>
1876
1877 <li><a href="http://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (4)</a></li>
1878
1879 <li><a href="http://people.skolelinux.org/pere/blog/tags/english">english (346)</a></li>
1880
1881 <li><a href="http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (23)</a></li>
1882
1883 <li><a href="http://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (12)</a></li>
1884
1885 <li><a href="http://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (29)</a></li>
1886
1887 <li><a href="http://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (9)</a></li>
1888
1889 <li><a href="http://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (18)</a></li>
1890
1891 <li><a href="http://people.skolelinux.org/pere/blog/tags/h264">h264 (20)</a></li>
1892
1893 <li><a href="http://people.skolelinux.org/pere/blog/tags/intervju">intervju (42)</a></li>
1894
1895 <li><a href="http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (15)</a></li>
1896
1897 <li><a href="http://people.skolelinux.org/pere/blog/tags/kart">kart (20)</a></li>
1898
1899 <li><a href="http://people.skolelinux.org/pere/blog/tags/ldap">ldap (9)</a></li>
1900
1901 <li><a href="http://people.skolelinux.org/pere/blog/tags/lenker">lenker (8)</a></li>
1902
1903 <li><a href="http://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (2)</a></li>
1904
1905 <li><a href="http://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (1)</a></li>
1906
1907 <li><a href="http://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (8)</a></li>
1908
1909 <li><a href="http://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (39)</a></li>
1910
1911 <li><a href="http://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (9)</a></li>
1912
1913 <li><a href="http://people.skolelinux.org/pere/blog/tags/norsk">norsk (289)</a></li>
1914
1915 <li><a href="http://people.skolelinux.org/pere/blog/tags/nuug">nuug (188)</a></li>
1916
1917 <li><a href="http://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (31)</a></li>
1918
1919 <li><a href="http://people.skolelinux.org/pere/blog/tags/open311">open311 (2)</a></li>
1920
1921 <li><a href="http://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (64)</a></li>
1922
1923 <li><a href="http://people.skolelinux.org/pere/blog/tags/personvern">personvern (99)</a></li>
1924
1925 <li><a href="http://people.skolelinux.org/pere/blog/tags/raid">raid (1)</a></li>
1926
1927 <li><a href="http://people.skolelinux.org/pere/blog/tags/reactos">reactos (1)</a></li>
1928
1929 <li><a href="http://people.skolelinux.org/pere/blog/tags/reprap">reprap (11)</a></li>
1930
1931 <li><a href="http://people.skolelinux.org/pere/blog/tags/rfid">rfid (3)</a></li>
1932
1933 <li><a href="http://people.skolelinux.org/pere/blog/tags/robot">robot (10)</a></li>
1934
1935 <li><a href="http://people.skolelinux.org/pere/blog/tags/rss">rss (1)</a></li>
1936
1937 <li><a href="http://people.skolelinux.org/pere/blog/tags/ruter">ruter (5)</a></li>
1938
1939 <li><a href="http://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (2)</a></li>
1940
1941 <li><a href="http://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (52)</a></li>
1942
1943 <li><a href="http://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (4)</a></li>
1944
1945 <li><a href="http://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (5)</a></li>
1946
1947 <li><a href="http://people.skolelinux.org/pere/blog/tags/standard">standard (52)</a></li>
1948
1949 <li><a href="http://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (5)</a></li>
1950
1951 <li><a href="http://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (11)</a></li>
1952
1953 <li><a href="http://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (48)</a></li>
1954
1955 <li><a href="http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (3)</a></li>
1956
1957 <li><a href="http://people.skolelinux.org/pere/blog/tags/usenix">usenix (2)</a></li>
1958
1959 <li><a href="http://people.skolelinux.org/pere/blog/tags/valg">valg (8)</a></li>
1960
1961 <li><a href="http://people.skolelinux.org/pere/blog/tags/video">video (59)</a></li>
1962
1963 <li><a href="http://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (4)</a></li>
1964
1965 <li><a href="http://people.skolelinux.org/pere/blog/tags/web">web (40)</a></li>
1966
1967 </ul>
1968
1969
1970 </div>
1971 <p style="text-align: right">
1972 Created by <a href="http://steve.org.uk/Software/chronicle">Chronicle v4.6</a>
1973 </p>
1974
1975 </body>
1976 </html>