]> pere.pagekite.me Git - homepage.git/blob - blog/tags/bootsystem/bootsystem.rss
ea84bfe5dc3881c30c7884c10784ef72c2b95f30
[homepage.git] / blog / tags / bootsystem / bootsystem.rss
1 <?xml version="1.0" encoding="utf-8"?>
2 <rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
3 <channel>
4 <title>Petter Reinholdtsen - Entries tagged bootsystem</title>
5 <description>Entries tagged bootsystem</description>
6 <link>http://people.skolelinux.org/pere/blog/</link>
7
8
9 <item>
10 <title>Testing sysvinit from experimental in Debian Hurd</title>
11 <link>http://people.skolelinux.org/pere/blog/Testing_sysvinit_from_experimental_in_Debian_Hurd.html</link>
12 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Testing_sysvinit_from_experimental_in_Debian_Hurd.html</guid>
13 <pubDate>Mon, 3 Feb 2014 13:40:00 +0100</pubDate>
14 <description>&lt;p&gt;A few days ago I decided to try to help the Hurd people to get
15 their changes into sysvinit, to allow them to use the normal sysvinit
16 boot system instead of their old one. This follow up on the
17 &lt;a href=&quot;https://teythoon.cryptobitch.de//categories/gsoc.html&quot;&gt;great
18 Google Summer of Code work&lt;/a&gt; done last summer by Justus Winter to
19 get Debian on Hurd working more like Debian on Linux. To get started,
20 I downloaded a prebuilt hard disk image from
21 &lt;a href=&quot;http://ftp.debian-ports.org/debian-cd/hurd-i386/current/debian-hurd.img.tar.gz&quot;&gt;http://ftp.debian-ports.org/debian-cd/hurd-i386/current/debian-hurd.img.tar.gz&lt;/a&gt;,
22 and started it using virt-manager.&lt;/p&gt;
23
24 &lt;p&gt;The first think I had to do after logging in (root without any
25 password) was to get the network operational. I followed
26 &lt;a href=&quot;https://www.debian.org/ports/hurd/hurd-install&quot;&gt;the
27 instructions on the Debian GNU/Hurd ports page&lt;/a&gt; and ran these
28 commands as root to get the machine to accept a IP address from the
29 kvm internal DHCP server:&lt;/p&gt;
30
31 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
32 settrans -fgap /dev/netdde /hurd/netdde
33 kill $(ps -ef|awk &#39;/[p]finet/ { print $2}&#39;)
34 kill $(ps -ef|awk &#39;/[d]evnode/ { print $2}&#39;)
35 dhclient /dev/eth0
36 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
37
38 &lt;p&gt;After this, the machine had internet connectivity, and I could
39 upgrade it and install the sysvinit packages from experimental and
40 enable it as the default boot system in Hurd.&lt;/p&gt;
41
42 &lt;p&gt;But before I did that, I set a password on the root user, as ssh is
43 running on the machine it for ssh login to work a password need to be
44 set. Also, note that a bug somewhere in openssh on Hurd block
45 compression from working. Remember to turn that off on the client
46 side.&lt;/p&gt;
47
48 &lt;p&gt;Run these commands as root to upgrade and test the new sysvinit
49 stuff:&lt;/p&gt;
50
51 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
52 cat &gt; /etc/apt/sources.list.d/experimental.list &amp;lt;&amp;lt;EOF
53 deb http://http.debian.net/debian/ experimental main
54 EOF
55 apt-get update
56 apt-get dist-upgrade
57 apt-get install -t experimental initscripts sysv-rc sysvinit \
58 sysvinit-core sysvinit-utils
59 update-alternatives --config runsystem
60 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
61
62 &lt;p&gt;To reboot after switching boot system, you have to use
63 &lt;tt&gt;reboot-hurd&lt;/tt&gt; instead of just &lt;tt&gt;reboot&lt;/tt&gt;, as there is not
64 yet a sysvinit process able to receive the signals from the normal
65 &#39;reboot&#39; command. After switching to sysvinit as the boot system,
66 upgrading every package and rebooting, the network come up with DHCP
67 after boot as it should, and the settrans/pkill hack mentioned at the
68 start is no longer needed. But for some strange reason, there are no
69 longer any login prompt in the virtual console, so I logged in using
70 ssh instead.
71
72 &lt;p&gt;Note that there are some race conditions in Hurd making the boot
73 fail some times. No idea what the cause is, but hope the Hurd porters
74 figure it out. At least Justus said on IRC (#debian-hurd on
75 irc.debian.org) that they are aware of the problem. A way to reduce
76 the impact is to upgrade to the Hurd packages built by Justus by
77 adding this repository to the machine:&lt;/p&gt;
78
79 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
80 cat &gt; /etc/apt/sources.list.d/hurd-ci.list &amp;lt;&amp;lt;EOF
81 deb http://darnassus.sceen.net/~teythoon/hurd-ci/ sid main
82 EOF
83 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
84
85 &lt;p&gt;At the moment the prebuilt virtual machine get some packages from
86 http://ftp.debian-ports.org/debian, because some of the packages in
87 unstable do not yet include the required patches that are lingering in
88 BTS. This is the completely list of &quot;unofficial&quot; packages installed:&lt;/p&gt;
89
90 &lt;p&gt;&lt;blockquote&gt;&lt;pre&gt;
91 # aptitude search &#39;?narrow(?version(CURRENT),?origin(Debian Ports))&#39;
92 i emacs - GNU Emacs editor (metapackage)
93 i gdb - GNU Debugger
94 i hurd-recommended - Miscellaneous translators
95 i isc-dhcp-client - ISC DHCP client
96 i isc-dhcp-common - common files used by all the isc-dhcp* packages
97 i libc-bin - Embedded GNU C Library: Binaries
98 i libc-dev-bin - Embedded GNU C Library: Development binaries
99 i libc0.3 - Embedded GNU C Library: Shared libraries
100 i A libc0.3-dbg - Embedded GNU C Library: detached debugging symbols
101 i libc0.3-dev - Embedded GNU C Library: Development Libraries and Hea
102 i multiarch-support - Transitional package to ensure multiarch compatibilit
103 i A x11-common - X Window System (X.Org) infrastructure
104 i xorg - X.Org X Window System
105 i A xserver-xorg - X.Org X server
106 i A xserver-xorg-input-all - X.Org X server -- input driver metapackage
107 #
108 &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
109
110 &lt;p&gt;All in all, testing hurd has been an interesting experience. :)
111 X.org did not work out of the box and I never took the time to follow
112 the porters instructions to fix it. This time I was interested in the
113 command line stuff.&lt;p&gt;
114 </description>
115 </item>
116
117 <item>
118 <title>Debian init.d boot script example for rsyslog</title>
119 <link>http://people.skolelinux.org/pere/blog/Debian_init_d_boot_script_example_for_rsyslog.html</link>
120 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Debian_init_d_boot_script_example_for_rsyslog.html</guid>
121 <pubDate>Sat, 2 Nov 2013 22:40:00 +0100</pubDate>
122 <description>&lt;p&gt;If one of the points of switching to a new init system in Debian is
123 &lt;a href=&quot;http://thomas.goirand.fr/blog/?p=147&quot;&gt;to get rid of huge
124 init.d scripts&lt;/a&gt;, I doubt we need to switch away from sysvinit and
125 init.d scripts at all. Here is an example init.d script, ie a rewrite
126 of /etc/init.d/rsyslog:&lt;/p&gt;
127
128 &lt;p&gt;&lt;pre&gt;
129 #!/lib/init/init-d-script
130 ### BEGIN INIT INFO
131 # Provides: rsyslog
132 # Required-Start: $remote_fs $time
133 # Required-Stop: umountnfs $time
134 # X-Stop-After: sendsigs
135 # Default-Start: 2 3 4 5
136 # Default-Stop: 0 1 6
137 # Short-Description: enhanced syslogd
138 # Description: Rsyslog is an enhanced multi-threaded syslogd.
139 # It is quite compatible to stock sysklogd and can be
140 # used as a drop-in replacement.
141 ### END INIT INFO
142 DESC=&quot;enhanced syslogd&quot;
143 DAEMON=/usr/sbin/rsyslogd
144 &lt;/pre&gt;&lt;/p&gt;
145
146 &lt;p&gt;Pretty minimalistic to me... For the record, the original sysv-rc
147 script was 137 lines, and the above is just 15 lines, most of it meta
148 info/comments.&lt;/p&gt;
149
150 &lt;p&gt;How to do this, you ask? Well, one create a new script
151 /lib/init/init-d-script looking something like this:
152
153 &lt;p&gt;&lt;pre&gt;
154 #!/bin/sh
155
156 # Define LSB log_* functions.
157 # Depend on lsb-base (&gt;= 3.2-14) to ensure that this file is present
158 # and status_of_proc is working.
159 . /lib/lsb/init-functions
160
161 #
162 # Function that starts the daemon/service
163
164 #
165 do_start()
166 {
167 # Return
168 # 0 if daemon has been started
169 # 1 if daemon was already running
170 # 2 if daemon could not be started
171 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test &gt; /dev/null \
172 || return 1
173 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
174 $DAEMON_ARGS \
175 || return 2
176 # Add code here, if necessary, that waits for the process to be ready
177 # to handle requests from services started subsequently which depend
178 # on this one. As a last resort, sleep for some time.
179 }
180
181 #
182 # Function that stops the daemon/service
183 #
184 do_stop()
185 {
186 # Return
187 # 0 if daemon has been stopped
188 # 1 if daemon was already stopped
189 # 2 if daemon could not be stopped
190 # other if a failure occurred
191 start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
192 RETVAL=&quot;$?&quot;
193 [ &quot;$RETVAL&quot; = 2 ] &amp;&amp; return 2
194 # Wait for children to finish too if this is a daemon that forks
195 # and if the daemon is only ever run from this initscript.
196 # If the above conditions are not satisfied then add some other code
197 # that waits for the process to drop all resources that could be
198 # needed by services started subsequently. A last resort is to
199 # sleep for some time.
200 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
201 [ &quot;$?&quot; = 2 ] &amp;&amp; return 2
202 # Many daemons don&#39;t delete their pidfiles when they exit.
203 rm -f $PIDFILE
204 return &quot;$RETVAL&quot;
205 }
206
207 #
208 # Function that sends a SIGHUP to the daemon/service
209 #
210 do_reload() {
211 #
212 # If the daemon can reload its configuration without
213 # restarting (for example, when it is sent a SIGHUP),
214 # then implement that here.
215 #
216 start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
217 return 0
218 }
219
220 SCRIPTNAME=$1
221 scriptbasename=&quot;$(basename $1)&quot;
222 echo &quot;SN: $scriptbasename&quot;
223 if [ &quot;$scriptbasename&quot; != &quot;init-d-library&quot; ] ; then
224 script=&quot;$1&quot;
225 shift
226 . $script
227 else
228 exit 0
229 fi
230
231 NAME=$(basename $DAEMON)
232 PIDFILE=/var/run/$NAME.pid
233
234 # Exit if the package is not installed
235 #[ -x &quot;$DAEMON&quot; ] || exit 0
236
237 # Read configuration variable file if it is present
238 [ -r /etc/default/$NAME ] &amp;&amp; . /etc/default/$NAME
239
240 # Load the VERBOSE setting and other rcS variables
241 . /lib/init/vars.sh
242
243 case &quot;$1&quot; in
244 start)
245 [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_daemon_msg &quot;Starting $DESC&quot; &quot;$NAME&quot;
246 do_start
247 case &quot;$?&quot; in
248 0|1) [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_end_msg 0 ;;
249 2) [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_end_msg 1 ;;
250 esac
251 ;;
252 stop)
253 [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_daemon_msg &quot;Stopping $DESC&quot; &quot;$NAME&quot;
254 do_stop
255 case &quot;$?&quot; in
256 0|1) [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_end_msg 0 ;;
257 2) [ &quot;$VERBOSE&quot; != no ] &amp;&amp; log_end_msg 1 ;;
258 esac
259 ;;
260 status)
261 status_of_proc &quot;$DAEMON&quot; &quot;$NAME&quot; &amp;&amp; exit 0 || exit $?
262 ;;
263 #reload|force-reload)
264 #
265 # If do_reload() is not implemented then leave this commented out
266 # and leave &#39;force-reload&#39; as an alias for &#39;restart&#39;.
267 #
268 #log_daemon_msg &quot;Reloading $DESC&quot; &quot;$NAME&quot;
269 #do_reload
270 #log_end_msg $?
271 #;;
272 restart|force-reload)
273 #
274 # If the &quot;reload&quot; option is implemented then remove the
275 # &#39;force-reload&#39; alias
276 #
277 log_daemon_msg &quot;Restarting $DESC&quot; &quot;$NAME&quot;
278 do_stop
279 case &quot;$?&quot; in
280 0|1)
281 do_start
282 case &quot;$?&quot; in
283 0) log_end_msg 0 ;;
284 1) log_end_msg 1 ;; # Old process is still running
285 *) log_end_msg 1 ;; # Failed to start
286 esac
287 ;;
288 *)
289 # Failed to stop
290 log_end_msg 1
291 ;;
292 esac
293 ;;
294 *)
295 echo &quot;Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}&quot; &gt;&amp;2
296 exit 3
297 ;;
298 esac
299
300 :
301 &lt;/pre&gt;&lt;/p&gt;
302
303 &lt;p&gt;It is based on /etc/init.d/skeleton, and could be improved quite a
304 lot. I did not really polish the approach, so it might not always
305 work out of the box, but you get the idea. I did not try very hard to
306 optimize it nor make it more robust either.&lt;/p&gt;
307
308 &lt;p&gt;A better argument for switching init system in Debian than reducing
309 the size of init scripts (which is a good thing to do anyway), is to
310 get boot system that is able to handle the kernel events sensibly and
311 robustly, and do not depend on the boot to run sequentially. The boot
312 and the kernel have not behaved sequentially in years.&lt;/p&gt;
313 </description>
314 </item>
315
316 <item>
317 <title>How is booting into runlevel 1 different from single user boots?</title>
318 <link>http://people.skolelinux.org/pere/blog/How_is_booting_into_runlevel_1_different_from_single_user_boots_.html</link>
319 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/How_is_booting_into_runlevel_1_different_from_single_user_boots_.html</guid>
320 <pubDate>Thu, 4 Aug 2011 12:40:00 +0200</pubDate>
321 <description>&lt;p&gt;Wouter Verhelst have some
322 &lt;a href=&quot;http://grep.be/blog/en/retorts/pere_kubuntu_boot&quot;&gt;interesting
323 comments and opinions&lt;/a&gt; on my blog post on
324 &lt;a href=&quot;http://people.skolelinux.org/pere/blog/What_should_start_from__etc_rcS_d__in_Debian____almost_nothing.html&quot;&gt;the
325 need to clean up /etc/rcS.d/ in Debian&lt;/a&gt; and my blog post about
326 &lt;a href=&quot;http://people.skolelinux.org/pere/blog/What_is_missing_in_the_Debian_desktop__or_why_my_parents_use_Kubuntu.html&quot;&gt;the
327 default KDE desktop in Debian&lt;/a&gt;. I only have time to address one
328 small piece of his comment now, and though it best to address the
329 misunderstanding he bring forward:&lt;/p&gt;
330
331 &lt;p&gt;&lt;blockquote&gt;
332 Currently, a system admin has four options: [...] boot to a
333 single-user system (by adding &#39;single&#39; to the kernel command line;
334 this runs rcS and rc1 scripts)
335 &lt;/blockquote&gt;&lt;/p&gt;
336
337 &lt;p&gt;This make me believe Wouter believe booting into single user mode
338 and booting into runlevel 1 is the same. I am not surprised he
339 believe this, because it would make sense and is a quite sensible
340 thing to believe. But because the boot in Debian is slightly broken,
341 runlevel 1 do not work properly and it isn&#39;t the same as single user
342 mode. I&#39;ll try to explain what is actually happing, but it is a bit
343 hard to explain.&lt;/p&gt;
344
345 &lt;p&gt;Single user mode is defined like this in /etc/inittab:
346 &quot;&lt;tt&gt;~~:S:wait:/sbin/sulogin&lt;/tt&gt;&quot;. This means the only thing that is
347 executed in single user mode is sulogin. Single user mode is a boot
348 state &quot;between&quot; the runlevels, and when booting into single user mode,
349 only the scripts in /etc/rcS.d/ are executed before the init process
350 enters the single user state. When switching to runlevel 1, the state
351 is in fact not ending in runlevel 1, but it passes through runlevel 1
352 and end up in the single user mode (see /etc/rc1.d/S03single, which
353 runs &quot;init -t1 S&quot; to switch to single user mode at the end of runlevel
354 1. It is confusing that the &#39;S&#39; (single user) init mode is not the
355 mode enabled by /etc/rcS.d/ (which is more like the initial boot
356 mode).&lt;/p&gt;
357
358 &lt;p&gt;This summary might make it clearer. When booting for the first
359 time into single user mode, the following commands are executed:
360 &quot;&lt;tt&gt;/etc/init.d/rc S; /sbin/sulogin&lt;/tt&gt;&quot;. When booting into
361 runlevel 1, the following commands are executed: &quot;&lt;tt&gt;/etc/init.d/rc
362 S; /etc/init.d/rc 1; /sbin/sulogin&lt;/tt&gt;&quot;. A problem show up when
363 trying to continue after visiting single user mode. Not all services
364 are started again as they should, causing the machine to end up in an
365 unpredicatble state. This is why Debian admins recommend rebooting
366 after visiting single user mode.&lt;/p&gt;
367
368 &lt;p&gt;A similar problem with runlevel 1 is caused by the amount of
369 scripts executed from /etc/rcS.d/. When switching from say runlevel 2
370 to runlevel 1, the services started from /etc/rcS.d/ are not properly
371 stopped when passing through the scripts in /etc/rc1.d/, and not
372 started again when switching away from runlevel 1 to the runlevels
373 2-5. I believe the problem is best fixed by moving all the scripts
374 out of /etc/rcS.d/ that are not &lt;strong&gt;required&lt;/strong&gt; to get a
375 functioning single user mode during boot.&lt;/p&gt;
376
377 &lt;p&gt;I have spent several years investigating the Debian boot system,
378 and discovered this problem a few years ago. I suspect it originates
379 from when sysvinit was introduced into Debian, a long time ago.&lt;/p&gt;
380 </description>
381 </item>
382
383 <item>
384 <title>What should start from /etc/rcS.d/ in Debian? - almost nothing</title>
385 <link>http://people.skolelinux.org/pere/blog/What_should_start_from__etc_rcS_d__in_Debian____almost_nothing.html</link>
386 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/What_should_start_from__etc_rcS_d__in_Debian____almost_nothing.html</guid>
387 <pubDate>Sat, 30 Jul 2011 14:00:00 +0200</pubDate>
388 <description>&lt;p&gt;In the Debian boot system, several packages include scripts that
389 are started from /etc/rcS.d/. In fact, there is a bite more of them
390 than make sense, and this causes a few problems. What kind of
391 problems, you might ask. There are at least two problems. The first
392 is that it is not possible to recover a machine after switching to
393 runlevel 1. One need to actually reboot to get the machine back to
394 the expected state. The other is that single user boot will sometimes
395 run into problems because some of the subsystems are activated before
396 the root login is presented, causing problems when trying to recover a
397 machine from a problem in that subsystem. A minor additional point is
398 that moving more scripts out of rcS.d/ and into the other rc#.d/
399 directories will increase the amount of scripts that can run in
400 parallel during boot, and thus decrease the boot time.&lt;/p&gt;
401
402 &lt;p&gt;So, which scripts should start from rcS.d/. In short, only the
403 scripts that _have_ to execute before the root login prompt is
404 presented during a single user boot should go there. Everything else
405 should go into the numeric runlevels. This means things like
406 lm-sensors, fuse and x11-common should not run from rcS.d, but from
407 the numeric runlevels. Today in Debian, there are around 115 init.d
408 scripts that are started from rcS.d/, and most of them should be moved
409 out. Do your package have one of them? Please help us make single
410 user and runlevel 1 better by moving it.&lt;/p&gt;
411
412 &lt;p&gt;Scripts setting up the screen, keyboard, system partitions
413 etc. should still be started from rcS.d/, but there is for example no
414 need to have the network enabled before the single user login prompt
415 is presented.&lt;/p&gt;
416
417 &lt;p&gt;As always, things are not so easy to fix as they sound. To keep
418 Debian systems working while scripts migrate and during upgrades, the
419 scripts need to be moved from rcS.d/ to rc2.d/ in reverse dependency
420 order, ie the scripts that nothing in rcS.d/ depend on can be moved,
421 and the next ones can only be moved when their dependencies have been
422 moved first. This migration must be done sequentially while we ensure
423 that the package system upgrade packages in the right order to keep
424 the system state correct. This will require some coordination when it
425 comes to network related packages, but most of the packages with
426 scripts that should migrate do not have anything in rcS.d/ depending
427 on them. Some packages have already been updated, like the sudo
428 package, while others are still left to do. I wish I had time to work
429 on this myself, but real live constrains make it unlikely that I will
430 find time to push this forward.&lt;/p&gt;
431 </description>
432 </item>
433
434 <item>
435 <title>Automatic upgrade testing from Lenny to Squeeze</title>
436 <link>http://people.skolelinux.org/pere/blog/Automatic_upgrade_testing_from_Lenny_to_Squeeze.html</link>
437 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Automatic_upgrade_testing_from_Lenny_to_Squeeze.html</guid>
438 <pubDate>Fri, 11 Jun 2010 22:50:00 +0200</pubDate>
439 <description>&lt;p&gt;The last few days I have done some upgrade testing in Debian, to
440 see if the upgrade from Lenny to Squeeze will go smoothly. A few bugs
441 have been discovered and reported in the process
442 (&lt;a href=&quot;http://bugs.debian.org/585410&quot;&gt;#585410&lt;/a&gt; in nagios3-cgi,
443 &lt;a href=&quot;http://bugs.debian.org/584879&quot;&gt;#584879&lt;/a&gt; already fixed in
444 enscript and &lt;a href=&quot;http://bugs.debian.org/584861&quot;&gt;#584861&lt;/a&gt; in
445 kdebase-workspace-data), and to get a more regular testing going on, I
446 am working on a script to automate the test.&lt;/p&gt;
447
448 &lt;p&gt;The idea is to create a Lenny chroot and use tasksel to install a
449 Gnome or KDE desktop installation inside the chroot before upgrading
450 it. To ensure no services are started in the chroot, a policy-rc.d
451 script is inserted. To make sure tasksel believe it is to install a
452 desktop on a laptop, the tasksel tests are replaced in the chroot
453 (only acceptable because this is a throw-away chroot).&lt;/p&gt;
454
455 &lt;p&gt;A naive upgrade from Lenny to Squeeze using aptitude dist-upgrade
456 currently always fail because udev refuses to upgrade with the kernel
457 in Lenny, so to avoid that problem the file /etc/udev/kernel-upgrade
458 is created. The bug report
459 &lt;a href=&quot;http://bugs.debian.org/566000&quot;&gt;#566000&lt;/a&gt; make me suspect
460 this problem do not trigger in a chroot, but I touch the file anyway
461 to make sure the upgrade go well. Testing on virtual and real
462 hardware have failed me because of udev so far, and creating this file
463 do the trick in such settings anyway. This is a
464 &lt;a href=&quot;http://www.linuxquestions.org/questions/debian-26/failed-dist-upgrade-due-to-udev-config_sysfs_deprecated-nonsense-804130/&quot;&gt;known
465 issue&lt;/a&gt; and the current udev behaviour is intended by the udev
466 maintainer because he lack the resources to rewrite udev to keep
467 working with old kernels or something like that. I really wish the
468 udev upstream would keep udev backwards compatible, to avoid such
469 upgrade problem, but given that they fail to do so, I guess
470 documenting the way out of this mess is the best option we got for
471 Debian Squeeze.&lt;/p&gt;
472
473 &lt;p&gt;Anyway, back to the task at hand, testing upgrades. This test
474 script, which I call &lt;tt&gt;upgrade-test&lt;/tt&gt; for now, is doing the
475 trick:&lt;/p&gt;
476
477 &lt;blockquote&gt;&lt;pre&gt;
478 #!/bin/sh
479 set -ex
480
481 if [ &quot;$1&quot; ] ; then
482 desktop=$1
483 else
484 desktop=gnome
485 fi
486
487 from=lenny
488 to=squeeze
489
490 exec &amp;lt; /dev/null
491 unset LANG
492 mirror=http://ftp.skolelinux.org/debian
493 tmpdir=chroot-$from-upgrade-$to-$desktop
494 fuser -mv .
495 debootstrap $from $tmpdir $mirror
496 chroot $tmpdir aptitude update
497 cat &gt; $tmpdir/usr/sbin/policy-rc.d &amp;lt;&amp;lt;EOF
498 #!/bin/sh
499 exit 101
500 EOF
501 chmod a+rx $tmpdir/usr/sbin/policy-rc.d
502 exit_cleanup() {
503 umount $tmpdir/proc
504 }
505 mount -t proc proc $tmpdir/proc
506 # Make sure proc is unmounted also on failure
507 trap exit_cleanup EXIT INT
508
509 chroot $tmpdir aptitude -y install debconf-utils
510
511 # Make sure tasksel autoselection trigger. It need the test scripts
512 # to return the correct answers.
513 echo tasksel tasksel/desktop multiselect $desktop | \
514 chroot $tmpdir debconf-set-selections
515
516 # Include the desktop and laptop task
517 for test in desktop laptop ; do
518 echo &gt; $tmpdir/usr/lib/tasksel/tests/$test &amp;lt;&amp;lt;EOF
519 #!/bin/sh
520 exit 2
521 EOF
522 chmod a+rx $tmpdir/usr/lib/tasksel/tests/$test
523 done
524
525 DEBIAN_FRONTEND=noninteractive
526 DEBIAN_PRIORITY=critical
527 export DEBIAN_FRONTEND DEBIAN_PRIORITY
528 chroot $tmpdir tasksel --new-install
529
530 echo deb $mirror $to main &gt; $tmpdir/etc/apt/sources.list
531 chroot $tmpdir aptitude update
532 touch $tmpdir/etc/udev/kernel-upgrade
533 chroot $tmpdir aptitude -y dist-upgrade
534 fuser -mv
535 &lt;/pre&gt;&lt;/blockquote&gt;
536
537 &lt;p&gt;I suspect it would be useful to test upgrades with both apt-get and
538 with aptitude, but I have not had time to look at how they behave
539 differently so far. I hope to get a cron job running to do the test
540 regularly and post the result on the web. The Gnome upgrade currently
541 work, while the KDE upgrade fail because of the bug in
542 kdebase-workspace-data&lt;/p&gt;
543
544 &lt;p&gt;I am not quite sure what kind of extract from the huge upgrade logs
545 (KDE 167 KiB, Gnome 516 KiB) it make sense to include in this blog
546 post, so I will refrain from trying. I can report that for Gnome,
547 aptitude report 760 packages upgraded, 448 newly installed, 129 to
548 remove and 1 not upgraded and 1024MB need to be downloaded while for
549 KDE the same numbers are 702 packages upgraded, 507 newly installed,
550 193 to remove and 0 not upgraded and 1117MB need to be downloaded&lt;/p&gt;
551
552 &lt;p&gt;I am very happy to notice that the Gnome desktop + laptop upgrade
553 is able to migrate to dependency based boot sequencing and parallel
554 booting without a hitch. Was unsure if there were still bugs with
555 packages failing to clean up their obsolete init.d script during
556 upgrades, and no such problem seem to affect the Gnome desktop+laptop
557 packages.&lt;/p&gt;
558 </description>
559 </item>
560
561 <item>
562 <title>Upstart or sysvinit - as init.d scripts see it</title>
563 <link>http://people.skolelinux.org/pere/blog/Upstart_or_sysvinit___as_init_d_scripts_see_it.html</link>
564 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Upstart_or_sysvinit___as_init_d_scripts_see_it.html</guid>
565 <pubDate>Sun, 6 Jun 2010 23:55:00 +0200</pubDate>
566 <description>&lt;p&gt;If Debian is to migrate to upstart on Linux, I expect some init.d
567 scripts to migrate (some of) their operations to upstart job while
568 keeping the init.d for hurd and kfreebsd. The packages with such
569 needs will need a way to get their init.d scripts to behave
570 differently when used with sysvinit and with upstart. Because of
571 this, I had a look at the environment variables set when a init.d
572 script is running under upstart, and when it is not.&lt;/p&gt;
573
574 &lt;p&gt;With upstart, I notice these environment variables are set when a
575 script is started from rcS.d/ (ignoring some irrelevant ones like
576 COLUMNS):&lt;/p&gt;
577
578 &lt;blockquote&gt;&lt;pre&gt;
579 DEFAULT_RUNLEVEL=2
580 previous=N
581 PREVLEVEL=
582 RUNLEVEL=
583 runlevel=S
584 UPSTART_EVENTS=startup
585 UPSTART_INSTANCE=
586 UPSTART_JOB=rc-sysinit
587 &lt;/pre&gt;&lt;/blockquote&gt;
588
589 &lt;p&gt;With sysvinit, these environment variables are set for the same
590 script.&lt;/p&gt;
591
592 &lt;blockquote&gt;&lt;pre&gt;
593 INIT_VERSION=sysvinit-2.88
594 previous=N
595 PREVLEVEL=N
596 RUNLEVEL=S
597 runlevel=S
598 &lt;/pre&gt;&lt;/blockquote&gt;
599
600 &lt;p&gt;The RUNLEVEL and PREVLEVEL environment variables passed on from
601 sysvinit are not set by upstart. Not sure if it is intentional or not
602 to not be compatible with sysvinit in this regard.&lt;/p&gt;
603
604 &lt;p&gt;For scripts needing to behave differently when upstart is used,
605 looking for the UPSTART_JOB environment variable seem to be a good
606 choice.&lt;/p&gt;
607 </description>
608 </item>
609
610 <item>
611 <title>KDM fail at boot with NVidia cards - and no one try to fix it?</title>
612 <link>http://people.skolelinux.org/pere/blog/KDM_fail_at_boot_with_NVidia_cards___and_no_one_try_to_fix_it_.html</link>
613 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/KDM_fail_at_boot_with_NVidia_cards___and_no_one_try_to_fix_it_.html</guid>
614 <pubDate>Tue, 1 Jun 2010 17:05:00 +0200</pubDate>
615 <description>&lt;p&gt;It is strange to watch how a bug in Debian causing KDM to fail to
616 start at boot when an NVidia video card is used is handled. The
617 problem seem to be that the nvidia X.org driver uses a long time to
618 initialize, and this duration is longer than kdm is configured to
619 wait.&lt;/p&gt;
620
621 &lt;p&gt;I came across two bugs related to this issue,
622 &lt;a href=&quot;http://bugs.debian.org/583312&quot;&gt;#583312&lt;/a&gt; initially filed
623 against initscripts and passed on to nvidia-glx when it became obvious
624 that the nvidia drivers were involved, and
625 &lt;a href=&quot;http://bugs.debian.org/524751&quot;&gt;#524751&lt;/a&gt; initially filed against
626 kdm and passed on to src:nvidia-graphics-drivers for unknown reasons.&lt;/p&gt;
627
628 &lt;p&gt;To me, it seem that no-one is interested in actually solving the
629 problem nvidia video card owners experience and make sure the Debian
630 distribution work out of the box for these users. The nvidia driver
631 maintainers expect kdm to be set up to wait longer, while kdm expect
632 the nvidia driver maintainers to fix the driver to start faster, and
633 while they wait for each other I guess the users end up switching to a
634 distribution that work for them. I have no idea what the solution is,
635 but I am pretty sure that waiting for each other is not it.&lt;/p&gt;
636
637 &lt;p&gt;I wonder why we end up handling bugs this way.&lt;/p&gt;
638 </description>
639 </item>
640
641 <item>
642 <title>Parallellized boot seem to hold up well in Debian/testing</title>
643 <link>http://people.skolelinux.org/pere/blog/Parallellized_boot_seem_to_hold_up_well_in_Debian_testing.html</link>
644 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Parallellized_boot_seem_to_hold_up_well_in_Debian_testing.html</guid>
645 <pubDate>Thu, 27 May 2010 23:55:00 +0200</pubDate>
646 <description>&lt;p&gt;A few days ago, parallel booting was enabled in Debian/testing.
647 The feature seem to hold up pretty well, but three fairly serious
648 issues are known and should be solved:
649
650 &lt;p&gt;&lt;ul&gt;
651
652 &lt;li&gt;The wicd package seen to
653 &lt;a href=&quot;http://bugs.debian.org/508289&quot;&gt;break NFS mounting&lt;/a&gt; and
654 &lt;a href=&quot;http://bugs.debian.org/581586&quot;&gt;network setup&lt;/a&gt; when
655 parallel booting is enabled. No idea why, but the wicd maintainer
656 seem to be on the case.&lt;/li&gt;
657
658 &lt;li&gt;The nvidia X driver seem to
659 &lt;a href=&quot;http://bugs.debian.org/583312&quot;&gt;have a race condition&lt;/a&gt;
660 triggered more easily when parallel booting is in effect. The
661 maintainer is on the case.&lt;/li&gt;
662
663 &lt;li&gt;The sysv-rc package fail to properly enable dependency based boot
664 sequencing (the shutdown is broken) when old file-rc users
665 &lt;a href=&quot;http://bugs.debian.org/575080&quot;&gt;try to switch back&lt;/a&gt; to
666 sysv-rc. One way to solve it would be for file-rc to create
667 /etc/init.d/.legacy-bootordering, and another is to try to make
668 sysv-rc more robust. Will investigate some more and probably upload a
669 workaround in sysv-rc to help those trying to move from file-rc to
670 sysv-rc get a working shutdown.&lt;/li&gt;
671
672 &lt;/ul&gt;&lt;/p&gt;
673
674 &lt;p&gt;All in all not many surprising issues, and all of them seem
675 solvable before Squeeze is released. In addition to these there are
676 some packages with bugs in their dependencies and run level settings,
677 which I expect will be fixed in a reasonable time span.&lt;/p&gt;
678
679 &lt;p&gt;If you report any problems with dependencies in init.d scripts to
680 the BTS, please usertag the report to get it to show up at
681 &lt;a href=&quot;http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=initscripts-ng-devel@lists.alioth.debian.org&quot;&gt;the
682 list of usertagged bugs related to this&lt;/a&gt;.&lt;/p&gt;
683
684 &lt;p&gt;Update: Correct bug number to file-rc issue.&lt;/p&gt;
685 </description>
686 </item>
687
688 <item>
689 <title>Parallellized boot is now the default in Debian/unstable</title>
690 <link>http://people.skolelinux.org/pere/blog/Parallellized_boot_is_now_the_default_in_Debian_unstable.html</link>
691 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Parallellized_boot_is_now_the_default_in_Debian_unstable.html</guid>
692 <pubDate>Fri, 14 May 2010 22:40:00 +0200</pubDate>
693 <description>&lt;p&gt;Since this evening, parallel booting is the default in
694 Debian/unstable for machines using dependency based boot sequencing.
695 Apparently the testing of concurrent booting has been wider than
696 expected, if I am to believe the
697 &lt;a href=&quot;http://lists.debian.org/debian-devel/2010/05/msg00122.html&quot;&gt;input
698 on debian-devel@&lt;/a&gt;, and I concluded a few days ago to move forward
699 with the feature this weekend, to give us some time to detect any
700 remaining problems before Squeeze is frozen. If serious problems are
701 detected, it is simple to change the default back to sequential boot.
702 The upload of the new sysvinit package also activate a new upstream
703 version.&lt;/p&gt;
704
705 More information about
706 &lt;a href=&quot;http://wiki.debian.org/LSBInitScripts/DependencyBasedBoot&quot;&gt;dependency
707 based boot sequencing&lt;/a&gt; is available from the Debian wiki. It is
708 currently possible to disable parallel booting when one run into
709 problems caused by it, by adding this line to /etc/default/rcS:&lt;/p&gt;
710
711 &lt;blockquote&gt;&lt;pre&gt;
712 CONCURRENCY=none
713 &lt;/pre&gt;&lt;/blockquote&gt;
714
715 &lt;p&gt;If you report any problems with dependencies in init.d scripts to
716 the BTS, please usertag the report to get it to show up at
717 &lt;a href=&quot;http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=initscripts-ng-devel@lists.alioth.debian.org&quot;&gt;the
718 list of usertagged bugs related to this&lt;/a&gt;.&lt;/p&gt;
719 </description>
720 </item>
721
722 <item>
723 <title>systemd, an interesting alternative to upstart</title>
724 <link>http://people.skolelinux.org/pere/blog/systemd__an_interesting_alternative_to_upstart.html</link>
725 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/systemd__an_interesting_alternative_to_upstart.html</guid>
726 <pubDate>Thu, 13 May 2010 22:20:00 +0200</pubDate>
727 <description>&lt;p&gt;The last few days a new boot system called
728 &lt;a href=&quot;http://www.freedesktop.org/wiki/Software/systemd&quot;&gt;systemd&lt;/a&gt;
729 has been
730 &lt;a href=&quot;http://0pointer.de/blog/projects/systemd.html&quot;&gt;introduced&lt;/a&gt;
731
732 to the free software world. I have not yet had time to play around
733 with it, but it seem to be a very interesting alternative to
734 &lt;a href=&quot;http://upstart.ubuntu.com/&quot;&gt;upstart&lt;/a&gt;, and might prove to be
735 a good alternative for Debian when we are able to switch to an event
736 based boot system. Tollef is
737 &lt;a href=&quot;http://bugs.debian.org/580814&quot;&gt;in the process&lt;/a&gt; of getting
738 systemd into Debian, and I look forward to seeing how well it work. I
739 like the fact that systemd handles init.d scripts with dependency
740 information natively, allowing them to run in parallel where upstart
741 at the moment do not.&lt;/p&gt;
742
743 &lt;p&gt;Unfortunately do systemd have the same problem as upstart regarding
744 platform support. It only work on recent Linux kernels, and also need
745 some new kernel features enabled to function properly. This means
746 kFreeBSD and Hurd ports of Debian will need a port or a different boot
747 system. Not sure how that will be handled if systemd proves to be the
748 way forward.&lt;/p&gt;
749
750 &lt;p&gt;In the mean time, based on the
751 &lt;a href=&quot;http://lists.debian.org/debian-devel/2010/05/msg00122.html&quot;&gt;input
752 on debian-devel@&lt;/a&gt; regarding parallel booting in Debian, I have
753 decided to enable full parallel booting as the default in Debian as
754 soon as possible (probably this weekend or early next week), to see if
755 there are any remaining serious bugs in the init.d dependencies. A
756 new version of the sysvinit package implementing this change is
757 already in experimental. If all go well, Squeeze will be released
758 with parallel booting enabled by default.&lt;/p&gt;
759 </description>
760 </item>
761
762 <item>
763 <title>Parallellizing the boot in Debian Squeeze - ready for wider testing</title>
764 <link>http://people.skolelinux.org/pere/blog/Parallellizing_the_boot_in_Debian_Squeeze___ready_for_wider_testing.html</link>
765 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Parallellizing_the_boot_in_Debian_Squeeze___ready_for_wider_testing.html</guid>
766 <pubDate>Thu, 6 May 2010 23:25:00 +0200</pubDate>
767 <description>&lt;p&gt;These days, the init.d script dependencies in Squeeze are quite
768 complete, so complete that it is actually possible to run all the
769 init.d scripts in parallell based on these dependencies. If you want
770 to test your Squeeze system, make sure
771 &lt;a href=&quot;http://wiki.debian.org/LSBInitScripts/DependencyBasedBoot&quot;&gt;dependency
772 based boot sequencing&lt;/a&gt; is enabled, and add this line to
773 /etc/default/rcS:&lt;/p&gt;
774
775 &lt;blockquote&gt;&lt;pre&gt;
776 CONCURRENCY=makefile
777 &lt;/pre&gt;&lt;/blockquote&gt;
778
779 &lt;p&gt;That is it. It will cause sysv-rc to use the startpar tool to run
780 scripts in parallel using the dependency information stored in
781 /etc/init.d/.depend.boot, /etc/init.d/.depend.start and
782 /etc/init.d/.depend.stop to order the scripts. Startpar is configured
783 to try to start the kdm and gdm scripts as early as possible, and will
784 start the facilities required by kdm or gdm as early as possible to
785 make this happen.&lt;/p&gt;
786
787 &lt;p&gt;Give it a try, and see if you like the result. If some services
788 fail to start properly, it is most likely because they have incomplete
789 init.d script dependencies in their startup script (or some of their
790 dependent scripts have incomplete dependencies). Report bugs and get
791 the package maintainers to fix it. :)&lt;/p&gt;
792
793 &lt;p&gt;Running scripts in parallel could be the default in Debian when we
794 manage to get the init.d script dependencies complete and correct. I
795 expect we will get there in Squeeze+1, if we get manage to test and
796 fix the remaining issues.&lt;/p&gt;
797
798 &lt;p&gt;If you report any problems with dependencies in init.d scripts to
799 the BTS, please usertag the report to get it to show up at
800 &lt;a href=&quot;http://bugs.debian.org/cgi-bin/pkgreport.cgi?users=initscripts-ng-devel@lists.alioth.debian.org&quot;&gt;the
801 list of usertagged bugs related to this&lt;/a&gt;.&lt;/p&gt;
802 </description>
803 </item>
804
805 <item>
806 <title>Debian has switched to dependency based boot sequencing</title>
807 <link>http://people.skolelinux.org/pere/blog/Debian_has_switched_to_dependency_based_boot_sequencing.html</link>
808 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Debian_has_switched_to_dependency_based_boot_sequencing.html</guid>
809 <pubDate>Mon, 27 Jul 2009 23:50:00 +0200</pubDate>
810 <description>&lt;p&gt;Since this evening, with the upload of sysvinit version 2.87dsf-2,
811 and the upload of insserv version 1.12.0-10 yesterday, Debian unstable
812 have been migrated to using dependency based boot sequencing. This
813 conclude work me and others have been doing for the last three days.
814 It feels great to see this finally part of the default Debian
815 installation. Now we just need to weed out the last few problems that
816 are bound to show up, to get everything ready for Squeeze.&lt;/p&gt;
817
818 &lt;p&gt;The next step is migrating /sbin/init from sysvinit to upstart, and
819 fixing the more fundamental problem of handing the event based
820 non-predictable kernel in the early boot.&lt;/p&gt;
821 </description>
822 </item>
823
824 <item>
825 <title>Taking over sysvinit development</title>
826 <link>http://people.skolelinux.org/pere/blog/Taking_over_sysvinit_development.html</link>
827 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Taking_over_sysvinit_development.html</guid>
828 <pubDate>Wed, 22 Jul 2009 23:00:00 +0200</pubDate>
829 <description>&lt;p&gt;After several years of frustration with the lack of activity from
830 the existing sysvinit upstream developer, I decided a few weeks ago to
831 take over the package and become the new upstream. The number of
832 patches to track for the Debian package was becoming a burden, and the
833 lack of synchronization between the distribution made it hard to keep
834 the package up to date.&lt;/p&gt;
835
836 &lt;p&gt;On the new sysvinit team is the SuSe maintainer Dr. Werner Fink,
837 and my Debian co-maintainer Kel Modderman. About 10 days ago, I made
838 a new upstream tarball with version number 2.87dsf (for Debian, SuSe
839 and Fedora), based on the patches currently in use in these
840 distributions. We Debian maintainers plan to move to this tarball as
841 the new upstream as soon as we find time to do the merge. Since the
842 new tarball was created, we agreed with Werner at SuSe to make a new
843 upstream project at &lt;a href=&quot;http://savannah.nongnu.org/&quot;&gt;Savannah&lt;/a&gt;, and continue
844 development there. The project is registered and currently waiting
845 for approval by the Savannah administrators, and as soon as it is
846 approved, we will import the old versions from svn and continue
847 working on the future release.&lt;/p&gt;
848
849 &lt;p&gt;It is a bit ironic that this is done now, when some of the involved
850 distributions are moving to upstart as a syvinit replacement.&lt;/p&gt;
851 </description>
852 </item>
853
854 <item>
855 <title>Debian boots quicker and quicker</title>
856 <link>http://people.skolelinux.org/pere/blog/Debian_boots_quicker_and_quicker.html</link>
857 <guid isPermaLink="true">http://people.skolelinux.org/pere/blog/Debian_boots_quicker_and_quicker.html</guid>
858 <pubDate>Wed, 24 Jun 2009 21:40:00 +0200</pubDate>
859 <description>&lt;p&gt;I spent Monday and tuesday this week in London with a lot of the
860 people involved in the boot system on Debian and Ubuntu, to see if we
861 could find more ways to speed up the boot system. This was an Ubuntu
862 funded
863 &lt;a href=&quot;https://wiki.ubuntu.com/FoundationsTeam/BootPerformance/DebianUbuntuSprint&quot;&gt;developer
864 gathering&lt;/a&gt;. It was quite productive. We also discussed the future
865 of boot systems, and ways to handle the increasing number of boot
866 issues introduced by the Linux kernel becoming more and more
867 asynchronous and event base. The Ubuntu approach using udev and
868 upstart might be a good way forward. Time will show.&lt;/p&gt;
869
870 &lt;p&gt;Anyway, there are a few ways at the moment to speed up the boot
871 process in Debian. All of these should be applied to get a quick
872 boot:&lt;/p&gt;
873
874 &lt;ul&gt;
875
876 &lt;li&gt;Use dash as /bin/sh.&lt;/li&gt;
877
878 &lt;li&gt;Disable the init.d/hwclock*.sh scripts and make sure the hardware
879 clock is in UTC.&lt;/li&gt;
880
881 &lt;li&gt;Install and activate the insserv package to enable
882 &lt;a href=&quot;http://wiki.debian.org/LSBInitScripts/DependencyBasedBoot&quot;&gt;dependency
883 based boot sequencing&lt;/a&gt;, and enable concurrent booting.&lt;/li&gt;
884
885 &lt;/ul&gt;
886
887 These points are based on the Google summer of code work done by
888 &lt;a href=&quot;http://initscripts-ng.alioth.debian.org/soc2006-bootsystem/&quot;&gt;Carlos
889 Villegas&lt;/a&gt;.
890
891 &lt;p&gt;Support for makefile-style concurrency during boot was uploaded to
892 unstable yesterday. When we tested it, we were able to cut 6 seconds
893 from the boot sequence. It depend on very correct dependency
894 declaration in all init.d scripts, so I expect us to find edge cases
895 where the dependences in some scripts are slightly wrong when we start
896 using this.&lt;/p&gt;
897
898 &lt;p&gt;On our IRC channel for this effort, #pkg-sysvinit, a new idea was
899 introduced by Raphael Geissert today, one that could affect the
900 startup speed as well. Instead of starting some scripts concurrently
901 from rcS.d/ and another set of scripts from rc2.d/, it would be
902 possible to run a of them in the same process. A quick way to test
903 this would be to enable insserv and run &#39;mv /etc/rc2.d/S* /etc/rcS.d/;
904 insserv&#39;. Will need to test if that work. :)&lt;/p&gt;
905 </description>
906 </item>
907
908 </channel>
909 </rss>