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">
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" />
14 <a href=
"http://people.skolelinux.org/pere/blog/">Petter Reinholdtsen
</a>
21 <h3>Entries tagged "isenkram".
</h3>
25 <a href=
"http://people.skolelinux.org/pere/blog/What_is_the_most_supported_MIME_type_in_Debian_in_2018_.html">What is the most supported MIME type in Debian in
2018?
</a>
32 <a href=
"http://people.skolelinux.org/pere/blog/What_is_the_most_supported_MIME_type_in_Debian_.html">I
33 measured what the most supported MIME type in Debian was
</a>, by
34 analysing the desktop files in all packages in the archive. Since
35 then, the DEP-
11 AppStream system has been put into production, making
36 the task a lot easier. This made me want to repeat the measurement,
37 to see how much things changed. Here are the new numbers, for
38 unstable only this time:
40 <p><strong>Debian Unstable:
</strong></p>
44 ----- -----------------------
57 29 image/x-portable-pixmap
59 27 image/x-portable-bitmap
67 <p>The list was created like this using a sid chroot: "cat
68 /var/lib/apt/lists/*sid*_dep11_Components-amd64.yml.gz| zcat | awk '/^
69 - \S+\/\S+$/ {print $
2 }' | sort | uniq -c | sort -nr | head -
20"
</p>
71 <p>It is interesting to see how image formats have passed text/plain
72 as the most announced supported MIME type. These days, thanks to the
73 AppStream system, if you run into a file format you do not know, and
74 want to figure out which packages support the format, you can find the
75 MIME type of the file using "file --mime
<filename
>", and then
76 look up all packages announcing support for this format in their
77 AppStream metadata (XML or .desktop file) using "appstreamcli
78 what-provides mimetype
<mime-type
>. For example if you, like
79 me, want to know which packages support inode/directory, you can get a
83 % appstreamcli what-provides mimetype inode/directory | grep Package: | sort
90 Package: doublecmd-common
92 Package: enlightenment
112 </pre></blockquote></p>
114 <p>Using the same method, I can quickly discover that the Sketchup file
115 format is not yet supported by any package in Debian:
</p>
118 % appstreamcli what-provides mimetype application/vnd.sketchup.skp
119 Could not find component providing 'mimetype::application/vnd.sketchup.skp'.
121 </pre></blockquote></p>
123 <p>Yesterday I used it to figure out which packages support the STL
3D
127 % appstreamcli what-provides mimetype application/sla|grep Package
132 </pre></blockquote></p>
134 <p>PS: A new version of Cura was uploaded to Debian yesterday.
</p>
136 <p>As usual, if you use Bitcoin and want to show your support of my
137 activities, please send Bitcoin donations to my address
138 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
144 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>.
149 <div class=
"padding"></div>
153 <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>
159 <p>I received a very nice Christmas present today. As my regular
160 readers probably know, I have been working on the
161 <a href=
"http://packages.qa.debian.org/isenkram">the Isenkram
162 system
</a> for many years. The goal of the Isenkram system is to make
163 it easier for users to figure out what to install to get a given piece
164 of hardware to work in Debian, and a key part of this system is a way
165 to map hardware to packages. Isenkram have its own mapping database,
166 and also uses data provided by each package using the AppStream
167 metadata format. And today,
168 <a href=
"https://tracker.debian.org/pkg/appstream">AppStream
</a> in
169 Debian learned to look up hardware the same way Isenkram is doing it,
170 ie using fnmatch():
</p>
173 % appstreamcli what-provides modalias \
174 usb:v1130p0202d0100dc00dsc00dp00ic03isc00ip00in00
175 Identifier: pymissile [generic]
177 Summary: Control original Striker USB Missile Launcher
179 % appstreamcli what-provides modalias usb:v0694p0002d0000
180 Identifier: libnxt [generic]
182 Summary: utility library for talking to the LEGO Mindstorms NXT brick
185 Identifier: t2n [generic]
187 Summary: Simple command-line tool for Lego NXT
190 Identifier: python-nxt [generic]
192 Summary: Python driver/interface/wrapper for the Lego Mindstorms NXT robot
195 Identifier: nbc [generic]
197 Summary: C compiler for LEGO Mindstorms NXT bricks
202 <p>A similar query can be done using the combined AppStream and
203 Isenkram databases using the isenkram-lookup tool:
</p>
206 % isenkram-lookup usb:v1130p0202d0100dc00dsc00dp00ic03isc00ip00in00
208 % isenkram-lookup usb:v0694p0002d0000
216 <p>You can find modalias values relevant for your machine using
217 <tt>cat $(find /sys/devices/ -name modalias)
</tt>.
219 <p>If you want to make this system a success and help Debian users
220 make the most of the hardware they have, please
221 help
<a href=
"https://wiki.debian.org/AppStream/Guidelines">add
222 AppStream metadata for your package following the guidelines
</a>
223 documented in the wiki. So far only
11 packages provide such
224 information, among the several hundred hardware specific packages in
225 Debian. The Isenkram database on the other hand contain
101 packages,
226 mostly related to USB dongles. Most of the packages with hardware
227 mapping in AppStream are LEGO Mindstorms related, because I have, as
228 part of my involvement in
229 <a href=
"https://wiki.debian.org/LegoDesigners">the Debian LEGO
230 team
</a> given priority to making sure LEGO users get proposed the
231 complete set of packages in Debian for that particular hardware. The
232 team also got a nice Christmas present today. The
233 <a href=
"https://tracker.debian.org/pkg/nxt-firmware">nxt-firmware
234 package
</a> made it into Debian. With this package in place, it is
235 now possible to use the LEGO Mindstorms NXT unit with only free
236 software, as the nxt-firmware package contain the source and firmware
237 binaries for the NXT brick.
</p>
239 <p>As usual, if you use Bitcoin and want to show your support of my
240 activities, please send Bitcoin donations to my address
241 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
247 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>.
252 <div class=
"padding"></div>
256 <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>
262 <p><a href=
"http://packages.qa.debian.org/isenkram">The Isenkram
263 system
</a> I wrote two years ago to make it easier in Debian to find
264 and install packages to get your hardware dongles to work, is still
265 going strong. It is a system to look up the hardware present on or
266 connected to the current system, and map the hardware to Debian
267 packages. It can either be done using the tools in isenkram-cli or
268 using the user space daemon in the isenkram package. The latter will
269 notify you, when inserting new hardware, about what packages to
270 install to get the dongle working. It will even provide a button to
271 click on to ask packagekit to install the packages.
</p>
273 <p>Here is an command line example from my Thinkpad laptop:
</p>
294 <p>It can also list the firware package providing firmware requested
295 by the load kernel modules, which in my case is an empty list because
296 I have all the firmware my machine need:
299 % /usr/sbin/isenkram-autoinstall-firmware -l
300 info: did not find any firmware files requested by loaded kernel modules. exiting
304 <p>The last few days I had a look at several of the around
250
305 packages in Debian with udev rules. These seem like good candidates
306 to install when a given hardware dongle is inserted, and I found
307 several that should be proposed by isenkram. I have not had time to
308 check all of them, but am happy to report that now there are
97
309 packages packages mapped to hardware by Isenkram.
11 of these
310 packages provide hardware mapping using AppStream, while the rest are
311 listed in the modaliases file provided in isenkram.
</p>
313 <p>These are the packages with hardware mappings at the moment. The
314 <strong>marked packages
</strong> are also announcing their hardware
315 support using AppStream, for everyone to use:
</p>
317 <p>air-quality-sensor, alsa-firmware-loaders, argyll,
318 <strong>array-info
</strong>, avarice, avrdude, b43-fwcutter,
319 bit-babbler, bluez, bluez-firmware,
<strong>brltty
</strong>,
320 <strong>broadcom-sta-dkms
</strong>, calibre, cgminer, cheese, colord,
321 <strong>colorhug-client
</strong>, dahdi-firmware-nonfree, dahdi-linux,
322 dfu-util, dolphin-emu, ekeyd, ethtool, firmware-ipw2x00, fprintd,
323 fprintd-demo,
<strong>galileo
</strong>, gkrellm-thinkbat, gphoto2,
324 gpsbabel, gpsbabel-gui, gpsman, gpstrans, gqrx-sdr, gr-fcdproplus,
325 gr-osmosdr, gtkpod, hackrf, hdapsd, hdmi2usb-udev, hpijs-ppds, hplip,
326 ipw3945-source, ipw3945d, kde-config-tablet, kinect-audio-setup,
327 <strong>libnxt
</strong>, libpam-fprintd,
<strong>lomoco
</strong>,
328 madwimax, minidisc-utils, mkgmap, msi-keyboard, mtkbabel,
329 <strong>nbc
</strong>,
<strong>nqc
</strong>, nut-hal-drivers, ola,
330 open-vm-toolbox, open-vm-tools, openambit, pcgminer, pcmciautils,
331 pcscd, pidgin-blinklight, printer-driver-splix,
332 <strong>pymissile
</strong>, python-nxt, qlandkartegt,
333 qlandkartegt-garmin, rosegarden, rt2x00-source, sispmctl,
334 soapysdr-module-hackrf, solaar, squeak-plugins-scratch, sunxi-tools,
335 <strong>t2n
</strong>, thinkfan, thinkfinger-tools, tlp, tp-smapi-dkms,
336 tp-smapi-source, tpb, tucnak, uhd-host, usbmuxd, viking,
337 virtualbox-ose-guest-x11, w1retap, xawtv, xserver-xorg-input-vmmouse,
338 xserver-xorg-input-wacom, xserver-xorg-video-qxl,
339 xserver-xorg-video-vmware, yubikey-personalization and
342 <p>If you know of other packages, please let me know with a wishlist
343 bug report against the isenkram-cli package, and ask the package
345 <a href=
"https://wiki.debian.org/AppStream/Guidelines">add AppStream
346 metadata according to the guidelines
</a> to provide the information
347 for everyone. In time, I hope to get rid of the isenkram specific
348 hardware mapping and depend exclusively on AppStream.
</p>
350 <p>Note, the AppStream metadata for broadcom-sta-dkms is matching too
351 much hardware, and suggest that the package with with any ethernet
352 card. See
<a href=
"http://bugs.debian.org/838735">bug #
838735</a> for
353 the details. I hope the maintainer find time to address it soon. In
354 the mean time I provide an override in isenkram.
</p>
360 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 <div class=
"padding"></div>
369 <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>
375 <p><a href=
"http://packages.qa.debian.org/isenkram">The Isenkram
376 system
</a> provide a practical and easy way to figure out which
377 packages support the hardware in a given machine. The command line
378 tool
<tt>isenkram-lookup
</tt> and the tasksel options provide a
379 convenient way to list and install packages relevant for the current
380 hardware during system installation, both user space packages and
381 firmware packages. The GUI background daemon on the other hand provide
382 a pop-up proposing to install packages when a new dongle is inserted
383 while using the computer. For example, if you plug in a smart card
384 reader, the system will ask if you want to install
<tt>pcscd
</tt> if
385 that package isn't already installed, and if you plug in a USB video
386 camera the system will ask if you want to install
<tt>cheese
</tt> if
387 cheese is currently missing. This already work just fine.
</p>
389 <p>But Isenkram depend on a database mapping from hardware IDs to
390 package names. When I started no such database existed in Debian, so
391 I made my own data set and included it with the isenkram package and
392 made isenkram fetch the latest version of this database from git using
393 http. This way the isenkram users would get updated package proposals
394 as soon as I learned more about hardware related packages.
</p>
396 <p>The hardware is identified using modalias strings. The modalias
397 design is from the Linux kernel where most hardware descriptors are
398 made available as a strings that can be matched using filename style
399 globbing. It handle USB, PCI, DMI and a lot of other hardware related
402 <p>The downside to the Isenkram specific database is that there is no
403 information about relevant distribution / Debian version, making
404 isenkram propose obsolete packages too. But along came AppStream, a
405 cross distribution mechanism to store and collect metadata about
406 software packages. When I heard about the proposal, I contacted the
407 people involved and suggested to add a hardware matching rule using
408 modalias strings in the specification, to be able to use AppStream for
409 mapping hardware to packages. This idea was accepted and AppStream is
410 now a great way for a package to announce the hardware it support in a
411 distribution neutral way. I wrote
412 <a href=
"http://people.skolelinux.org/pere/blog/Using_appstream_with_isenkram_to_install_hardware_related_packages_in_Debian.html">a
413 recipe on how to add such meta-information
</a> in a blog post last
414 December. If you have a hardware related package in Debian, please
415 announce the relevant hardware IDs using AppStream.
</p>
417 <p>In Debian, almost all packages that can talk to a LEGO Mindestorms
418 RCX or NXT unit, announce this support using AppStream. The effect is
419 that when you insert such LEGO robot controller into your Debian
420 machine, Isenkram will propose to install the packages needed to get
421 it working. The intention is that this should allow the local user to
422 start programming his robot controller right away without having to
423 guess what packages to use or which permissions to fix.
</p>
425 <p>But when I sat down with my son the other day to program our NXT
426 unit using his Debian Stretch computer, I discovered something
427 annoying. The local console user (ie my son) did not get access to
428 the USB device for programming the unit. This used to work, but no
429 longer in Jessie and Stretch. After some investigation and asking
430 around on #debian-devel, I discovered that this was because udev had
431 changed the mechanism used to grant access to local devices. The
432 ConsoleKit mechanism from
<tt>/lib/udev/rules.d/
70-udev-acl.rules
</tt>
433 no longer applied, because LDAP users no longer was added to the
434 plugdev group during login. Michael Biebl told me that this method
435 was obsolete and the new method used ACLs instead. This was good
436 news, as the plugdev mechanism is a mess when using a remote user
437 directory like LDAP. Using ACLs would make sure a user lost device
438 access when she logged out, even if the user left behind a background
439 process which would retain the plugdev membership with the ConsoleKit
440 setup. Armed with this knowledge I moved on to fix the access problem
441 for the LEGO Mindstorms related packages.
</p>
443 <p>The new system uses a udev tag, 'uaccess'. It can either be
444 applied directly for a device, or is applied in
445 /lib/udev/rules.d/
70-uaccess.rules for classes of devices. As the
446 LEGO Mindstorms udev rules did not have a class, I decided to add the
447 tag directly in the udev rules files included in the packages. Here
448 is one example. For the nqc C compiler for the RCX, the
449 <tt>/lib/udev/rules.d/
60-nqc.rules
</tt> file now look like this:
452 SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="
0694", ATTR{idProduct}=="
0001", \
453 SYMLINK+="rcx-%k", TAG+="uaccess"
456 <p>The key part is the 'TAG+="uaccess"' at the end. I suspect all
457 packages using plugdev in their /lib/udev/rules.d/ files should be
458 changed to use this tag (either directly or indirectly via
459 <tt>70-uaccess.rules
</tt>). Perhaps a lintian check should be created
462 <p>I've been unable to find good documentation on the uaccess feature.
463 It is unclear to me if the uaccess tag is an internal implementation
464 detail like the udev-acl tag used by
465 <tt>/lib/udev/rules.d/
70-udev-acl.rules
</tt>. If it is, I guess the
466 indirect method is the preferred way. Michael
467 <a href=
"https://github.com/systemd/systemd/issues/4288">asked for more
468 documentation from the systemd project
</a> and I hope it will make
469 this clearer. For now I use the generic classes when they exist and
470 is already handled by
<tt>70-uaccess.rules
</tt>, and add the tag
471 directly if no such class exist.
</p>
473 <p>To learn more about the isenkram system, please check out
474 <a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram/">my
475 blog posts tagged isenkram
</a>.
</p>
477 <p>To help out making life for LEGO constructors in Debian easier,
478 please join us on our IRC channel
479 <a href=
"irc://irc.debian.org/%23debian-lego">#debian-lego
</a> and join
480 the
<a href=
"https://alioth.debian.org/projects/debian-lego/">Debian
481 LEGO team
</a> in the Alioth project we created yesterday. A mailing
482 list is not yet created, but we are working on it. :)
</p>
484 <p>As usual, if you use Bitcoin and want to show your support of my
485 activities, please send Bitcoin donations to my address
486 <b><a href=
"bitcoin:15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b">15oWEoG9dUPovwmUL9KWAnYRtNJEkP1u1b
</a></b>.
</p>
492 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/lego">lego
</a>.
497 <div class=
"padding"></div>
501 <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>
507 <p><a href=
"https://tracker.debian.org/pkg/isenkram">The isenkram
508 system
</a> is a user-focused solution in Debian for handling hardware
509 related packages. The idea is to have a database of mappings between
510 hardware and packages, and pop up a dialog suggesting for the user to
511 install the packages to use a given hardware dongle. Some use cases
512 are when you insert a Yubikey, it proposes to install the software
513 needed to control it; when you insert a braille reader list it
514 proposes to install the packages needed to send text to the reader;
515 and when you insert a ColorHug screen calibrator it suggests to
516 install the driver for it. The system work well, and even have a few
517 command line tools to install firmware packages and packages for the
518 hardware already in the machine (as opposed to hotpluggable hardware).
</p>
520 <p>The system was initially written using aptdaemon, because I found
521 good documentation and example code on how to use it. But aptdaemon
522 is going away and is generally being replaced by
523 <a href=
"http://www.freedesktop.org/software/PackageKit/">PackageKit
</a>,
524 so Isenkram needed a rewrite. And today, thanks to the great patch
525 from my college Sunil Mohan Adapa in the FreedomBox project, the
526 rewrite finally took place. I've just uploaded a new version of
527 Isenkram into Debian Unstable with the patch included, and the default
528 for the background daemon is now to use PackageKit. To check it out,
529 install the
<tt>isenkram
</tt> package and insert some hardware dongle
530 and see if it is recognised.
</p>
532 <p>If you want to know what kind of packages isenkram would propose for
533 the machine it is running on, you can check out the isenkram-lookup
534 program. This is what it look like on a Thinkpad X230:
</p>
552 </pre></blockquote></p>
554 <p>The hardware mappings come from several places. The preferred way
555 is for packages to announce their hardware support using
556 <a href=
"https://www.freedesktop.org/software/appstream/docs/">the
557 cross distribution appstream system
</a>.
559 <a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram/">previous
560 blog posts about isenkram
</a> to learn how to do that.
</p>
566 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>.
571 <div class=
"padding"></div>
575 <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>
581 <p>Around three years ago, I created
582 <a href=
"http://packages.qa.debian.org/isenkram">the isenkram
583 system
</a> to get a more practical solution in Debian for handing
584 hardware related packages. A GUI system in the isenkram package will
585 present a pop-up dialog when some hardware dongle supported by
586 relevant packages in Debian is inserted into the machine. The same
587 lookup mechanism to detect packages is available as command line
588 tools in the isenkram-cli package. In addition to mapping hardware,
589 it will also map kernel firmware files to packages and make it easy to
590 install needed firmware packages automatically. The key for this
591 system to work is a good way to map hardware to packages, in other
592 words, allow packages to announce what hardware they will work
595 <p>I started by providing data files in the isenkram source, and
596 adding code to download the latest version of these data files at run
597 time, to ensure every user had the most up to date mapping available.
598 I also added support for storing the mapping in the Packages file in
599 the apt repositories, but did not push this approach because while I
600 was trying to figure out how to best store hardware/package mappings,
601 <a href=
"http://www.freedesktop.org/software/appstream/docs/">the
602 appstream system
</a> was announced. I got in touch and suggested to
603 add the hardware mapping into that data set to be able to use
604 appstream as a data source, and this was accepted at least for the
605 Debian version of appstream.
</p>
607 <p>A few days ago using appstream in Debian for this became possible,
608 and today I uploaded a new version
0.20 of isenkram adding support for
609 appstream as a data source for mapping hardware to packages. The only
610 package so far using appstream to announce its hardware support is my
611 pymissile package. I got help from Matthias Klumpp with figuring out
612 how do add the required
613 <a href=
"https://appstream.debian.org/html/sid/main/metainfo/pymissile.html">metadata
614 in pymissile
</a>. I added a file debian/pymissile.metainfo.xml with
618 <?xml
version="
1.0"
encoding="UTF-
8"?
>
620 <id
>pymissile
</id
>
621 <metadata_license
>MIT
</metadata_license
>
622 <name
>pymissile
</name
>
623 <summary
>Control original Striker USB Missile Launcher
</summary
>
626 Pymissile provides a curses interface to control an original
627 Marks and Spencer / Striker USB Missile Launcher, as well as a
628 motion control script to allow a webcamera to control the
633 <modalias
>usb:v1130p0202d*
</modalias
>
638 <p>The key for isenkram is the component/provides/modalias value,
639 which is a glob style match rule for hardware specific strings
640 (modalias strings) provided by the Linux kernel. In this case, it
641 will map to all USB devices with vendor code
1130 and product code
644 <p>Note, it is important that the license of all the metadata files
645 are compatible to have permissions to aggregate them into archive wide
646 appstream files. Matthias suggested to use MIT or BSD licenses for
647 these files. A challenge is figuring out a good id for the data, as
648 it is supposed to be globally unique and shared across distributions
649 (in other words, best to coordinate with upstream what to use). But
650 it can be changed later or, so we went with the package name as
651 upstream for this project is dormant.
</p>
653 <p>To get the metadata file installed in the correct location for the
654 mirror update scripts to pick it up and include its content the
655 appstream data source, the file must be installed in the binary
656 package under /usr/share/appdata/. I did this by adding the following
657 line to debian/pymissile.install:
</p>
660 debian/pymissile.metainfo.xml usr/share/appdata
663 <p>With that in place, the command line tool isenkram-lookup will list
664 all packages useful on the current computer automatically, and the GUI
665 pop-up handler will propose to install the package not already
666 installed if a hardware dongle is inserted into the machine in
669 <p>Details of the modalias field in appstream is available from the
670 <a href=
"https://wiki.debian.org/DEP-11">DEP-
11</a> proposal.
</p>
672 <p>To locate the modalias values of all hardware present in a machine,
673 try running this command on the command line:
</p>
676 cat $(find /sys/devices/|grep modalias)
679 <p>To learn more about the isenkram system, please check out
680 <a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram/">my
681 blog posts tagged isenkram
</a>.
</p>
687 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>.
692 <div class=
"padding"></div>
696 <a href=
"http://people.skolelinux.org/pere/blog/Debian_Jessie__PXE_and_automatic_firmware_installation.html">Debian Jessie, PXE and automatic firmware installation
</a>
702 <p>When PXE installing laptops with Debian, I often run into the
703 problem that the WiFi card require some firmware to work properly.
704 And it has been a pain to fix this using preseeding in Debian.
705 Normally something more is needed. But thanks to
706 <a href=
"https://packages.qa.debian.org/i/isenkram.html">my isenkram
707 package
</a> and its recent tasksel extension, it has now become easy
708 to do this using simple preseeding.
</p>
710 <p>The isenkram-cli package provide tasksel tasks which will install
711 firmware for the hardware found in the machine (actually, requested by
712 the kernel modules for the hardware). (It can also install user space
713 programs supporting the hardware detected, but that is not the focus
716 <p>To get this working in the default installation, two preeseding
717 values are needed. First, the isenkram-cli package must be installed
718 into the target chroot (aka the hard drive) before tasksel is executed
719 in the pkgsel step of the debian-installer system. This is done by
720 preseeding the base-installer/includes debconf value to include the
721 isenkram-cli package. The package name is next passed to debootstrap
722 for installation. With the isenkram-cli package in place, tasksel
723 will automatically use the isenkram tasks to detect hardware specific
724 packages for the machine being installed and install them, because
725 isenkram-cli contain tasksel tasks.
</p>
727 <p>Second, one need to enable the non-free APT repository, because
728 most firmware unfortunately is non-free. This is done by preseeding
729 the apt-mirror-setup step. This is unfortunate, but for a lot of
730 hardware it is the only option in Debian.
</p>
732 <p>The end result is two lines needed in your preseeding file to get
733 firmware installed automatically by the installer:
</p>
736 base-installer base-installer/includes string isenkram-cli
737 apt-mirror-setup apt-setup/non-free boolean true
738 </pre></blockquote></p>
740 <p>The current version of isenkram-cli in testing/jessie will install
741 both firmware and user space packages when using this method. It also
742 do not work well, so use version
0.15 or later. Installing both
743 firmware and user space packages might give you a bit more than you
744 want, so I decided to split the tasksel task in two, one for firmware
745 and one for user space programs. The firmware task is enabled by
746 default, while the one for user space programs is not. This split is
747 implemented in the package currently in unstable.
</p>
749 <p>If you decide to give this a go, please let me know (via email) how
750 this recipe work for you. :)
</p>
752 <p>So, I bet you are wondering, how can this work. First and
753 foremost, it work because tasksel is modular, and driven by whatever
754 files it find in /usr/lib/tasksel/ and /usr/share/tasksel/. So the
755 isenkram-cli package place two files for tasksel to find. First there
756 is the task description file (/usr/share/tasksel/descs/isenkram.desc):
</p>
759 Task: isenkram-packages
761 Description: Hardware specific packages (autodetected by isenkram)
762 Based on the detected hardware various hardware specific packages are
764 Test-new-install: show show
766 Packages: for-current-hardware
768 Task: isenkram-firmware
770 Description: Hardware specific firmware packages (autodetected by isenkram)
771 Based on the detected hardware various hardware specific firmware
772 packages are proposed.
773 Test-new-install: mark show
775 Packages: for-current-hardware-firmware
776 </pre></blockquote></p>
778 <p>The key parts are Test-new-install which indicate how the task
779 should be handled and the Packages line referencing to a script in
780 /usr/lib/tasksel/packages/. The scripts use other scripts to get a
781 list of packages to install. The for-current-hardware-firmware script
782 look like this to list relevant firmware for the machine:
789 isenkram-autoinstall-firmware -l
790 </pre></blockquote></p>
792 <p>With those two pieces in place, the firmware is installed by
793 tasksel during the normal d-i run. :)
</p>
795 <p>If you want to test what tasksel will install when isenkram-cli is
796 installed, run
<tt>DEBIAN_PRIORITY=critical tasksel --test
797 --new-install
</tt> to get the list of packages that tasksel would
800 <p><a href=
"https://wiki.debian.org/DebianEdu/">Debian Edu
</a> will be
801 pilots in testing this feature, as isenkram is used there now to
802 install firmware, replacing the earlier scripts.
</p>
808 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>.
813 <div class=
"padding"></div>
817 <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>
823 <p>It would be nice if it was easier in Debian to get all the hardware
824 related packages relevant for the computer installed automatically.
825 So I implemented one, using
826 <a href=
"http://packages.qa.debian.org/isenkram">my Isenkram
827 package
</a>. To use it, install the tasksel and isenkram packages and
828 run tasksel as user root. You should be presented with a new option,
829 "Hardware specific packages (autodetected by isenkram)". When you
830 select it, tasksel will install the packages isenkram claim is fit for
831 the current hardware, hot pluggable or not.
<p>
833 <p>The implementation is in two files, one is the tasksel menu entry
834 description, and the other is the script used to extract the list of
835 packages to install. The first part is in
836 <tt>/usr/share/tasksel/descs/isenkram.desc
</tt> and look like
842 Description: Hardware specific packages (autodetected by isenkram)
843 Based on the detected hardware various hardware specific packages are
845 Test-new-install: mark show
847 Packages: for-current-hardware
848 </pre></blockquote></p>
850 <p>The second part is in
851 <tt>/usr/lib/tasksel/packages/for-current-hardware
</tt> and look like
859 isenkram-autoinstall-firmware -l
861 </pre></blockquote></p>
863 <p>All in all, a very short and simple implementation making it
864 trivial to install the hardware dependent package we all may want to
865 have installed on our machines. I've not been able to find a way to
866 get tasksel to tell you exactly which packages it plan to install
867 before doing the installation. So if you are curious or careful,
868 check the output from the isenkram-* command line tools first.
</p>
870 <p>The information about which packages are handling which hardware is
871 fetched either from the isenkram package itself in
872 /usr/share/isenkram/, from git.debian.org or from the APT package
873 database (using the Modaliases header). The APT package database
874 parsing have caused a nasty resource leak in the isenkram daemon (bugs
875 <a href=
"http://bugs.debian.org/719837">#
719837</a> and
876 <a href=
"http://bugs.debian.org/730704">#
730704</a>). The cause is in
877 the python-apt code (bug
878 <a href=
"http://bugs.debian.org/745487">#
745487</a>), but using a
879 workaround I was able to get rid of the file descriptor leak and
880 reduce the memory leak from ~
30 MiB per hardware detection down to
881 around
2 MiB per hardware detection. It should make the desktop
882 daemon a lot more useful. The fix is in version
0.7 uploaded to
885 <p>I believe the current way of mapping hardware to packages in
886 Isenkram is is a good draft, but in the future I expect isenkram to
887 use the AppStream data source for this. A proposal for getting proper
888 AppStream support into Debian is floating around as
889 <a href=
"https://wiki.debian.org/DEP-11">DEP-
11</a>, and
890 <a href=
"https://wiki.debian.org/SummerOfCode2014/Projects#SummerOfCode2014.2FProjects.2FAppStreamDEP11Implementation.AppStream.2FDEP-11_for_the_Debian_Archive">GSoC
891 project
</a> will take place this summer to improve the situation. I
892 look forward to seeing the result, and welcome patches for isenkram to
893 start using the information when it is ready.
</p>
895 <p>If you want your package to map to some specific hardware, either
896 add a "Xb-Modaliases" header to your control file like I did in
897 <a href=
"http://packages.qa.debian.org/pymissile">the pymissile
898 package
</a> or submit a bug report with the details to the isenkram
900 <a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram/">all my
901 blog posts tagged isenkram
</a> for details on the notation. I expect
902 the information will be migrated to AppStream eventually, but for the
903 moment I got no better place to store it.
</p>
909 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>.
914 <div class=
"padding"></div>
918 <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>
924 <p>It annoys me when the computer fail to do automatically what it is
925 perfectly capable of, and I have to do it manually to get things
926 working. One such task is to find out what firmware packages are
927 needed to get the hardware on my computer working. Most often this
928 affect the wifi card, but some times it even affect the RAID
929 controller or the ethernet card. Today I pushed version
0.4 of the
930 <a href=
"http://packages.qa.debian.org/isenkram">Isenkram package
</a>
931 including a new script isenkram-autoinstall-firmware handling the
932 process of asking all the loaded kernel modules what firmware files
933 they want, find debian packages providing these files and install the
934 debian packages. Here is a test run on my laptop:
</p>
937 # isenkram-autoinstall-firmware
938 info: kernel drivers requested extra firmware: ipw2200-bss.fw ipw2200-ibss.fw ipw2200-sniffer.fw
939 info: fetching http://http.debian.net/debian/dists/squeeze/Contents-i386.gz
940 info: locating packages with the requested firmware files
941 info: Updating APT sources after adding non-free APT source
942 info: trying to install firmware-ipw2x00
945 Preconfiguring packages ...
946 Selecting previously deselected package firmware-ipw2x00.
947 (Reading database ...
259727 files and directories currently installed.)
948 Unpacking firmware-ipw2x00 (from .../firmware-ipw2x00_0.28+squeeze1_all.deb) ...
949 Setting up firmware-ipw2x00 (
0.28+squeeze1) ...
953 <p>When all the requested firmware is present, a simple message is
957 # isenkram-autoinstall-firmware
958 info: did not find any firmware files requested by loaded kernel modules. exiting
962 <p>It could use some polish, but it is already working well and saving
963 me some time when setting up new machines. :)
</p>
965 <p>So, how does it work? It look at the set of currently loaded
966 kernel modules, and look up each one of them using modinfo, to find
967 the firmware files listed in the module meta-information. Next, it
968 download the Contents file from a nearby APT mirror, and search for
969 the firmware files in this file to locate the package with the
970 requested firmware file. If the package is in the non-free section, a
971 non-free APT source is added and the package is installed using
972 <tt>apt-get install
</tt>. The end result is a slightly better working
975 <p>I hope someone find time to implement a more polished version of
976 this script as part of the hw-detect debian-installer module, to
977 finally fix
<a href=
"http://bugs.debian.org/655507">BTS report
978 #
655507</a>. There really is no need to insert USB sticks with
979 firmware during a PXE install when the packages already are available
980 from the nearby Debian mirror.
</p>
986 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>.
991 <div class=
"padding"></div>
995 <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>
1001 <p>Today the
<a href=
"http://packages.qa.debian.org/isenkram">Isenkram
1002 package
</a> finally made it into the archive, after lingering in NEW
1003 for many months. I uploaded it to the Debian experimental suite
1004 2013-
01-
27, and today it was accepted into the archive.
</p>
1006 <p>Isenkram is a system for suggesting to users what packages to
1007 install to work with a pluggable hardware device. The suggestion pop
1008 up when the device is plugged in. For example if a Lego Mindstorm NXT
1009 is inserted, it will suggest to install the program needed to program
1010 the NXT controller. Give it a go, and report bugs and suggestions to
1017 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>.
1022 <div class=
"padding"></div>
1026 <a href=
"http://people.skolelinux.org/pere/blog/Welcome_to_the_world__Isenkram_.html">Welcome to the world, Isenkram!
</a>
1033 <a href=
"http://people.skolelinux.org/pere/blog/First_prototype_ready_making_hardware_easier_to_use_in_Debian.html">asked
1034 for testers
</a> for my prototype for making Debian better at handling
1035 pluggable hardware devices, which I
1036 <a href=
"http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">set
1037 out to create
</a> earlier this month. Several valuable testers showed
1038 up, and caused me to really want to to open up the development to more
1039 people. But before I did this, I want to come up with a sensible name
1040 for this project. Today I finally decided on a new name, and I have
1041 renamed the project from hw-support-handler to this new name. In the
1042 process, I moved the source to git and made it available as a
1043 <a href=
"http://anonscm.debian.org/gitweb/?p=collab-maint/isenkram.git">collab-maint
</a>
1044 repository in Debian. The new name? It is
<strong>Isenkram
</strong>.
1045 To fetch and build the latest version of the source, use
</p>
1048 git clone http://anonscm.debian.org/git/collab-maint/isenkram.git
1049 cd isenkram && git-buildpackage -us -uc
1052 <p>I have not yet adjusted all files to use the new name yet. If you
1053 want to hack on the source or improve the package, please go ahead.
1054 But please talk to me first on IRC or via email before you do major
1055 changes, to make sure we do not step on each others toes. :)
</p>
1057 <p>If you wonder what 'isenkram' is, it is a Norwegian word for iron
1058 stuff, typically meaning tools, nails, screws, etc. Typical hardware
1059 stuff, in other words. I've been told it is the Norwegian variant of
1060 the German word eisenkram, for those that are familiar with that
1063 <p><strong>Update
2013-
01-
26</strong>: Added -us -us to build
1064 instructions, to avoid confusing people with an error from the signing
1067 <p><strong>Update
2013-
01-
27</strong>: Switch to HTTP URL for the git
1068 clone argument to avoid the need for authentication.
</p>
1074 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>.
1079 <div class=
"padding"></div>
1083 <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>
1089 <p>Early this month I set out to try to
1090 <a href=
"http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">improve
1091 the Debian support for pluggable hardware devices
</a>. Now my
1092 prototype is working, and it is ready for a larger audience. To test
1094 <a href=
"http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/">source
1095 from the Debian Edu subversion repository
</a>, build and install the
1096 package. You might have to log out and in again activate the
1097 autostart script.
</p>
1099 <p>The design is simple:
</p>
1103 <li>Add desktop entry in /usr/share/autostart/ causing a program
1104 hw-support-handlerd to start when the user log in.
</li>
1106 <li>This program listen for kernel events about new hardware (directly
1107 from the kernel like udev does), not using HAL dbus events as I
1110 <li>When new hardware is inserted, look up the hardware modalias in
1111 the APT database, a database
1112 <a href=
"http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/modaliases?view=markup">available
1113 via HTTP
</a> and a database available as part of the package.
</li>
1115 <li>If a package is mapped to the hardware in question, the package
1116 isn't installed yet and this is the first time the hardware was
1117 plugged in, show a desktop notification suggesting to install the
1118 package or packages.
</li>
1120 <li>If the user click on the 'install package now' button, ask
1121 aptdaemon via the PackageKit API to install the requrired package.
</li>
1123 <li>aptdaemon ask for root password or sudo password, and install the
1124 package while showing progress information in a window.
</li>
1128 <p>I still need to come up with a better name for the system. Here
1129 are some screen shots showing the prototype in action. First the
1130 notification, then the password request, and finally the request to
1131 approve all the dependencies. Sorry for the Norwegian Bokmål GUI.
</p>
1133 <p><img src=
"http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-1-notification.png">
1134 <br><img src=
"http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-2-password.png">
1135 <br><img src=
"http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-3-dependencies.png">
1136 <br><img src=
"http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-4-installing.png">
1137 <br><img src=
"http://people.skolelinux.org/pere/blog/images/2013-01-21-hw-support-5-installing-details.png" width=
"70%"></p>
1139 <p>The prototype still need to be improved with longer timeouts, but
1140 is already useful. The database of hardware to package mappings also
1141 need more work. It is currently compatible with the Ubuntu way of
1142 storing such information in the package control file, but could be
1143 changed to use other formats instead or in addition to the current
1144 method. I've dropped the use of discover for this mapping, as the
1145 modalias approach is more flexible and easier to use on Linux as long
1146 as the Linux kernel expose its modalias strings directly.
</p>
1148 <p><strong>Update
2013-
01-
21 16:
50</strong>: Due to popular demand,
1149 here is the command required to check out and build the source: Use
1151 svn://svn.debian.org/debian-edu/trunk/src/hw-support-handler/; cd
1152 hw-support-handler; debuild
</tt>'. If you lack debuild, install the
1153 devscripts package.
</p>
1155 <p><strong>Update
2013-
01-
23 12:
00</strong>: The project is now
1156 renamed to Isenkram and the source moved from the Debian Edu
1157 subversion repository to a Debian collab-maint git repository. See
1158 <a href=
"http://people.skolelinux.org/pere/blog/Welcome_to_the_world__Isenkram_.html">build
1159 instructions
</a> for details.
</p>
1165 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>.
1170 <div class=
"padding"></div>
1174 <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>
1180 <p>Yesterday, I wrote about the
1181 <a href=
"http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html">modalias
1182 values provided by the Linux kernel
</a> following my hope for
1183 <a href=
"http://people.skolelinux.org/pere/blog/Lets_make_hardware_dongles_easier_to_use_in_Debian.html">better
1184 dongle support in Debian
</a>. Using this knowledge, I have tested how
1185 modalias values attached to package names can be used to map packages
1186 to hardware. This allow the system to look up and suggest relevant
1187 packages when I plug in some new hardware into my machine, and replace
1188 discover and discover-data as the database used to map hardware to
1191 <p>I create a modaliases file with entries like the following,
1192 containing package name, kernel module name (if relevant, otherwise
1193 the package name) and globs matching the relevant hardware
1197 Package: package-name
1198 <br>Modaliases: module(modaliasglob, modaliasglob, modaliasglob)
</p>
1201 <p>It is fairly trivial to write code to find the relevant packages
1202 for a given modalias value using this file.
</p>
1204 <p>An entry like this would suggest the video and picture application
1205 cheese for many USB web cameras (interface bus class
0E01):
</p>
1209 <br>Modaliases: cheese(usb:v*p*d*dc*dsc*dp*ic0Eisc01ip*)
</p>
1212 <p>An entry like this would suggest the pcmciautils package when a
1213 CardBus bridge (bus class
0607) PCI device is present:
</p>
1216 Package: pcmciautils
1217 <br>Modaliases: pcmciautils(pci:v*d*sv*sd*bc06sc07i*)
1220 <p>An entry like this would suggest the package colorhug-client when
1221 plugging in a ColorHug with USB IDs
04D8:F8DA:
</p>
1224 Package: colorhug-client
1225 <br>Modaliases: colorhug-client(usb:v04D8pF8DAd*)
</p>
1228 <p>I believe the format is compatible with the format of the Packages
1229 file in the Debian archive. Ubuntu already uses their Packages file
1230 to store their mappings from packages to hardware.
</p>
1232 <p>By adding a XB-Modaliases: header in debian/control, any .deb can
1233 announce the hardware it support in a way my prototype understand.
1234 This allow those publishing packages in an APT source outside the
1235 Debian archive as well as those backporting packages to make sure the
1236 hardware mapping are included in the package meta information. I've
1237 tested such header in the pymissile package, and its modalias mapping
1238 is working as it should with my prototype. It even made it to Ubuntu
1241 <p>To test if it was possible to look up supported hardware using only
1242 the shell tools available in the Debian installer, I wrote a shell
1243 implementation of the lookup code. The idea is to create files for
1244 each modalias and let the shell do the matching. Please check out and
1246 <a href=
"http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/hw-support-lookup?view=co">hw-support-lookup
</a>
1247 shell script. It run without any extra dependencies and fetch the
1248 hardware mappings from the Debian archive and the subversion
1249 repository where I currently work on my prototype.
</p>
1251 <p>When I use it on a machine with a yubikey inserted, it suggest to
1252 install yubikey-personalization:
</p>
1255 % ./hw-support-lookup
1256 <br>yubikey-personalization
1260 <p>When I run it on my Thinkpad X40 with a PCMCIA/CardBus slot, it
1261 propose to install the pcmciautils package:
</p>
1264 % ./hw-support-lookup
1269 <p>If you know of any hardware-package mapping that should be added to
1270 <a href=
"http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/modaliases?view=co">my
1271 database
</a>, please tell me about it.
</p>
1273 <p>It could be possible to generate several of the mappings between
1274 packages and hardware. One source would be to look at packages with
1275 kernel modules, ie packages with *.ko files in /lib/modules/, and
1276 extract their modalias information. Another would be to look at
1277 packages with udev rules, ie packages with files in
1278 /lib/udev/rules.d/, and extract their vendor/model information to
1279 generate a modalias matching rule. I have not tested any of these to
1282 <p>If you want to help implementing a system to let us propose what
1283 packages to install when new hardware is plugged into a Debian
1284 machine, please send me an email or talk to me on
1285 <a href=
"irc://irc.debian.org/%23debian-devel">#debian-devel
</a>.
</p>
1291 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>.
1296 <div class=
"padding"></div>
1300 <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>
1306 <p>While looking into how to look up Debian packages based on hardware
1307 information, to find the packages that support a given piece of
1308 hardware, I refreshed my memory regarding modalias values, and decided
1309 to document the details. Here are my findings so far, also available
1311 <a href=
"http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/">the
1312 Debian Edu subversion repository
</a>:
1314 <p><strong>Modalias decoded
</strong></p>
1316 <p>This document try to explain what the different types of modalias
1317 values stands for. It is in part based on information from
1318 <URL:
<a href=
"https://wiki.archlinux.org/index.php/Modalias">https://wiki.archlinux.org/index.php/Modalias
</a> >,
1319 <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> >,
1320 <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> > and
1321 <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> >.
1323 <p>The modalias entries for a given Linux machine can be found using
1324 this shell script:
</p>
1327 find /sys -name modalias -print0 | xargs -
0 cat | sort -u
1330 <p>The supported modalias globs for a given kernel module can be found
1334 % /sbin/modinfo psmouse | grep alias:
1335 alias: serio:ty05pr*id*ex*
1336 alias: serio:ty01pr*id*ex*
1340 <p><strong>PCI subtype
</strong></p>
1342 <p>A typical PCI entry can look like this. This is an Intel Host
1343 Bridge memory controller:
</p>
1346 pci:v00008086d00002770sv00001028sd000001ADbc06sc00i00
1349 <p>This represent these values:
</p>
1354 sv
00001028 (subvendor)
1355 sd
000001AD (subdevice)
1357 sc
00 (bus subclass)
1361 <p>The vendor/device values are the same values outputted from 'lspci
1362 -n' as
8086:
2770. The bus class/subclass is also shown by lspci as
1363 0600. The
0600 class is a host bridge. Other useful bus values are
1364 0300 (VGA compatible card) and
0200 (Ethernet controller).
</p>
1366 <p>Not sure how to figure out the interface value, nor what it
1369 <p><strong>USB subtype
</strong></p>
1371 <p>Some typical USB entries can look like this. This is an internal
1372 USB hub in a laptop:
</p>
1375 usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
1378 <p>Here is the values included in this alias:
</p>
1381 v
1D6B (device vendor)
1382 p
0001 (device product)
1384 dc
09 (device class)
1385 dsc
00 (device subclass)
1386 dp
00 (device protocol)
1387 ic
09 (interface class)
1388 isc
00 (interface subclass)
1389 ip
00 (interface protocol)
1392 <p>The
0900 device class/subclass means hub. Some times the relevant
1393 class is in the interface class section. For a simple USB web camera,
1394 these alias entries show up:
</p>
1397 usb:v0AC8p3420d5000dcEFdsc02dp01ic01isc01ip00
1398 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic01isc02ip00
1399 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic0Eisc01ip00
1400 <br>usb:v0AC8p3420d5000dcEFdsc02dp01ic0Eisc02ip00
1403 <p>Interface class
0E01 is video control,
0E02 is video streaming (aka
1404 camera),
0101 is audio control device and
0102 is audio streaming (aka
1405 microphone). Thus this is a camera with microphone included.
</p>
1407 <p><strong>ACPI subtype
</strong></p>
1409 <p>The ACPI type is used for several non-PCI/USB stuff. This is an IR
1410 receiver in a Thinkpad X40:
</p>
1413 acpi:IBM0071:PNP0511:
1416 <p>The values between the colons are IDs.
</p>
1418 <p><strong>DMI subtype
</strong></p>
1420 <p>The DMI table contain lots of information about the computer case
1421 and model. This is an entry for a IBM Thinkpad X40, fetched from
1422 /sys/devices/virtual/dmi/id/modalias:
</p>
1425 dmi:bvnIBM:bvr1UETB6WW(
1.66):bd06/
15/
2005:svnIBM:pn2371H4G:pvrThinkPadX40:rvnIBM:rn2371H4G:rvrNotAvailable:cvnIBM:ct10:cvrNotAvailable:
1428 <p>The values present are
</p>
1431 bvn IBM (BIOS vendor)
1432 bvr
1UETB
6WW(
1.66) (BIOS version)
1433 bd
06/
15/
2005 (BIOS date)
1434 svn IBM (system vendor)
1435 pn
2371H4G (product name)
1436 pvr ThinkPadX40 (product version)
1437 rvn IBM (board vendor)
1438 rn
2371H4G (board name)
1439 rvr NotAvailable (board version)
1440 cvn IBM (chassis vendor)
1441 ct
10 (chassis type)
1442 cvr NotAvailable (chassis version)
1445 <p>The chassis type
10 is Notebook. Other interesting values can be
1446 found in the dmidecode source:
</p>
1450 4 Low Profile Desktop
1463 17 Main Server Chassis
1464 18 Expansion Chassis
1466 20 Bus Expansion Chassis
1467 21 Peripheral Chassis
1469 23 Rack Mount Chassis
1478 <p>The chassis type values are not always accurately set in the DMI
1479 table. For example my home server is a tower, but the DMI modalias
1480 claim it is a desktop.
</p>
1482 <p><strong>SerIO subtype
</strong></p>
1484 <p>This type is used for PS/
2 mouse plugs. One example is from my
1488 serio:ty01pr00id00ex00
1491 <p>The values present are
</p>
1500 <p>This type is supported by the psmouse driver. I am not sure what
1501 the valid values are.
</p>
1503 <p><strong>Other subtypes
</strong></p>
1505 <p>There are heaps of other modalias subtypes according to
1506 file2alias.c. There is the rest of the list from that source: amba,
1507 ap, bcma, ccw, css, eisa, hid, i2c, ieee1394, input, ipack, isapnp,
1508 mdio, of, parisc, pcmcia, platform, scsi, sdio, spi, ssb, vio, virtio,
1509 vmbus, x86cpu and zorro. I did not spend time documenting all of
1510 these, as they do not seem relevant for my intended use with mapping
1511 hardware to packages when new stuff is inserted during run time.
</p>
1513 <p><strong>Looking up kernel modules using modalias values
</strong></p>
1515 <p>To check which kernel modules provide support for a given modalias,
1516 one can use the following shell script:
</p>
1519 for id in $(find /sys -name modalias -print0 | xargs -
0 cat | sort -u); do \
1521 /sbin/modprobe --show-depends "$id"|sed 's/^/ /' ; \
1525 <p>The output can look like this (only the first few entries as the
1526 list is very long on my test machine):
</p>
1530 insmod /lib/modules/
2.6.32-
5-
686/kernel/drivers/acpi/ac.ko
1532 FATAL: Module acpi:device: not found.
1534 insmod /lib/modules/
2.6.32-
5-
686/kernel/drivers/char/nvram.ko
1535 insmod /lib/modules/
2.6.32-
5-
686/kernel/drivers/leds/led-class.ko
1536 insmod /lib/modules/
2.6.32-
5-
686/kernel/net/rfkill/rfkill.ko
1537 insmod /lib/modules/
2.6.32-
5-
686/kernel/drivers/platform/x86/thinkpad_acpi.ko
1538 acpi:IBM0071:PNP0511:
1539 insmod /lib/modules/
2.6.32-
5-
686/kernel/lib/crc-ccitt.ko
1540 insmod /lib/modules/
2.6.32-
5-
686/kernel/net/irda/irda.ko
1541 insmod /lib/modules/
2.6.32-
5-
686/kernel/drivers/net/irda/nsc-ircc.ko
1545 <p>If you want to help implementing a system to let us propose what
1546 packages to install when new hardware is plugged into a Debian
1547 machine, please send me an email or talk to me on
1548 <a href=
"irc://irc.debian.org/%23debian-devel">#debian-devel
</a>.
</p>
1550 <p><strong>Update
2013-
01-
15:
</strong> Rewrite "cat $(find ...)" to
1551 "find ... -print0 | xargs -
0 cat" to make sure it handle directories
1552 in /sys/ with space in them.
</p>
1558 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>.
1563 <div class=
"padding"></div>
1567 <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>
1573 <p>As part of my investigation on how to improve the support in Debian
1574 for hardware dongles, I dug up my old Mark and Spencer USB Rocket
1575 Launcher and updated the Debian package
1576 <a href=
"http://packages.qa.debian.org/pymissile">pymissile
</a> to make
1577 sure udev will fix the device permissions when it is plugged in. I
1578 also added a "Modaliases" header to test it in the Debian archive and
1579 hopefully make the package be proposed by jockey in Ubuntu when a user
1580 plug in his rocket launcher. In the process I moved the source to a
1581 git repository under collab-maint, to make it easier for any DD to
1582 contribute.
<a href=
"http://code.google.com/p/pymissile/">Upstream
</a>
1583 is not very active, but the software still work for me even after five
1584 years of relative silence. The new git repository is not listed in
1585 the uploaded package yet, because I want to test the other changes a
1586 bit more before I upload the new version. If you want to check out
1587 the new version with a .desktop file included, visit the
1588 <a href=
"http://anonscm.debian.org/gitweb/?p=collab-maint/pymissile.git">gitweb
1589 view
</a> or use "
<tt>git clone
1590 git://anonscm.debian.org/collab-maint/pymissile.git
</tt>".</p>
1596 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>.
1601 <div class="padding
"></div>
1605 <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>
1611 <p>One thing that annoys me with Debian and Linux distributions in
1612 general, is that there is a great package management system with the
1613 ability to automatically install software packages by downloading them
1614 from the distribution mirrors, but no way to get it to automatically
1615 install the packages I need to use the hardware I plug into my
1616 machine. Even if the package to use it is easily available from the
1617 Linux distribution. When I plug in a LEGO Mindstorms NXT, it could
1618 suggest to automatically install the python-nxt, nbc and t2n packages
1619 I need to talk to it. When I plug in a Yubikey, it could propose the
1620 yubikey-personalization package. The information required to do this
1621 is available, but no-one have pulled all the pieces together.</p>
1623 <p>Some years ago, I proposed to
1624 <a href="http://lists.debian.org/debian-devel/
2010/
05/msg01206.html
">use
1625 the discover subsystem to implement this</a>. The idea is fairly
1630 <li>Add a desktop entry in /usr/share/autostart/ pointing to a program
1631 starting when a user log in.</li>
1633 <li>Set this program up to listen for kernel events emitted when new
1634 hardware is inserted into the computer.</li>
1636 <li>When new hardware is inserted, look up the hardware ID in a
1637 database mapping to packages, and take note of any non-installed
1640 <li>Show a message to the user proposing to install the discovered
1641 package, and make it easy to install it.</li>
1645 <p>I am not sure what the best way to implement this is, but my
1646 initial idea was to use dbus events to discover new hardware, the
1647 discover database to find packages and
1648 <a href="http://www.packagekit.org/
">PackageKit</a> to install
1651 <p>Yesterday, I found time to try to implement this idea, and the
1652 draft package is now checked into
1653 <a href="http://anonscm.debian.org/viewvc/debian-edu/trunk/src/hw-support-handler/
">the
1654 Debian Edu subversion repository</a>. In the process, I updated the
1655 <a href="http://packages.qa.debian.org/d/discover-data.html
">discover-data</a>
1656 package to map the USB ids of LEGO Mindstorms and Yubikey devices to
1657 the relevant packages in Debian, and uploaded a new version
1658 2.2013.01.09 to unstable. I also discovered that the current
1659 <a href="http://packages.qa.debian.org/d/discover.html
">discover</a>
1660 package in Debian no longer discovered any USB devices, because
1661 /proc/bus/usb/devices is no longer present. I ported it to use
1662 libusb as a fall back option to get it working. The fixed package
1663 version 2.1.2-6 is now in experimental (didn't upload it to unstable
1664 because of the freeze).</p>
1666 <p>With this prototype in place, I can insert my Yubikey, and get this
1667 desktop notification to show up (only once, the first time it is
1670 <p align="center
"><img src="http://people.skolelinux.org/pere/blog/images/
2013-
01-
09-hw-autoinstall.png
"></p>
1672 <p>For this prototype to be really useful, some way to automatically
1673 install the proposed packages by pressing the "Please install
1674 program(s)" button should to be implemented.
</p>
1676 <p>If this idea seem useful to you, and you want to help make it
1677 happen, please help me update the discover-data database with mappings
1678 from hardware to Debian packages. Check if 'discover-pkginstall -l'
1679 list the package you would like to have installed when a given
1680 hardware device is inserted into your computer, and report bugs using
1681 reportbug if it isn't. Or, if you know of a better way to provide
1682 such mapping, please let me know.
</p>
1684 <p>This prototype need more work, and there are several questions that
1685 should be considered before it is ready for production use. Is dbus
1686 the correct way to detect new hardware? At the moment I look for HAL
1687 dbus events on the system bus, because that is the events I could see
1688 on my Debian Squeeze KDE desktop. Are there better events to use?
1689 How should the user be notified? Is the desktop notification
1690 mechanism the best option, or should the background daemon raise a
1691 popup instead? How should packages be installed? When should they
1692 not be installed?
</p>
1694 <p>If you want to help getting such feature implemented in Debian,
1695 please send me an email. :)
</p>
1701 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>.
1706 <div class=
"padding"></div>
1708 <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>
1719 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2019/01/">January (
3)
</a></li>
1726 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/01/">January (
1)
</a></li>
1728 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/02/">February (
5)
</a></li>
1730 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/03/">March (
5)
</a></li>
1732 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/04/">April (
3)
</a></li>
1734 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/06/">June (
2)
</a></li>
1736 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/07/">July (
5)
</a></li>
1738 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/08/">August (
3)
</a></li>
1740 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/09/">September (
3)
</a></li>
1742 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/10/">October (
5)
</a></li>
1744 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/11/">November (
2)
</a></li>
1746 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2018/12/">December (
4)
</a></li>
1753 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/01/">January (
4)
</a></li>
1755 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/02/">February (
3)
</a></li>
1757 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/03/">March (
5)
</a></li>
1759 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/04/">April (
2)
</a></li>
1761 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/06/">June (
5)
</a></li>
1763 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/07/">July (
1)
</a></li>
1765 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/08/">August (
1)
</a></li>
1767 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/09/">September (
3)
</a></li>
1769 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/10/">October (
5)
</a></li>
1771 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/11/">November (
3)
</a></li>
1773 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2017/12/">December (
4)
</a></li>
1780 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/01/">January (
3)
</a></li>
1782 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/02/">February (
2)
</a></li>
1784 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/03/">March (
3)
</a></li>
1786 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/04/">April (
8)
</a></li>
1788 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/05/">May (
8)
</a></li>
1790 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/06/">June (
2)
</a></li>
1792 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/07/">July (
2)
</a></li>
1794 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/08/">August (
5)
</a></li>
1796 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/09/">September (
2)
</a></li>
1798 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/10/">October (
3)
</a></li>
1800 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/11/">November (
8)
</a></li>
1802 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2016/12/">December (
5)
</a></li>
1809 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/01/">January (
7)
</a></li>
1811 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/02/">February (
6)
</a></li>
1813 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/03/">March (
1)
</a></li>
1815 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/04/">April (
4)
</a></li>
1817 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/05/">May (
3)
</a></li>
1819 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/06/">June (
4)
</a></li>
1821 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/07/">July (
6)
</a></li>
1823 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/08/">August (
2)
</a></li>
1825 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/09/">September (
2)
</a></li>
1827 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/10/">October (
9)
</a></li>
1829 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/11/">November (
6)
</a></li>
1831 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2015/12/">December (
3)
</a></li>
1838 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/01/">January (
2)
</a></li>
1840 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/02/">February (
3)
</a></li>
1842 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/03/">March (
8)
</a></li>
1844 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/04/">April (
7)
</a></li>
1846 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/05/">May (
1)
</a></li>
1848 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/06/">June (
2)
</a></li>
1850 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/07/">July (
2)
</a></li>
1852 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/08/">August (
2)
</a></li>
1854 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/09/">September (
5)
</a></li>
1856 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/10/">October (
6)
</a></li>
1858 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/11/">November (
3)
</a></li>
1860 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2014/12/">December (
5)
</a></li>
1867 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/01/">January (
11)
</a></li>
1869 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/02/">February (
9)
</a></li>
1871 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/03/">March (
9)
</a></li>
1873 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/04/">April (
6)
</a></li>
1875 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/05/">May (
9)
</a></li>
1877 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/06/">June (
10)
</a></li>
1879 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/07/">July (
7)
</a></li>
1881 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/08/">August (
3)
</a></li>
1883 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/09/">September (
5)
</a></li>
1885 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/10/">October (
7)
</a></li>
1887 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/11/">November (
9)
</a></li>
1889 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2013/12/">December (
3)
</a></li>
1896 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/01/">January (
7)
</a></li>
1898 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/02/">February (
10)
</a></li>
1900 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/03/">March (
17)
</a></li>
1902 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/04/">April (
12)
</a></li>
1904 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/05/">May (
12)
</a></li>
1906 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/06/">June (
20)
</a></li>
1908 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/07/">July (
17)
</a></li>
1910 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/08/">August (
6)
</a></li>
1912 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/09/">September (
9)
</a></li>
1914 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/10/">October (
17)
</a></li>
1916 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/11/">November (
10)
</a></li>
1918 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2012/12/">December (
7)
</a></li>
1925 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/01/">January (
16)
</a></li>
1927 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/02/">February (
6)
</a></li>
1929 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/03/">March (
6)
</a></li>
1931 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/04/">April (
7)
</a></li>
1933 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/05/">May (
3)
</a></li>
1935 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/06/">June (
2)
</a></li>
1937 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/07/">July (
7)
</a></li>
1939 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/08/">August (
6)
</a></li>
1941 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/09/">September (
4)
</a></li>
1943 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/10/">October (
2)
</a></li>
1945 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/11/">November (
3)
</a></li>
1947 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2011/12/">December (
1)
</a></li>
1954 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/01/">January (
2)
</a></li>
1956 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/02/">February (
1)
</a></li>
1958 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/03/">March (
3)
</a></li>
1960 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/04/">April (
3)
</a></li>
1962 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/05/">May (
9)
</a></li>
1964 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/06/">June (
14)
</a></li>
1966 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/07/">July (
12)
</a></li>
1968 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/08/">August (
13)
</a></li>
1970 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/09/">September (
7)
</a></li>
1972 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/10/">October (
9)
</a></li>
1974 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/11/">November (
13)
</a></li>
1976 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2010/12/">December (
12)
</a></li>
1983 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/01/">January (
8)
</a></li>
1985 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/02/">February (
8)
</a></li>
1987 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/03/">March (
12)
</a></li>
1989 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/04/">April (
10)
</a></li>
1991 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/05/">May (
9)
</a></li>
1993 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/06/">June (
3)
</a></li>
1995 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/07/">July (
4)
</a></li>
1997 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/08/">August (
3)
</a></li>
1999 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/09/">September (
1)
</a></li>
2001 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/10/">October (
2)
</a></li>
2003 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/11/">November (
3)
</a></li>
2005 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2009/12/">December (
3)
</a></li>
2012 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/11/">November (
5)
</a></li>
2014 <li><a href=
"http://people.skolelinux.org/pere/blog/archive/2008/12/">December (
7)
</a></li>
2025 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/3d-printer">3d-printer (
16)
</a></li>
2027 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/amiga">amiga (
1)
</a></li>
2029 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/aros">aros (
1)
</a></li>
2031 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bankid">bankid (
4)
</a></li>
2033 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bitcoin">bitcoin (
10)
</a></li>
2035 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bootsystem">bootsystem (
17)
</a></li>
2037 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/bsa">bsa (
2)
</a></li>
2039 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/chrpath">chrpath (
2)
</a></li>
2041 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian">debian (
166)
</a></li>
2043 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian edu">debian edu (
158)
</a></li>
2045 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/debian-handbook">debian-handbook (
4)
</a></li>
2047 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/digistan">digistan (
10)
</a></li>
2049 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/dld">dld (
17)
</a></li>
2051 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/docbook">docbook (
25)
</a></li>
2053 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/drivstoffpriser">drivstoffpriser (
4)
</a></li>
2055 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/english">english (
397)
</a></li>
2057 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fiksgatami">fiksgatami (
23)
</a></li>
2059 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/fildeling">fildeling (
14)
</a></li>
2061 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freeculture">freeculture (
33)
</a></li>
2063 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/freedombox">freedombox (
9)
</a></li>
2065 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/frikanalen">frikanalen (
20)
</a></li>
2067 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/h264">h264 (
20)
</a></li>
2069 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/intervju">intervju (
42)
</a></li>
2071 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/isenkram">isenkram (
16)
</a></li>
2073 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/kart">kart (
20)
</a></li>
2075 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/kodi">kodi (
4)
</a></li>
2077 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ldap">ldap (
9)
</a></li>
2079 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/lego">lego (
4)
</a></li>
2081 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/lenker">lenker (
8)
</a></li>
2083 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/lsdvd">lsdvd (
2)
</a></li>
2085 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ltsp">ltsp (
1)
</a></li>
2087 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/mesh network">mesh network (
8)
</a></li>
2089 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/multimedia">multimedia (
42)
</a></li>
2091 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/nice free software">nice free software (
11)
</a></li>
2093 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/norsk">norsk (
301)
</a></li>
2095 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/nuug">nuug (
192)
</a></li>
2097 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/offentlig innsyn">offentlig innsyn (
34)
</a></li>
2099 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/open311">open311 (
2)
</a></li>
2101 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/opphavsrett">opphavsrett (
73)
</a></li>
2103 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/personvern">personvern (
108)
</a></li>
2105 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/raid">raid (
2)
</a></li>
2107 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/reactos">reactos (
1)
</a></li>
2109 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/reprap">reprap (
11)
</a></li>
2111 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rfid">rfid (
3)
</a></li>
2113 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/robot">robot (
11)
</a></li>
2115 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/rss">rss (
1)
</a></li>
2117 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/ruter">ruter (
6)
</a></li>
2119 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/scraperwiki">scraperwiki (
2)
</a></li>
2121 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sikkerhet">sikkerhet (
55)
</a></li>
2123 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sitesummary">sitesummary (
4)
</a></li>
2125 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/skepsis">skepsis (
5)
</a></li>
2127 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/standard">standard (
58)
</a></li>
2129 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stavekontroll">stavekontroll (
6)
</a></li>
2131 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/stortinget">stortinget (
12)
</a></li>
2133 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/surveillance">surveillance (
55)
</a></li>
2135 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/sysadmin">sysadmin (
4)
</a></li>
2137 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/usenix">usenix (
2)
</a></li>
2139 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/valg">valg (
9)
</a></li>
2141 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/verkidetfri">verkidetfri (
15)
</a></li>
2143 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/video">video (
73)
</a></li>
2145 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/vitenskap">vitenskap (
4)
</a></li>
2147 <li><a href=
"http://people.skolelinux.org/pere/blog/tags/web">web (
42)
</a></li>
2153 <p style=
"text-align: right">
2154 Created by
<a href=
"http://steve.org.uk/Software/chronicle">Chronicle v4.6
</a>