Received: (at 30604) by debbugs.gnu.org; 16 Aug 2019 21:10:26 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Aug 16 17:10:26 2019 Received: from localhost ([127.0.0.1]:55071 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1hyjUQ-00055M-5q for submit <at> debbugs.gnu.org; Fri, 16 Aug 2019 17:10:26 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47204) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1hyjUO-000557-MQ; Fri, 16 Aug 2019 17:10:24 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]:59360) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1hyjUI-0006ff-97; Fri, 16 Aug 2019 17:10:18 -0400 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=50870 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1hyjUH-0007Zl-Sk; Fri, 16 Aug 2019 17:10:18 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= <ludo@HIDDEN> To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: bug#34902: guix cannot find a module on boot References: <813466538d530a38bddf60ed348cb75b@HIDDEN> <87o967lxsa.fsf@HIDDEN> <20190318231359.217af9f4@HIDDEN> <87wokq4ptt.fsf@HIDDEN> <20190404224217.5ddd00f7@HIDDEN> Date: Fri, 16 Aug 2019 23:10:15 +0200 In-Reply-To: <20190404224217.5ddd00f7@HIDDEN> (Danny Milosavljevic's message of "Thu, 4 Apr 2019 22:42:17 +0200") Message-ID: <874l2gg6ko.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 30604 Cc: Julien Lepiller <julien@HIDDEN>, 34902-done <at> debbugs.gnu.org, 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.3 (---) Hello! Danny Milosavljevic <dannym@HIDDEN> skribis: > Maybe I'm too paranoid but can we have "guix" in the file name "modules.n= ame" > somewhere? Otherwise I see it coming that upstream uses modules.name for= an > incompatible purpose and then we'd be with a guix interface that's broken > and/or break their interface. > > (So much complexity for something so silly. Honestly, I feel like E-mail= ing > the upstream author and telling him what I think. WTF :P) > > Should we warn when we use the fallback? I like the defensive programming > but I feel we shouldn't have it *silently* fall back when the database is > broken/missing. > > Otherwise LGTM! So I went ahead and pushed these patches, derived from our beautiful patch set at <https://issues.guix.gnu.org/issue/30604>: c85ccf60bf linux-modules: Define and use a module name database. e1a9a7f275 linux-modules: Add 'load-linux-modules-from-directory'. 2a693b69ca linux-modules: Add "modules.devname" writer. 4f8b9d1a6f linux-modules: Add "modules.alias" writer. The actual fix for the hyphen/underscore mismatch that Julien reported is commit c85ccf60bf. The =E2=80=9Cmodules.devname=E2=80=9D and =E2=80=9Cm= odules.alias=E2=80=9D are actually unused so far but (1) it was easier to preserve them, and (2) that=E2=80=99ll give us an incentive to finish <https://issues.guix.gnu.org/issue/30604>. :-) I added an explicit comment that =E2=80=9Cmodules.name=E2=80=9D uses a Guix= -specific format. We can always rename it if the kernel folks decide to acquire that file name. Julien, could you please confirm that your initial issue is fixed? Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Mar 2018 13:37:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 26 09:37:08 2018 Received: from localhost ([127.0.0.1]:53748 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1f0SJA-0006lr-O0 for submit <at> debbugs.gnu.org; Mon, 26 Mar 2018 09:37:08 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:41000) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1f0SJ6-0006le-Gn; Mon, 26 Mar 2018 09:37:05 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 5C63812388; Mon, 26 Mar 2018 15:37:03 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id sqtncgtjmxpE; Mon, 26 Mar 2018 15:37:02 +0200 (CEST) Received: from ribbon (unknown [193.50.110.93]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 1A24E1216A; Mon, 26 Mar 2018 15:37:02 +0200 (CEST) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Jan Nieuwenhuizen <janneke@HIDDEN> Subject: Re: bug#30922: LUKS-encrypted root fails using device numbering, needs luksUUID References: <87tvt5dgsa.fsf@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 6 Germinal an 226 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 26 Mar 2018 15:37:01 +0200 In-Reply-To: <87tvt5dgsa.fsf@HIDDEN> (Jan Nieuwenhuizen's message of "Sat, 24 Mar 2018 09:22:29 +0100") Message-ID: <87efk7dkle.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30922 <at> debbugs.gnu.org, 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hello, Jan Nieuwenhuizen <janneke@HIDDEN> skribis: > After booting I get > > Device /dev/nvme0n1p1 doesn't exist or access denied This message comes from =E2=80=98cryptsetup=E2=80=99. The =E2=80=98init=E2=80=99 script for the config you posted does this: --8<---------------cut here---------------start------------->8--- (boot-system #:mounts (map spec->file-system (quote (("/dev/mapper/guix" device "/" "ext4" () #f #t)))) #:pre-mount (lambda () (and (let ((source "/dev/nvme0n1p1")) (use-modules (rnrs bytevectors) ((gnu build file-systems) #:select (find-partition-by-luks-uui= d))) (zero? (system* "/gnu/store/v5r0dx5v08847rcy033ky= ish6m3b3621-cryptsetup-static-1.7.5/sbin/cryptsetup" "open" "--type" "luks" (if (bytevector? source) (or (let loop ((tries-left 10= )) (and (positive? tries-l= eft) (or (find-partitio= n-by-luks-uuid source) (begin (sleep 1) (loop (- tri= es-left 1)))))) (error "LUKS partition no= t found" source)) source) "guix"))))) =E2=80=A6 --8<---------------cut here---------------end--------------->8--- IOW, it does the right thing whether or not you=E2=80=99re using a UUID. However, when using a UUID, it waits for the device to show up, whereas otherwise it assumes the /dev node is already there and invokes =E2=80=98cryptsetup=E2=80=99 right away. We should fix that and generalize the wait-for-device loop, which already exists in a couple of instances. There are connections with <https://bugs.gnu.org/30604>. Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 24 Mar 2018 17:12:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 24 13:12:58 2018 Received: from localhost ([127.0.0.1]:51673 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ezmiv-0004C4-UJ for submit <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:12:58 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:53978) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1ezmiu-0004Bw-9O for 30604 <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:12:56 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id B70B11184B; Sat, 24 Mar 2018 18:12:55 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vvmMvJ9da-Dn; Sat, 24 Mar 2018 18:12:54 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 9D82D116E8; Sat, 24 Mar 2018 18:12:54 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: Keyboard detection before =?utf-8?B?4oCYY3J5cHRzZXR1cOKAmQ==?= runs References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 4 Germinal an 226 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Sat, 24 Mar 2018 18:12:52 +0100 In-Reply-To: <20180323140231.1c96615c@HIDDEN> (Danny Milosavljevic's message of "Fri, 23 Mar 2018 14:02:31 +0100") Message-ID: <87h8p5jt2j.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Heya, Danny Milosavljevic <dannym@HIDDEN> skribis: > I have to say what we have to do is much more complicated than I thought > it would be - and I kinda regret starting this patchset. I didn't > want to make it less likely for people to boot than before :-( Yeah, I had a nightmare where I dreamed of all the bug reports due to devices not showing up quickly enough. :-) > A small bit of research shows that: > > - Busybox uses a loop with timeout to try to mount over and over again, > depending on bus type [2]. > - Alpine coldplugs twice [1]. > - Fatdog has a "waitdev" boot parameter that specifies how long it sleeps > until it tries to mount the root. > - Redhat mkinitrd has an mkinitrd option like "--with=3Dscsi_wait_scan" w= hich > they use after they saw a modalias starting with "scsi:" - or add the > kernel option "scsi_mod.scan=3Dsync" to the command line [3] (but they sa= y that > this is unreliable now and one is supposed to use udev inside the initrd). > Not sure what they do for USB. > > The Linux kernel itself has a "rootdelay" parameter which > was specifically introduced because of USB devices that took 15 s (!) > to show up. It=E2=80=99s a kludge fest, which is reassuring, in a way. > All in all, we have alternative ways to continue: > > (a) Drop this patchset/feature entirely because it's too unreliable. > (b) Monitor /sys using inotify in an extra thread/process. > (c) Include udev into the initrd and have it do its thing. > (d) Monitor the netlink socket in our own thread and play udev ourselves. > (e) Find out how to, for each bus type, detect when enumeration is finish= ed. > Find out which buses are there. Wait for them to finish enumerating. > (f) Always modprobe usb-hid first, no matter what. I think this would > become a whack-a-mole thing fast. > > I'd prefer either (a) or (b) for reliability and simplicity. WDYT? Same here! Sounds like (b) is something we could easily try, though we won=E2=80=99t know how well it works until people start running it on the b= are metal. I can adjust the branch I have to do that and push it for people to try. Thanks a lot of your feedback! Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 24 Mar 2018 17:07:49 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 24 13:07:49 2018 Received: from localhost ([127.0.0.1]:51668 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ezmdx-00044r-Bo for submit <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:07:49 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:53924) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1ezmdw-00044k-4R for 30604 <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:07:48 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 84D1A130B9; Sat, 24 Mar 2018 18:07:47 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EbmF6rqkig_q; Sat, 24 Mar 2018 18:07:46 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 8938D130B6; Sat, 24 Mar 2018 18:07:46 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: Keyboard detection before =?utf-8?B?4oCYY3J5cHRzZXR1cOKAmQ==?= runs References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN> <20180323160702.45fa3fe5@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 4 Germinal an 226 de la =?utf-8?Q?R=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Sat, 24 Mar 2018 18:07:44 +0100 In-Reply-To: <20180323160702.45fa3fe5@HIDDEN> (Danny Milosavljevic's message of "Fri, 23 Mar 2018 16:07:02 +0100") Message-ID: <87po3tjtb3.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hi Danny! Danny Milosavljevic <dannym@HIDDEN> skribis: >> (b) Monitor /sys using inotify in an extra thread/process. > > Oh - or loop { load-/sys ; sleep 1 }. That's what you meant. Yeah, though we wouldn=E2=80=99t know when to stop, but if I read your mess= age correctly, nobody does. :-) Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 23 Mar 2018 15:07:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 23 11:07:09 2018 Received: from localhost ([127.0.0.1]:49888 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ezOHd-0006Gj-C0 for submit <at> debbugs.gnu.org; Fri, 23 Mar 2018 11:07:09 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:38312) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ezOHb-0006Ga-Nc for 30604 <at> debbugs.gnu.org; Fri, 23 Mar 2018 11:07:08 -0400 Received: from localhost (178.113.247.207.wireless.dyn.drei.com [178.113.247.207]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 1F364336108D; Fri, 23 Mar 2018 16:07:06 +0100 (CET) Date: Fri, 23 Mar 2018 16:07:02 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: Keyboard detection before =?utf-8?Q?=E2=80=98cryptsetup?= =?utf-8?Q?=E2=80=99?= runs Message-ID: <20180323160702.45fa3fe5@HIDDEN> In-Reply-To: <20180323140231.1c96615c@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/0MBcyLajkJ24wfPpyTJ+vA."; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/0MBcyLajkJ24wfPpyTJ+vA. Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > (b) Monitor /sys using inotify in an extra thread/process. Oh - or loop { load-/sys ; sleep 1 }. That's what you meant. --Sig_/0MBcyLajkJ24wfPpyTJ+vA. Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEyBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlq1GBYACgkQ5xo1VCww uqVK/gf4iqTdvsTHWIySk+mGwEXRxx4/kTsuwGqybxyXmjgb7qVbcRCa8+8InGkS FhAfpyYGRf584fnU8iLjDmVgt4dHvg1dI/W+icTH3hmovn0G8/iX9fsTtp/IkkoY tE9PQx1sCvZdZBqxSI8nT/s7BWWBVMwt9KUeF9bCdXS+kESU3f8YygWiaVX0DpdV q2iJsv8tCn6g12pojA/IMDZ7j14kGitU1Vt0TwBPP44cJK8Ll9lN87CkNjOpDvaS woAgte3ZHCV51iEcRGAiMJtW8WfurtXdn2lh5Zd3PX83/c/4sb2DrkMRUOy7kV0r o6peRbYCRcW+svANv/u1r2Wvl1oM =duha -----END PGP SIGNATURE----- --Sig_/0MBcyLajkJ24wfPpyTJ+vA.--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 23 Mar 2018 13:02:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 23 09:02:54 2018 Received: from localhost ([127.0.0.1]:48813 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ezMLN-0003Ai-IY for submit <at> debbugs.gnu.org; Fri, 23 Mar 2018 09:02:53 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:55762) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ezMLG-0003AR-HL for 30604 <at> debbugs.gnu.org; Fri, 23 Mar 2018 09:02:47 -0400 Received: from localhost (178.113.247.207.wireless.dyn.drei.com [178.113.247.207]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 7DB903360156; Fri, 23 Mar 2018 14:02:44 +0100 (CET) Date: Fri, 23 Mar 2018 14:02:31 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: Keyboard detection before =?utf-8?Q?=E2=80=98cryptsetup?= =?utf-8?Q?=E2=80=99?= runs Message-ID: <20180323140231.1c96615c@HIDDEN> In-Reply-To: <87o9jlo28l.fsf@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> <87o9jlo28l.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/AUxA6/_mgeP._IxBi/m+hEl"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/AUxA6/_mgeP._IxBi/m+hEl Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, I thought about it for a bit... On Sun, 18 Mar 2018 16:03:06 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > One way to do that would be to have a separate thread that calls > =E2=80=98load-needed-linux-modules=E2=80=99 as appropriate. Ideally it w= ould use > inotify on /sys like udev does, but a poor programmer=E2=80=99s version c= ould > simply call =E2=80=98load-needed-linux-modules=E2=80=99 every half a seco= nd or so. >=20 > Alternately, before passing control to user code (pre-mount actions, > etc.), we could do a =E2=80=9Csettle=E2=80=9D kind of thing: call > =E2=80=98load-linux-modules-from-directory=E2=80=99 every 0.5 seconds unt= il its result > is the same as before. There=E2=80=99s still a risk of missing devices, = and > those devices will never show up later because nobody=E2=80=99s monitorin= g /sys. > But then again, =E2=80=9Cudevadm settle=E2=80=9D must have the same probl= em: it can=E2=80=99t > really know whether things have settled, I guess. Yes, but udevd continues running and monitoring /sys anyway - so I guess they don't really care (if I wrote it, I'd start up the monitoring first and then traverse /sys for modalias - and make sure the modprobe is idempotent). I have to say what we have to do is much more complicated than I thought it would be - and I kinda regret starting this patchset. I didn't want to make it less likely for people to boot than before :-( I suggest we find out how the other distributions do it - if they do it. A small bit of research shows that: - Busybox uses a loop with timeout to try to mount over and over again, depending on bus type [2]. - Alpine coldplugs twice [1]. - Fatdog has a "waitdev" boot parameter that specifies how long it sleeps until it tries to mount the root. - Redhat mkinitrd has an mkinitrd option like "--with=3Dscsi_wait_scan" whi= ch they use after they saw a modalias starting with "scsi:" - or add the kernel option "scsi_mod.scan=3Dsync" to the command line [3] (but they say = that this is unreliable now and one is supposed to use udev inside the initrd). Not sure what they do for USB. The Linux kernel itself has a "rootdelay" parameter which was specifically introduced because of USB devices that took 15 s (!) to show up. All in all, we have alternative ways to continue: (a) Drop this patchset/feature entirely because it's too unreliable. (b) Monitor /sys using inotify in an extra thread/process. (c) Include udev into the initrd and have it do its thing. (d) Monitor the netlink socket in our own thread and play udev ourselves. (e) Find out how to, for each bus type, detect when enumeration is finished. Find out which buses are there. Wait for them to finish enumerating. (f) Always modprobe usb-hid first, no matter what. I think this would become a whack-a-mole thing fast. I'd prefer either (a) or (b) for reliability and simplicity. WDYT? (inotify is Linux-only, but so is /sys/devices :P) [1] https://git.alpinelinux.org/cgit/abuild/tree/initramfs-init?id=3D9154b0= d9b7251cca900f9e834ac9af9ae2ae61d9 (scan_drivers) [2] http://lists.busybox.net/pipermail/busybox/2015-March/082688.html [3] https://bugzilla.redhat.com/show_bug.cgi?id=3D466607 --Sig_/AUxA6/_mgeP._IxBi/m+hEl Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlq0+ucACgkQ5xo1VCww uqWjAwf/ShXF09RtyD6sKDqunwq6f4RVl1YCwD+UXe4YpocIT2o3tmomD4Fo4ZI5 tXARLYRQLOl0K43+kXiwv2X7LHcFwkw8PSWMG6DoP/qoq9caOFUs5dS/XI/i/dUF AUwck47T9kiEblAJi+rFL2Rkm2HSmAYOkG8nfCg9OmMFWOhIyuObA8YPsL1G+Qb7 uI+p+miA0m9l3QWCNS2eIO5EWKl6gWwHOHqWbyO/s+R6PeAC+vpdLkpCE/KlLgV3 P75p0mx+QMkCagcCfZsY3b4nnUOH3A63xEJ3nPqV7o6XrsND1XNVsnhFcot3bEc6 zdQZsljL1SHX4WcTLaFSBp2B3kEyoA== =YjRi -----END PGP SIGNATURE----- --Sig_/AUxA6/_mgeP._IxBi/m+hEl--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 18 Mar 2018 15:03:14 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 18 11:03:14 2018 Received: from localhost ([127.0.0.1]:40272 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1exZq4-0007az-7r for submit <at> debbugs.gnu.org; Sun, 18 Mar 2018 11:03:12 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:54062) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1exZq1-0007aq-1c for 30604 <at> debbugs.gnu.org; Sun, 18 Mar 2018 11:03:09 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 14B7712144; Sun, 18 Mar 2018 16:03:08 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LgJO4LfYHAja; Sun, 18 Mar 2018 16:03:07 +0100 (CET) Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465]) by hera.aquilenet.fr (Postfix) with ESMTPSA id D644E1210F; Sun, 18 Mar 2018 16:03:06 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: 30604 <at> debbugs.gnu.org Subject: Keyboard detection before =?utf-8?B?4oCYY3J5cHRzZXR1cOKAmQ==?= runs References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> Date: Sun, 18 Mar 2018 16:03:06 +0100 Message-ID: <87o9jlo28l.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hi Danny, ludo@HIDDEN (Ludovic Court=C3=A8s) skribis: > Something annoying is that my external USB keyboard doesn=E2=80=99t work = while > in the initrd (when I type my passphrase). I can see that it=E2=80=99s d= etected > early on, before I type my passphrase: While experimenting with this on the bare metal, it became clear that it=E2=80=99s a timing issue: the keyboard is detected right after the crypt= setup is displayed, so =E2=80=98load-needed-linux-modules=E2=80=99 didn=E2=80=99t= have a chance to load the relevant modules. Similarly, if I boot with =E2=80=98--repl=E2=80=99, and I manually type (load-needed-linux-modules =E2=80=A6) from there, then the keyboard=E2=80= =99s module gets loaded as expected. That=E2=80=99s because the device showed up in the meantime and the kernel created a /sys entry for it. In essence, we want a mini-udev and something akin to =E2=80=9Cudevadm sett= le=E2=80=9D. Merely calling =E2=80=98load-needed-linux-modules=E2=80=99 once isn=E2=80= =99t enough. One way to do that would be to have a separate thread that calls =E2=80=98load-needed-linux-modules=E2=80=99 as appropriate. Ideally it wou= ld use inotify on /sys like udev does, but a poor programmer=E2=80=99s version cou= ld simply call =E2=80=98load-needed-linux-modules=E2=80=99 every half a second= or so. Alternately, before passing control to user code (pre-mount actions, etc.), we could do a =E2=80=9Csettle=E2=80=9D kind of thing: call =E2=80=98load-linux-modules-from-directory=E2=80=99 every 0.5 seconds until= its result is the same as before. There=E2=80=99s still a risk of missing devices, and those devices will never show up later because nobody=E2=80=99s monitoring = /sys. But then again, =E2=80=9Cudevadm settle=E2=80=9D must have the same problem= : it can=E2=80=99t really know whether things have settled, I guess. WDYT? Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 19:17:17 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 15:17:17 2018 Received: from localhost ([127.0.0.1]:59878 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evpQD-0002Rl-EY for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 15:17:17 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:54748) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evpQA-0002RZ-9D for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 15:17:15 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 356623360249; Tue, 13 Mar 2018 20:17:06 +0100 (CET) Date: Tue, 13 Mar 2018 20:17:02 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180313201702.259bccd0@HIDDEN> In-Reply-To: <87zi3cp7sx.fsf@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN> <20180313100539.442c4aa9@HIDDEN> <87zi3cp7sx.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/3aNY3EucdUCEh31=b3MEVzY"; protocol="application/pgp-signature" X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> --Sig_/3aNY3EucdUCEh31=b3MEVzY Content-Type: multipart/mixed; boundary="MP_/ByHHwKh/.YaHjmiFc8hQDt/" --MP_/ByHHwKh/.YaHjmiFc8hQDt/ Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Hi Ludo, > Do you see a modprobe invocation for =E2=80=9Cfs-btrfs=E2=80=9D or =E2=80= =9Cblock-major-xxx=E2=80=9D > before? I can't get the logfile to show any modprobe log message in this case (which is "make TESTS=3Dbtrfs-root-os check-system"). I had that problem before and I think it's because guix is using some special /tmp/repl pipe for qemu here[1] and so the message vanishes somewhere where I can't see it (that is, the guest does everything correctly but the host loses it somewhere).=20 The usual trick I use in this case which is "steal the cmdline and the files from /proc/<qemu> and invoke it myself" doesn't work either because of the pipe... hrmmmm... I tried both /dev/kmsg and just not closing current-output-port etc. I've double-checked that I've applied all v11 patches, including the resolve-alias one (which I think is necessary anyway). Help? Log file attached. [1] When it uses the VM to create the root fs. --MP_/ByHHwKh/.YaHjmiFc8hQDt/ Content-Type: application/x-bzip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=L.bz2 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 YWlqnS1etTfNXtb0rkKrLXyBISauS0XQLrqtIrkXBqEiyDkFAXsAB35z3tvTb1ohq+p8e8XxfZdX ZZZIJHy2WWOIhDMt9pKRttttuJKRttvsiJKqNwiJKqNtuBEElG87g7uO9AAABtNp553dwAAAAAAA AAAPIRttttttttttt4AAAAAAAecbbbI222RttsjbbZHkbbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbMAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAA8uo22222222AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAANttttttttttttvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAPNt54AAAAAAAAAAAAAAAAAAPxvwbtdr639D7t6713m7ZSdeucpJJJJJJJJJJLy/1PTtR YkMK77NECEIoB/8yIq0SBImTluvJPY9L0vSu3btXo3ngAAAAAAAAe389/Trl0rySk2ltNa1ZLakr JqlKWa1XNtdLbJpNSW0mySrJTClU3txiQWxBYSybpNzixjdiKCDYlUSRyLKFizdsxjVbfGv/J/Wb /sf6f/x/6+f+39j+x/r/P76+2+rNXjX13mGbyvKm88AAAAAAAAPLd3V8vT0vSSSSS9K8u55mSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSZkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkmZJmSSSSZmZJJJJJJJJJJJJJJJJJJJJJJJJJmSZmZmZmZmZmZJJJJJJJJJJJJJmZmZmZmZ mZmZmZkkkkkkkkkkmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkmZJJJJJJJJJJJJJLzbypm5bzdvKvKebzMzMzMzN3bszMzMzMzMzMzMzdvNKk3nnXll uvn+jbfR9HkbbbbfTeteed3gAAAPLzXnnd4PW288AAAAAAAA+K6vtbbbbbbauvb3fZ7dtr+SrUtt 5t6VyERHt7d4xDIoXCQknzIjc+a0ANhcChqA6jAT9wFRDYUUWIqKQUQCvwz+OdVt+2MMYY1TSkuj WR0oGGJWop8St5kyWTJvJum67bt++8rt5H/EDxGwu8u72xiQs6JRq3u2NoH2NUdWvD6YaormW223 J8JIQkkrttttttttgAAAAAAAAD5bzXnnd4AAAAAAAAAAAAAAAAADyvNXnnXeA8rzV5513gAgey88 8HleeeAD+r117K9avXrrvZd688AA9V5q8867wAAA9Xnnj27bzwAAAAAAAD1555sAAABwkjbbcrC0 XdVd4krtttttttxJSAAAAPNt55sAAAAAAAAAAHm288AAHq888ett54A4ABuySQknyfPugHAGgSFV B/UA/oPtEknd0QVvnstr9AAHrV2219i2wXBaVuBdphsBwLOKw2OwqFFEKKhRa0mJBH8qnDfgJqSE YSHaLjkxYHWUpSlKUpSlKUpSpSlKUpSlKUpSlKFKUpSlKUpSlKUopSlKUpSlKUpSlJSilKUpSlKU pSlFKUpSlKUpSlKUpKUopRSilKUpSlKUpSlKUpSlKUpSilKUpSlKUpSlKUlKUpSlKYhod9MSaSRY OzOzbb7r7trfZa8vsklprAAAAAAAAAAbYAAAAAAFSoAAqAAAADb5X97LV/Q/irL+h0NGhlh0tz+Z hqqstX9DgnKTpHOQYSdJ4qVjHaZGUdkkJo8dNMYAAD5NV81Od1tVrV18V27tMDsglCrREpDFYKmA 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 rC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsL WFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYW sLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawt YWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC27WFrC1hawtYWsLW FrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWs LWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtY WsLWFrC1hawtYWsLWFrO6Tu6tERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERFERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERET WsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1haw tYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1h awtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC 1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWF2sLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtY 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 ZcUVVVZVmqKPuUyGGAAQOxQiqLARWbiTbbYqQ228XAmrgPQYZRgUZGpqZSUPy3GR78BqMkn/sAQr sU2GqOwyyKfWkwKSTUqTQUMimSpJTlbbbdDKMnAwkNCWRpUklYDCAg8DRvtsNsssQiTxSbLLO12k kkkkkkvC2Xbk5bctlzk5bJcrZXLkuW2JJJJJJJJJJJJJJJJJJJJJJJJWYkkkkkkkkkkkkkllkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk lJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJZlVZJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJd/l/jbqSSSSSSSSSSXsW6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAQAAAAAAA25m825OcA3l/r10AHW6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAbugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAB1boH27tzh1boAAAA AAAAG7bJJJJbupJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJCSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSQkJJJJAkkkkkkkkkkkkiSSSSSSSSSSSQkAACSSSSSSSSSSSSQAAAJJ JJJJJJJJAAAAAAAAAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJCSSSSSSSSSSSSSQG2boAbboAA AAAAAAAAAAAAAAAAAAABtducO+76zxtl48nLZJJJJJJLlsucnLZJJJJJJJJJJJJJJJFVrI62220m p1MJPMQqGTQwttWrZGCj0KknzSnqmGBwKYKfRXuke7D5iSIdZAklREIqQgTluvFwVTKubqYOCk/o kVkpqqbuDmjZE6MqqqqlVVWSSSSSSSSSSSSSSSSSSSSSS6tl5+Tlskkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkklytRXM5M5bJcy0Vy4M5bJJJFVVVVVVVzYYfSJqZU1aKyxJJJJcq5XLkkkkkkkpJJJ JJJJJJJJJJJJJJJdpbJJJJLbbZJJJJLq2XXJy2SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSS6ttliSSSS8bxuYwwrVhyfDgNg9xeyqsOZYna223QYSOipGpqYSaDQkmKqnAani8GqsFK1G SVTRsqlVl5DjqZO5SlKUpSlKUopSlKUpSlKUpSlKUpSlKUpSlKUpShSlKUpSlKUpSlKKUpSlSlKU pSlKUKUpSlKUpSlKUpSlKUpSilFKKUpSpSlKUpSlKUpSlKFKUpSlKUpSlKUpSlKUpSlKUphJqKZW szxszzVbXhlAAAAAGUAAADJkAZAFtttpTI7u7DYkmg1OKlfZwYCwO7bbbbbqqo8NhghFCKQWCAIi ZmowZqRaSZUqSqVU6JSpSpSpSlKlKUqUqUqKWKUpSlililililililililililililiiUqUqUqUq UqUqUqUqKWKWKWKUpYpSlKUlKUpSlKUpSUVKVKlilililililililiiUpSlKUpSlKUpSlKUpSlKm Ek6o/AkiHyQkIyBUVAcyonccxhJzkYoADas2qVSldXVsklFI0GBTiRDwiaE0FkSbW221spqkk8Ek m5sNjUmHqqqqqphBuUaFam4wRu8X5MpsbHUcEfTVMFKKiRxWokpgwwSclSlSqSeJkwVSblNBUjgW M2225GDZSangUpSlKUtKUpSlKVtmZ1UvWkkBFZXq7gFZVZmXfXK+HeUmIheiMiSEcAlRzLA2ttt4 jCJxKU5j1GZJgenAZShRWikmIq3ElJLukkBPKvhcszy8QNAeVW1bSzyWWeFYtsxV2AZWbWSrvqVl ymVmdwCNRrgskEQ5amUaFMGpllVcmGJVpRKKkijgjAmRTKqVVI5DUkmD3CuJ3KUpUpSlKUpSlKUp SlClKUpSlKUpSlKUpSlKUpSlKUpWEnEqRhgxI1ttt3HVJMjTI1ZUwGChSes8nDy+GqG6SVuOByMo 7GpwTAwYMDBiMEwYSlKVMEwYTBgwYGDCYCYVWGFYKmBMGClKUpTBgwmDBgpWbW1tbVtbW1yzJToB ZXUzi227OyqqqrbQdnZVVVVGHmRDYbnE9x3d34VhmREiKgIipFRhUmWVSYUpUpUUlFKilIpUUpKU UqqYYIZEpwDtbYdXRhhhhjCsLh8hlJ2REI/veCSSQjJKp2FEwpVHr7Ayj5FjIe5A5MGYYYQwRgjD MIGY8zIZjzMmLBGGYQxFlFCD94KpCnIpSlKUpSlKUpSlKUpSlKUpSlKUUpSlKUpSlKUpSoUpSlKU pRSilKUtKUpSlK6quuL2GN0tY3a8hwGD400NzCTubnqiEkiUsQjgHceA0bIaDg78GpTXRR0MHIpS lKUpSlFKJSmTcVJMvVVVVVsRk52223Q2KUpRSlKUpSlKUpkjBgpTq1VWhJoaFKUpSilKUpTUyZMm EmDBSilKUpSlKUpSlKUlKUpSlKUpT2NE5IpoKg8zbS2olURkaKrqPqiTg0HVKUpSlKUpSlK5ZY4n PmtWrWx0FSiqqlVQwMDBN2g6ihgSKZIYVVVSvoYOhkwfRuwqqsq8SpDubHEjAyHiKalVrzwuMGSr cZxm4zjKqc0XkopH0ify+DQjRKkToK2b22LbZEkxoolRaUqRkyZNBSNDwKUpSlKUpSlMCTiVI9xQ miElI7DcYky1RjEry8H0VVVUqq0TQyy1MMKrRoU+wiPnfevEv+mL+np8+W3jhs+2HyH59KNV/PTK g4WobKw2B+X7U+8FqQnk7PY5hT9n9PhetmTCLhCpg3GRa06bEu0F/+l4AiAHZDIXH3Fh6xVQAImJ DMXHU2aL/xRVJgUeqBSBAUYqDDWYknaxC0ji4lBHx48htZKzDiPkjEIRLQYEhQ4oAhs4+PGz9kAR LL/T82Ou/K4ZaTqmfdRjkMMW0BEvb7TtnT2/X/HztltP5WUV1302X4AFDMKPS4qqqQNFePay6Gkq TKOrNZ7+FDEU9pMrvyUNIXqbZ0vBWym4M3wfkCRRyCClW90G/R7oJp5x220nFxH89HppgqkdWO+Z E3vLT3ZSMRQE6jKAryjTdMlV4+G80f1g7hhtx8+p25Qb1ShZjde4AAF9ROlTLDXXAZQfX8i7rWCR fSAUMdTAY+CIC9kR/Zx3mO9rRFwmOTZwBspJydYIPCaHEw3YKu+HLfgAZyhmT+6P7g/WNyTi4QT0 H58S0zKI5gk69lccWCPM5ONCCypduwg/svZ/eAAAgOLJ09NhyJBc+gRBBA2m5jjKjHAEYASEwtko M0mBYNsgsj0cG/7Y5HyYZ4EnmhBIyw6VZ1R+i154v7sLXhlfNUkaythE/aMByiAUGBTnS4KP6ROg QnpifywNQ0JpArzqQHlOKw/hpWGff6cNttn9NHk+gH/R82nY/fHzAgP8gUs8Dn1y4yeZxOVh15KM 1NfQ6DzOgoRAN75H0PzPR5gAdgK4ijDENFt75hw3iqgAen2r4V9Ll68937ns+4gsZCQiwhJAwSDM PR8+tz5C+gsvyY6Xcx3bqUOQkLgFDMZq5jQYqapwsoQp48TnyYhD0F0eNkaofjQz/xGlh4vr0kNq MCZZ02eFM+fc+8OoHij95X0bsMKcuLCdnOo2Y0ZSq/2mhZhWGuGui1JJ5tj+jLBlltpbSSrbEio/ gQfp4P30r/MyEwLlpXNa1o3IQ4BCCFht0Zk2gpIAaE/+EshadoYid9v/p3/1OxyCIEJkDIKOKVBZ EE78kXhrAC6lxNgvtITVuooOCsXdyV2TV0KUsKkz79ODw1Y157Px29kkigAAPWL9FN8I4qkAogps h6hUfC1hfrL3BYyT4WE8sxCIZb8fEfoyYU9NXhlz8vMy8UZ1cOb9+3Ly14d/6v6P+SIGvf9uGUT1 EIDwHdshQFttGfXRb9vtqwM2uhshMpNx6NujiegUbTGRjA5xiwuqUWH57+oUlwRk9ww8d5jJBDON 0J08bNvxOpQG5/YECEXFXz7M43BnXQ/pb7jaHWUsEVluueb2TgADHuLAHpce4GxS9joZBoUW2FnP 2rn6lUee29bhzngm4HiYzr2vxH7r8hSeJHqZrvagAAdjGOscYA3d7oD98T8wJCEbjtQaoe4BQZGn nGni8B6pd000mKHtO9aMyNqLQkJjVrjwsnFPbHA3F4qoAHeUKfH2vhce47RRh1CC8zMJHLmDpHYd gJ8N7Awc+51iC8hPaHch2Yh6slBRPn1482D4MNX9eTxJ6c+/r1ISBNDikzOL1az4ObsTu9z9jT6N Hm6uDm3fB7OD4uD7OT834cmHNVcH5ORq82zL9Gjz6C5fkdGh/pSSIR8JEJISn86lrQSIRRw/cRhQ LcDHMahAgQEFbwENZY7Hk7t13we4lX4ufpa3m7pZlhY3pLG5nW8yNLoMEEhQoUfu9gDCiFBBAEFk UEUbKokM2Pd4/bqzOA8uPD8aDl8MInvUTawk/rQTgrOPP82dF9YJgBZTYmBMoPpcFCxF6rAKUrwE pAntn6QoODRd38/Oc8WE4N4IYDxwCgGZ7yu2DVWtTjjQggm4SEnQziQZwHwEsiL3tgHFU1CEvT8V 8sA9uKWaJYOVQcjxBRbIZHcKyASagRGBC7fJY84MMoMI3+cLeBhYiYd33gd0YHlro+jAA68+X2hw HAg6DZ574TF0MwgWS9wwXFdCE1cr0BSM5QevxVZkyLB6HJy2Wnb1hTnD0a4BwsGPmQNl6Uubeuin NCOa6pwcjx+oDZ8XRh6MP8f4PVRz+D3Z/iv8SPB2f4z1cz0SNJ8jt/MkfnNphu5EdnsIRDynwbuR uMwFKHgNlSFyswHCQ18FOu1c0fRxoUC7HtAHIdQsbK5aJE6Ojz7OLi4v7HJlvz/O9dRajrPowMRH pBAwgVROAiOMejTj1bi+3qW16MhA3nJHiMjlE2iYpuIkCCJsUpQUFAKHlql5Fy6tlkdpPlv8Ab5B g8Lg5YAW93yhShmFpltH1D2i/mPiEYgjEVXINwTEuxnH/mB6al8DyFU7JR/J872p/EDGMV+kWBII CuTgve+S4rr0rYGIOh7mbFG/fbkw7Cz8occjOla2pvc3X/B/E4SQRD5cTZU6deT023+nfPGbYcHb t2/lPt4sEfJ1K5qeBhTnOWcd+BcPqiBljmpr8p+j+pJPFq5nD0XBpz45O71S6eQVVfzclhmtM9F4 rL9cnXRcp5qX+E2s/YB4GQ8FQDgNnFPC24KUFUiFjQaa+eogEHJTcgoeFHxPSekQX2hqPS4CqgAc BEA59RnXcbFbBQUAAwY8dVQcXogbP39NGmy5werhT0UHJnaYgFICI3Z3fo0a/orgiub/rhx2X+50 aROIFD1Rq/o6NWCtRw1toEBTofkXK4SqnfS4Mp+mGFU2R+at2Xhm3LQMFBAT9m/T4+tt+p/YQgLq 00siKsWFEDSEsFaMvWjusyLCSAc9P8e2nhxxb+uxM68vCOoOyD+a8LT8AWCA0ftxDDMyBkiiEVPw wirtTYHsJgTY0HypbFs6YOlnwMiw9W3+7lfzsucqQAICiw5Fhhh4JoKOY7B6gY329Qa8ifncPPgt QCR36/aobHgIEgiCPHFwB8gQL4cTZq0PwFB99dZuLk6fYw/WVVVQACNdhY2Ga2NcfoPeNsVzYhtp FPat9EwP0AtbqBNNgDIZgXh7JRBDOVCQsgslmj4AIifuzm6U5nh6yaP728g/MfrDV7LTWXmN8PiE MsA1GDi5SnOHN921uPaJ8Ti+JrwBXYKPm93GjYeBi97sPQYHjsdx4GBhA7Ty+71beX6zL4fP9O+w /L+uk101E3aPZ+rDJorIfBDaAhDQ/Q5EIlZ8/y/T02+7rucPeG+XvrW5rMZUQCCPZgMDGPC7+2Pg Wxo9DaRyjX9k6eqyPkeOeXW+k+RwZji7bcPFx16a4apHihJw8GzqD3gF8nB74kIRoO6aCuyY2FaI 4H3DzjeJ3rRz4/Q1l2Lg4KCgADCh1VZdA6wmgcsTEHiKw8fYDfAooA41zuaZI+T98864VWuBnfix XoyTqas205eSRMN9hCIbO163fZqx129Gt24aOvPbzGBgADSDFicURrKaE/xXiXFKFiXy2jmItEo1 V9mS3ytuyXpyLzMbTyVARCj2ncUKqABcdZa7z2h5HN79oKczO+tyPpaBcHMGszFvNUx4A1bCA1HK JYKQrZ6L1V2tAM182MMwoAdBoCDHJ5PsOiamEmjCRJ/7ZR9WXFMMG2mb9+6cFENPzXTnYettjZRZ tBQW2nNzDgpDFEEF+ucfosSBMfb4UorAcbVRwrcylhOec1Syb42NA14H2D5DQpwdcD7uOZLhAsDQ TaBKcmG/UArbfobrtsvmOB1ijYbi0gW0eZeZc2oLAylFvoOs+ng+/mdXzGJ2najJJJJJIQkAglHt Kx5/G4xlor9gICnv4vLy+L27fhzbcHDp56V2dHs8R83x3Xn4bs6Tm0xo76aa4/YkfllN9lzlUZan eaNdrmBy5WiZ8/0gpTfMbr6zVd0iQufkJjczz9n7zqddFwdO2zHHg2kgiHF0uHP0FxTVzY+zH3j7 R9BQnNfjd8PEKqK8xyP3JZx30EDyJzEF8XT1l+Q8rw2m49DuAA3Gn4Z7HrFVAA1Ap1cjpBOkUfIe G43iC7jueo0MgiH3/efLjr8Pp53V0sgeyg/DrU8TR1+4fhwKHAcWFBCBRA42+opS8MzQ6rENQoQK IMZCofkdPXn6TJ13OvN5mMNfbrWICgooOwi94djrY7XWcdJNHT5AUiSqoCigW4av1/WuJmtji44F Lyw5YRIDdZR0zQQWGDkQg8A6cCNYsDS42nXy3an7sfkwwNjLrnw244QCOA6B7FjN4jpCIhpto2Cb F8fid/gooA+NuNdPXRMc2TJdVuN9+XR6qvyaeptedCk9UIYCqgAdV36vw/N//zLZvv2eZI5JH5pE /nPw93Tx+E8wM4ZBNYJxcDUWOt7DMJoM24U9Y6x5Watmw28s8vptrT8WeX4Ye+5+GuexSNjlVoqi 0IQoM3QkH3HCEMZsYcjGWWYYPdLrt32e27sSGnlvNjQyFm4yyzDDDnhLSCqX5kIIIAwQwoJpE2gr rU/ABZDiv077eNcjRGGz05oH64DuXT0q3xUO8KERoAMrpVcQoFpqMB5xlVmIvOIMgGO89efBFH0r YOKmJPZHy+8w1m72qfYqhGHhxkQOrlrbrOG0cF4j5pLI3245YtrKL2BITPVw4ZpWwQv1QPbiLGAA 3umhdk6VUic3wJIhZgKGAUECf3B7woP8oEwBmrwdE0VLikaNcsMxhIPsFRi+Ye5CZyi/imWT43jy AAB8p9CR+x3RA3A59jrO7GHM9HZ6pF4twK8DiQ5el2ORzuDeerOatPIn4YWjZf6BwInyQIDDm3ZK yyya/D5Y9dfjdZuzy56bXtmzWr33N64GaOSAiEIfmgCgo6cbpa4NHSuigSIU60ore2/Y35DIfVPv 5gAAcKA3CBKHJHNKOPxGxsZzIj9WKEZGkycTIVu8kmJR0J5D3Cqp0yzdbx90XtVUBRQahxyq6b60 NMc+TRrh2HDgzvth2kgiHH+hnXVfGfMQEQsvuz8c1+r1iqgAZDmZNQH2Ga+3dt2Ww42hI4TIXpkA wCJH4DAwABfSxzGa70ksrKFr74W2YXWesOQAFG4juFHv6j+2EJO/UCvScjK+ws9baOse46wTcefi bzu/H03HbgTtEQD3lpZDnJBENk8kkkA+LsrmB6skgF6t4mKjMtxDzqL6vz/hzDfJbVeqMPfydm4l EogV0g8mLHzL7lrYFmoiAKZd30MC+LZ0NULnIoiUsl4bBrpAwP1pBSw0E5Yudgs/beN9V/QXmIY4 sQfn9pqGdb717EdmQ7aL2sz2Z+fz3BQuLgu/t3DhiHYEBDf+YE1BqgpVMIwzVftcBz74U/h7Dt5O HNagCV+kwLXGcDG7hOgawhEq29xf63EHMe75xyPPwMOqAQpdtJ8BXNraM27xN4BAdk1KuAE6w0ZP qrXYfzsyOfqzauAP35Of862klo0RGInF3ko/HoPQPM8Nz4+cKYOPEbTOaAlD2H8u9pWbkhj0FvQf AKAIC/I1f7iOnAD378/UfkT3NVaxPz+NJ95nVSQrSfrxBEPh6+rLU/OVfpMlv5wmit+cr6/3EDXZ QE0p9JWQg+ZOmLQwsmk/MnGZSF7oO2qvsfsyH/X678wnCDsEgmQjqgaiB/PE47er5/OxJq3k16lj +OD+l1Na85zyxyx+S+hSqj7hUhUIRWuwXBvL/8AbTNqaVTKuUg32XF4dIK/wIIoaOg6gRCrktMFe kmk6Ow/5fGfz5EzGTbDYWDze3N0+P3mJoPXR3dddDlsZeik7c/+zhxOL5bCRPY+qb44zNfp6+v/J Oj49Hp4eTuRDJECY4ASUq8dKmwB6BX3uOxeZID2jh+OeLx3IFQH9QqHRRkeouro8Sj0yRfTeDlfh cbbd4IhlcwHeBXtnxKvR734odcYsX0lXt58CertwWY3c1mszBhos0ZsDSs2rD6K1/WnxyUxz7B/c GxMOdPgDYY5rUMu+oEy9IaANNo/CI9xwr7flzPCyU1LJuA1Bj1mUv/nYNSCdW9Om23B9wiHkb/+j zNH2/yhh2/zOST0r9Hb8lW3jnwzoCICtZ7lK9kwOENk0G8HUMqDKXEBQUAitQLm/cHf2PHpwcT5d DL5JtnM6lR4WfM8/yv8tI1e83J3/EN+25eiYnVs3j+/RwWHb66y+ow7p7fIHQF5s2juVvC2AbBv8 L7E+v35TVtxNV+UsqpU0x6a+t16R/57Y5eav/V+Hcz9IemINr+lNPwfLPMCbIsWg695+3qtkHGP+ k4w6iEMQ6oppy/I5g5bQgPv3FYPoHN+f5XBavmm49QktNvy7izj+VUktydpZCaUZwjzYr2Js4VdQ WdJS4EsKCIf+jeqf8Nn6ufYiHxpk8ub8cXs9F8XB+WwvC3w0Ye8INu49RZoTeCId4QtPjYBu+7Kf 4xPsIi/Ih4R9B0GeSZ6lcSjNbREjnnLpMG4zoPP4D9v+X+nT8Dk/yr3fT5RnWny+lp9VXE1qp8Ll 2agOIZeebJnwKTNN11No8uiweomYy6gFGxO1wTpLHQQzuco75okkNXp2+m7SFN5m6A8RMKDCrcgG QG68xBT+0RECpNn9/t7bQSwiEIq/viB+4qMJ+P6K0fklf0/CTLu/D+qeMd3T07vun+I6/vhM/z/z YVR/KcAMUh5niXhJ/kIhxKGaMRjBIfwll4zDLaUtzmshZFIEYgWt1N20kmkqw2SrUbd8tLwigZVA cpZxlmqLU2lRUXTtS3eUo0FS2VmyKa8xishKD/ncNJb1lkGqcbCoabQiMOuZ4767754F5TI0Dxvs ywQxGGpuVRcwmaTqSIMwjPL3rTRdBjDRmM5u85znOc5znOc5znOcj+jXx9/+06m15a+N6jhH5uJp 5roKGqrvFVL1pe3IIHvKE+78w+k8U+b6gNWuS7kCIewJl7xpLshLL0wMf4h/SB5fvDX+36LA2n2j +o/l/JNB/EzF4UGgbCwRIfkY/5wLMn6SwzuMwHVe6tB+uQkkxMD86CU+qANEQpkrBgGBrxFeYvFH gNAQMAMDUAh/nEJIKpJIRSEI9pWbX/J6vR4tlf/g+DdyYYNW71Vu1cHsbcHQkCR6GBkZAcEYYZ1P +9hqLsM1O7TVUPbwS1vNWl3YWXeGiqoZGwGRCURCfc/eP+Q/qBejA+RaG7Eh057m63yDtDWZjydG wMQPYay84ORtPsbgOnxfbCPV2n/5vkdB9B4t/cqTQ8D/oePR8Nmw3+rb6NWKi366f/JUnkp9Wow0 ZGHgrRFcKWnDJmrTGdpbC3MmhUznD8zxbPn/bo/J+GzwJinCeN90xS2T4vTcb1FVQ+Y12BZfwC3C AbDEOgsbZIdNSVSSRgypG2kk20m2kwKKKqjAvKOw7q5zvP+h/2wDJDkMNmxii/6vkeT+DycRgzPi UTAlUSvFw5JL30fJnRxeLhI2IkqpZLVqWrQosVg7NWZHYOUYc1KrorRHnB9x+unZDn8gKPV4nJ7L oqfyMsFUwrc/MwSkuhO7uhlkKQxlty6Fd3dDLMtGUREaMmTsG08WqQTQogqUmakSEMKKsSBid27/ DU4k6vqe3M5usq228u1ttvdHGeDwanz6pVJtGIN0amDRwWUejCuQaiPFoe5gej/I9Gvmk0wkbqhz fLyTN38uZemEuTxJsfIMKNzcDQB0IWfj5sbwqxGGWlKLLYlZmQuy7ujBZhmUe0KAo9Q0H/U8EffW NH/lvzcnS2VZbaqyyJspVLVVbJixkV3NeLojM3stiWy11HsmGR4J9OHlcI4FMaoNTk3NXwJ0Nk7u HLEDRDp9Www+LsYY3tw9mDDOLYwpHN/59TDYr7mzmlKU3MmVMw0eSc3vX/oompucuT+SMObVVUVI X8B6enB8e4yjkGe4xnkcM/L1hEpJWvD9JJM0ZpDSkhAqgPUo9AOhU3BID371Cu7c3GgwKcLbHl3H BI0bH+To3mvETZl+hlIkRucD55kgiG4dk7HFgdXw5tInJY1YKN8W225Kns1Ybvuyeo2cDdhJorWy 3DxWMZrFYuFEV+NvSSCIVNBHJHJH+x6zRofjjGSvFRudmyTVHk7JP8HBg7+a1h5ParhpotYflE/v ayHA4Oz1SO6lqrbGgfz7NHYrudp+fSeD9HwnBR3VWkEEHrU8FeaRqqqqlYZeY9x2YPwp6jg8UquH qeQlHBR6/7WUjdrDDv1wbPkV3K/aYzObds4BxnM0hJTt8bBmNT31+u42PBT0l74fhMK991pauJm2 up7Kj1OYHUbe8VWylUVSlWrUtKq1ITzTykf9ckwmggPIRvdwckDxSUlwUkNix+4IDuHkbyVkS+CO 7B2TDznQ4NialKVR/48mzdT8v8WjuasTQ1Kjc5nk9WLE4E7PB4MObB9WqaZOaKecOBcjDBNVJlIC NGVSqlVKpPOZSQCiV0R6AaCjqUMIQhtdppqF1EkDLu001C0j2vxRgijCtiyaHRRuV5gipHgmxyzb Ett+qnFkqIRCp9jk6nXcirJENC32NCDAcdrplmlWtXq9N6QWQLQmMrU1lrG9KmazJem9ILIGX9Nu Dg4K4HynQb8MqrdhNZHHY558zx4MnZ6btmjlGS1hcWWtynx9pI1bGgZYGFSpJ5n3fmRlHA6ZPke6 oavHi0ec0NE1YUw85K85/XuGqlUyUwoqlGINnFVbe3ekwk/kxynR/aaj9n9nu+bR1dX5d/bB75fh HN8jUyNH+xCTAB0DkESoYYHoQlfiDN7VPH3WkrRjmKsVYXoFWI4Q00Sr1mtkaQZIxuWqyzVrrNp8 moygkkKIoo8QOjVnjRY3nmaPafOSE7ivi+QpoCy12iqgAexwPpsNDDsfjDQqPg9FWPRH6G39G5wZ +DmrJypai1LSSNHImEK4YfkcDm/Rh6qnyaGEkfapu/Zh4ym7XB8H9wEBh1OB25HNqTRo08Y0Noan i0iYeg9EyjhuD1kgiHw++S/l98p5+zBuiBR9JIIhU9mp6vpPd5v5Tm4DwfF44be1apPXpSKoqwlp atGps/DKPopVPnOU+CNGhft+VuE+ytCdR2I/8veeBp/H0SPM4njyer8cHGpFSoKpCrPRVVKVVg6s BiQ/JFdzcknHyuVxXBPycDwZVSDRX7vkR0YpOrdhVf/yYeLxc3xTNWlq1lyV5HRRiVKqpVHUrBJV q1atURyfcps0aJbLfF2/O3BcLg1k+xI9Xc7u5xEbtydqiPUwdDdU/BqjejQ/24OKjg4YOYosobuK u7i2/DLyV8m6NxthHMilQ8jCJlEsRoqIqxFJIoVRQQsTR5GHMdo/+9v8ko8mq1atXEVhHEzh+r/c Bh0SneV/SU/oiBT4KnA9R7KntVsttNG0w9HV5SlWrbbCCXqQD5gU+ZH0/vMfCdM9HopDn2ht5BuE 0aqD+bIbGUw0Kw/Vs2anFNX3N2DRhuwYfFWGrxeh7zubHVG4hEAsIECgFwRQGAR3PstdCd23h+fy dLBNbhNJmapGTOtb3kwRvchAMA4wLSApBJKqoOAASBgvLxbabOXKJvW9PkXvGA1LSXesoyXWt7zd q6dN2ILXp4sidBoiyZ/P7S6fq6t5HN92Pq5uz4bsPtOYEB5oSUkcWpEa0AfHMKew+yabNiTvNJ1n UOJA67O6JYbZI81YtsqCSQ00aNH6OSfAcnxzblcLhqUSFK4YMjmYHA+iirKq1bKrZOY92BOji1R1 Sn/i4jmjwPz1TQfU4qqrKv6pT+H3SV1ZGzlJmTO1lu4xd2mbKRu27ubfNvVZ7dyp6yE+1W8qtYtp yMoiEUSRDQcYnuWwcj5NGB6f0n0/aep93NNq9DhL5WaeaG7bmozLKsllea26kkuhWeAiH1vKQhp4 YZVoEpBjheNxMlxnVq1T6ZZsbJNtyfSJ7DZoeJ8G6dB7D0YO9NJ0TgwWFWqqEOZ0dKxFhR0fRJJA PHw+U6fRk7PA4ekQEcxXdSpFUo64luBnC2rZbVtwM5luA0Yg/Bu8UqqUrxKm7ebxJJJDpoGyzjdr i4rNWvvSa773nKUkmxggIpzaRrgnI1avVgetHpC0hWFSVKlSpVhEKc4J0CXlGQTydOBoeJk9ndzP N2fhInt6HDljFYGFDEDO3gQgI7CfVDQ21UG0lSVCpjaiaG2qgiwKNFXKACqqhhUwEGYzNCWRdGY1 SnjV0XC+bR2VNWjLJ+SYYUpSp6TzcDhrbLCtUaKUOTDg2nRCJEc0cNk2SeLoBo8HrH3Pd+zieXO1 V5px7snMrhquGSvAp0kKXCOMlJFFlgI+oiaaSOKGG7+dNzju1yRsMYC0wFBlSVZVS1LZKwxEZwiH UrI4M625HIwJAFxVVUA8z7x1iU+csF2ExtxEV3Nba5mC4Sv9+RyaGmT0PmqlVnR1MMJqirVq1Y/+ aCEVGGcGEostlm4wTBG6MYt/wYxb3IbdpdGibstW6Y++zYaHoeRGT0fGGEVJNmByVgqpattWykEc ZbiPg+THhNWrF/s/xcfx9XwOpxDkpNB2cveasvGSJE09DxPFOJuVOWU5rbdCmLbxy+zbEKIxXovP WSV4y8ZuRGNy3NVxhiy4aJhUggPidYmz+HA95GVTisHvhcYUXNuEzcsYwsjochnMOViSkowwwCtr bn3lV1T3Xi5mN2pqsPgqqq221ZPAvF4sSRoqtjp4JxElGsHZg4FH2MJoy1Ywk5nBqfq+Sfrsm28b VInSmKDN4dSm2EbqOempLYBUFqLIMapAqIaLy1g/vXTixCEQ1X2btXBwatzB6tmSwYjcEFcm4WWW M4PMsMLMODDcODk3bvzRAs0VwmrVxPs0OCyeDUYKinNueb5MnFzYnVwGh0OLUmVHFiDRoxEy+TAS NHk2G7Q4t2yZSZEQ3eksquxZZYjYxbPnXyJm/1mKLgrhUyWbzffdvi623o4QM4IQRoLA2HhBsuNn dO9OQbHcwQK6eRkIIMLe1PnfnfZTXNs2XBXCpOpscTfbhvi624o4QPghBBppMAmglJ+ZgkYRE3pD qUh/X76sazd+rnPLzyR0I+uzf8YfNxOH6urV99+cy/f0nlM+PWV9evqz6eO+n1NGM7Pi8x5/Zu9R 0PMexY8DVNTKq7cv7vmaNOhMKVSofNY3WaZNDG7aa2zwVqfzJJwGVZSHJXko002m/AoKr2CAeZYc fuCKpntARn1L6p6NGWzifNmPGN6nsp2dzDLUtEsE77qZKiFzCMUqNkCSouoSCb4Y9PMyQ/q0ZejX VH6uknhE/G1O2mJOqr/nxEqC5gMwyziBQto4GI0QaUKA2KpXJx32zIknnLEMyTKtjJOHcI8khKkF hXfTG2MaYm65S6opIoejuPV0ZVCCD5A+D1BH1PYqkPpbbbbb9wCA1H48k/HEfZzPQ5OrX1jwKjcA cEsuvp6tNttvzLMBUbhosYbCA/AxWj7rFtrQYSSQD4Tq54pbuj3hmlslstno90aObrOd31000aXS 6ex5dTcn0SKkMvldEjMU0KTA6cElnMYTQ5vrg+73d09VcA9RThIo3OvnPE/lK93q+jyORN+Z7Ek+ KPX9Zum/ZatWtMDYQS0ILCCkB5iJQPa7TllyH7KY82TgbMfgdXJo6Fi4TVbLbbbVqrLVtq1nDyfJ +b1PU7eD6vOObwnsbST8Ox1jZMMP2khh3iU6Pd4rVlXln9M5znOi22qsJoaOLJ5cjiMHijodWIiT MskQ0NzKTpHI5tX1U4lGj5zUY7w4UF55lUl80RTAaBaZjuTk1rHll1YFOU1yLbBqMha1l3wFQjAo /d9LIDGHF6A1IXQmldp0rL8jr09FtiaghnQ5+stFkd4Zq6fB4elQKKDV1NhBHIyaHcp2Uc+LQycW rccUbN2FeApvwtzbVXCTnuSIRq7E0cXJh3d3Nuk0RyK7IaMuLRhXArmrdWVbKw4OaHBu0VvwXc5s K7MMOrdjC6udt4ODij2c3u1OTLi5uBq7HZ4DDkIOgidnNgwVHFyOxqw5stXRFR3Ojo6N0ZaOriaO TgnM8Wjm6NXRGziy4ijirg55XJ1cWCclauSMJ0Opo+Q5N3N1cFcmhkbuDAZDsYMo4PFi8izqdzzO 5YxjGMYwww3eTmMNBUQiHdhgV4Mpkk5GbemvDcTl7Ul4ppowhsaEWeRR0BgFaOBmxsWQ0bEPIo8A ho0YKgtc67yzXfU+YeBDRDBxYkbFj5jodD0OB0BIQSFHAIUFo0ZTm5PRsassK3V0V1VWivFybOQc MzrFKCjIynyvTd3rpmbMp3PrhuDxZ7i21FxnIQhEKBOlFh72t5vS6HUpCC+oC1zmaRV6nSom+l5R +M2GCoSEPS72MjI2ORkeBkcjY6BCMFdmjBWip4t3NqVW7Bu6MNFd2Mhx0LECABiCDyiFChx5dL7k m2XZCG0TUxDLVVVGpTyjHipEMiYc5ovTCWiby1NIQFMoZZ2QK0qz08vcCFh3FQ4BxIodCB4HQ2NH U8jge1nWDhY68jodTNIaNhhwbHYwsPACDIsKKHQcNaZdUUMmEUiiYhhHccs+4seXsFalE4Dt3u+3 GopT3tW4bW6VNdEKqEIWvkHMoCxwgsugpRenV61lbHUpCC+IC1zmaRV6nSom+l5R+M2GCoSEPS72 MjI2ORkeBkcjY6FYYl7aMLos8W7m1W74N3R1Zaldzgrk3d3Nu1cnE4iSIbEkEKVBIsEIjBCRmO9t Yk1EWoaJsMpxRgaEhGiaAQFFUmiMJMgZKQlIwQUZRskEkzCJJJKKpEiqIjLCSSkpgkkMMAVLGpGS EMIRMCkkyMkKMjOElJIiGREwmDVJMhGGQERXm2blYGMbaTYxlhgBQYCBjGAGwCCQUUGW4kZGDRsj RGUykNSSyRJhKm+xg4FMDx9GDonJ8froHhxcpRCK7PxpLGwNSIGJUlEASw7WKB2GAuJYV5Vd+jis hDslKK3pG/qr9kVmbUkYbOSDhlNOZjDks4FhsMCR782DZ9jgZaJDd3YfNgyqKrCphUpXJZsqd1ua ydbmsLVmzIzlyxw8kmqHj808HBI0PCQnI5AakmPFSd2xD1X9XEYK0ZTxZYV0VhVUIYxiOJYyAxCE IQhlNipD0G1FVFTTQ7Ib7OD0qTd4b8YrnfVbrixmc5vObW7etyuc8d5cuABIAAVelZKTy3RUCJA6 vUfAZSSDk1xt0xlHAGlTDK624xtrfPnjpiiEQ248kr7DQ9XJs4MDb7DIQ7GCFXt2SZoV+7g2yOsx JmwUB7jna/Wjc4qguwnoG1RUvke2/RtptN40OLbQ9Jl6E5IQ7qVXkerLSJong1YklRTm1MMPUwni lLJKTZzQ9HZZx7Ukfwy3iQQhrKDQCuwKtAgvENLD8kWSRwhZyej57rxPJ8WhufWVHm9mA908TuxG riMHuPFNZo91T8DBxaOj+BxR8nBW5NmTw87cDGLcHUu06XfH+/7vbqcDfmPFoitJD2sWp4KjkNZO xkhOtT4k+JxYjFtYLi2uBlFejwMk2FOSTp9hKlpVHRZI5WE2ySoqURKi1ECVSpRFQFygaVSVUZPy Tgd2hxcUkrgcgODpbUqzdO7Q7Gjk4Hzg/zwi1NUkcknybDCq/ZQbnlYeiSQx0/m02Q6jGW7TbMni PM5I/jo6GydTJ+9WpwPc7OScsHAeZywnBs6Pdu9U0aCbHBOZXcZGTkYeKK4JuTT2NEnk8etUmisO rsGVaPgRavHViiC7ZYkIooQ2ERdtNhLZYkPYIBX8R1qmHifPwDzKr+aGceBQhFxP+3ZHAcX+KjB3 DyW23AwalnJ1bJP6OSbSOh5HJPQcEj2G0JGjihiN8owSthhulRmcNe414OO35pstfrdbx7vZUWNi Ciq4P3jk0e50NDR/AYdXyV5P3Mur6OEcnR0dnJydXFgy4NVm7i7HBgeBo6jIQ9bfEIvCxy5CK+Tk 5OTgLAoZCjgSeOE4XmxCsYeBI2JFDYYbGhsIFERHM44pQTzMTIeJVQpmxQoUMgWBQyFGQwMCjez/ lXRZoj6NkbjVySuhJ4QjhQ6jCkr/VqaHImDNy4n8+4aFyIcy8ha0GUBeobjWWJgJIruIjv/2qXZ7 PJGhwHM3wnycxUyR4+zEnE2Nhde/y6Ny70M0aAgyCWtZrHd5mhmjsRPkyWFRCeEzHHi1q8vh4ZuN tOucI2aBkNgGbFl0HwbnAj8RmEMDYsub878aCg6lBIUgpERJaSiJJMnAkaGhYIkIEDgaCiRjA+ei rovw4RdOl3xt64dBLYytFTpxAI04sitUFKk5RVm1ddbDChQgONDYBxA4ChHd2BDCnSr2b2oWDEog N5swiPiIu82Wym3slsmtjY5ODkRuMejoQZ2Nw+CFewb8r3VKVimWgK2s6rarZSlJSVixScAVbLMx NA22kpK5OActpSuStpWKiTCjClUVKVSoyYDCiiUVQwUMCpViVKUqSpbWgFbYy0BWbW1tWFMGWWTJ TBRMlzbbblMEpSqFKKUqSmVIwpRSoUVSUpKlKopSVKMLWzK4BttSzKUqVKUlCUqKSpSiKSqFKKlF UUoqlKKUVJKRVComDBkmUwVSlKkpVFUzEra22lkqUpKkyuAJgSlKVVSlKSjJUYKpSlUqSlKVRSUp FGBW1mKlKWWK22VYtpOAK2lJVLFKxUmVoG20lSlYlLaWbWLGgbW0lLlbWzgCs2sUlUqVJWLFLGWg bboG21nKVbSolKSilFFKilKUpRSYGEwQEVRVKUVSpFKpKhTOEwYMMCpSpSqUUpSVJKVJFFJSoplV tilKxYqWKSk4BtZtZVClJkpkywFUyVJhVZS2slkqTLQABWbKkpSqW0strFk0BVtKxSUUVSqKlMlM KVEpWCVtKZcAVbZyszeAbcs5wDbNyrQFbKVKxWK5W2W1LFKpSxSlSVs4BtnLhgtF5ktdt72PUwTK P4sjZlIxPVsTCdlI51bytrqrBasZ8FyzVw2EpPFMqlViJoefBIbuasBKwrCf4/nyycqSQvBPn6dJ 1RzYfBsNGWjAlGm0lBjKYMTaI45ElBmEU/zhrRybezI4P085Olkbzjyeru99ROKV0c6inKmg0mRd Jwttts1RTBgwjQlZjusZaEn1dm7imodZNEdHgwYYYUQqSSNFVRsA0CFyad4hvrAZbtiRjHFp76w0 7xPgV32U8HXqrzYuMYxVq2XDGK5ofM8GDwR5G5N0mSoSOo1MBwTA3dG7UT8++GrGxknu+0WSduq2 2/YT+zyea9kmmMJMcWjwZYVsz/O1VrcUP1fZ8tEbOboMvNJyYVxaNmjQcYgBAokKEDg7+mXPNCeX c09Q9GnSqwFFDYRDijfemNPMNFjNUW71q5uuNTY4eXrHnbTXheGuOHBlwb1lxV/o/x/+n+XqBx5g QH+bzSSQD6zb5tnx/m8nq3niRzf9wFPu+sotM/SfpKNZz5bePoLtY/MLD1CgoNkQBUsN1/BC7NX1 x09Iaw6DEjrBLRIUnzfPVpJ9j5qlu1uMTDxc/rebGGB6MHRF4jz4PHRGgy8kNmiFZX/qyR0J/PAn kn4IsIMhI9dFi3y+Z7OvAttDo/KfmEl8yCHgAoOACnoQ+chAqvTno5prl3uDfpmgVEg4KyvAxBJ5 GDtPzbpo+ISeSkkilJEPbG4YELSjxFyRkQZGTpCKnaUcAPuNBfZ1ZiVJT2EyJLa5S5YtiYRNjIwk yWKaE/dlMmz5mGRJRZJI1qW4FODYkmVmDKUyaCmFcxzYHYlHDo/l/vng/0cXh/c5vUD9HIhE8Dqq qqlVTVUwqqjeDAepkPX9DxOwxpWXm3NByFMJxjBhfej80iZYFFVSV+G6fVofJVVVKrgfPpw/r+M9 nBTs+lTDw425TmAQye3Ldo5steTs9jVyPJwHfUwO0+jg7CMc+SNklUquHwP6sj+R/wfZk/hJJAPB EDokexJPya/Mif3Mogf37fSx8/QxJmlsg9aHCyWyavTWHzaMKfkrmPJwmXiUOT4NGSPokaMEyo/3 OTLKPWWGLakVT3mjBSPEQIYwQqtV3T8XVqKuEWkgnV60xrSAxCWmnSRqZK0IDYGMQhCK6t5Fxzw2 1Akrsuc6XMdtuc1nZoBe4MLEYMYNUIEJdEaWJpqrW6rdGLEHEeaezZFsgMQls06SNpkrQgNwxiVV VgN4lE8Os9H1IynFq6T8/Kavm8p8XPq6rOf2ezxOph2PiTZR0bZ0zonafNEDhNE0tttj+tGCpUoq ofPC4YNiYPorJVKVTBTD7fK2VYS98WhaLZEtktiJEfCOZh8m7BRQr+93U7vNSq5tRX3T+/Fq20mU rPF1Op6OhiiSJItOhu2beNuDGLcOWjkKalZycCc0mGiv3ZODkeDsP9eplwN3IkaMk/bXKT5v1OrE 586cnm5JPBq5OkeXCWyratmWXJxiDgc1Hq5sH2nd9EkkAyVucGTeSCIc3gfBq1QqKhVJ0UYst94r 3V8zkYOCJyYRWBvklUnKxbJ/JlgzYtSISEZSEEXgqry4YzI45I5J6CDc8RlaEFUHU0ftIHQ6bBCq TxSJ/N4ngaDqkdnFlKipVSqfo5HY0e2p+2/87jGujDifcZTyazB4TlsrmwryZPiwwZmKtlYjNXDE 8W56GcKqYfhlyTS2220lKwkSIwYCoQUVFJRCIUJJIT8rLWEkkAoWVCe6mFkkImFNojVXjlVX8p/f Ob6m6PkkkgHx/d58j6OB9wOxInmf0bDxSJT9j6HfD+CYWLAIslRBGGWGVZJ9zJVZVlDLDKpkmFKR hkywMqQMGUMpiI5ENvwt0WqaStVFGyWt6Z1umcUs5LZmplazRGtUWFrUCm8snLOS3V0rnU65hvHS QRNslp2qttKoqRUEOkAgZ3fgdmUsPN2mxhnoUb248A8DuNAhgbzzFLmdp3nxeKfSck6Pq6ejNe73 eY/hrGyMn0pNUfnoJhrCQQVcMyPufFsNlPyfBg2oOjg9uc+h3nT87fzFx9+Q9n4YSOc8Fj3/64I0 UhJIaBZCeltjVoYMp6KMmqpTRqqqSTxYkNUiwxDRRqstt1ICPXCZMm6P0/hoPznzfR0R7q9FUfk5 uicR421bfdky+J4vHeOUeR7s4ZeDgOJq3VHNzJH7TYknBl/CZmx5uYmH6StHjOp1bISd2B4RhzJW TOjCDBzmv259pu6Oh+TMTwlP1VG1LU/JyjyHdMD3OSSfzywPDgYSitinVP36vVCTzNTZ5Tk4mCRr qNrkPttMyOqmOwATEIKo8jxIekoMgmX1U8W7B4Kp9Xk6GWjkcXi93348Ne3fR6Me9BdHavlroWXb N0uTZGxsJsAE4JAJz15QpAcQDud8qx3anjlm55QLFrnIou13S2bI2ZzyvHaJnBRDlsNrxGiD0Yh5 MNftNAgz5fCcHejkHyfV/SdWt9nxkgiHl+gHzn+pt/uuYfF5n7Pk+56qqYL9lFbkVgKT7nzbESCP 1f4MEkbEoFKcm/C2sNDQxoKwPoSSySGhUTyFE9M2quEVSdFRh53vflY5kpSQiGeDDkww0Ghllpbh iEz8EX9UjONXu4Y8j+4dEY3YU6GVZWYtr+CdutidxBFO7rtbXFjC1qk4ptEkNHQ5n6NUdDKFYbjg czs5rvhcYLcW4w3J0pwcCv7uzc91NHRm2zI+2Fpm2zd6K+r4Pg+XTy0Oboj1n/uqHjGh4G70fMrw c0ydzyZMHs9XMe7uH/xVGXNWt5V9LmsZwhu8DzexuV1+DJUPuIHuijk+lH88o7lGEBjGJjG2m2Nn Rik9aWklq12ns48HIymHEmxgMfRZT1GjBXBZDD5T7PZ3R+6RPk7HuCvr8DAh5gXl5zogF5qBoYCx gxhEixyfaQkHn4MCQUUVlGFFYVVJUqMIqIRDBJWEIqpB+UkbkoYFQAYOSCklDqigqqJrMRBoE/6q cHk1SZNVPNzpPZJJAPdzTZ+T90JNjijnJItkLZJJFSRA0OYLB7jiPIGuwlBVSUWO8+Hceme/2TwG FKqHJ96VH85qeAk7LJ/hZP3+Rg/8OBJgj80nMaidVQ6pBkklIUSVg689dLhfZ4ODV2WbQ8p54xMT XOhcaYrTGJjdInwUn9PY9xslTQmqOKFYPE0X5qq6vEm/fdHVwcBY6D7leZTSrZFtqfLVsZHV4Bo+ J1eaD6MPBCSqaJoSoGH87jGMVUmiCipKKoqiUVEZPA4AUKB9T521SuwIwZHnsnYT2mGQMPILBETi DdViXprM20+289uvLXxbp1RXG2zCmHRgZFdFdmWeMlsnYyO661ow4OTLydeW7jduHEUVcoqyYaCs RLMyFsKMhRIYZDgVvCU4ZWVEYspQNihQcVhhQRWZJp1u2UyDMNBRtlNa2u7auocENqs4L3DqFbYC 0dBiEItttXhu2B5T0Lo4ss0p/+1yX3FmhNmh9IdJE9yqavwbvm0JoSmXiwGVSoqV7Pbg9HxYeSqt WqpVWrVmxky4zgLojJkmEqK7OabpOqwgaPR/0HGeT0eo2eDOZattWrhumWFZtq21auHQOs1E24dD L3hcwylYksSykzFMyMKveq1FWq2lkBhEmMSVGZEZq1YRVqtplBmS7q3VYtWh4/IkMq91VKqpVKKT 5fQYOo1HUEFcTWEHDOCgiFBwFpQInjxn7P1T6zojopVCtmD+yRPyPi0q1atfV920GuX4fyZTRIw1 R9zUPE9vYQIxPnoq4LwgZBX3wXydJlPQROAaj8lGE+74K7rMW1/x7CTkU9PccGPNkYfiRNtoGm20 IYjueP7wLnijqCFQJWnNxcJbeDu0PQ+rLy/d4W1V69DmElJ9ojdmZUVYLbR6SJOqeh2GrJubQ9DP OprdHA6ssMMP8Hzaoy2mtuQpoorKELCwpoorYFBTtOKeVZxRRZOyeCtSRoJW5zQ8H8/HZmUujmqq sq8mpJmMqKZY7Kk+bAwKbJR8Dx430syZRhbjGJisVcJ9zaGS8eAaCFEEQ/IumhJkEOohJmFByZUk wWch6Ej8nskEB9FVVJVKpLEqikqqUiqSiUqSqlRFObgwrDBDLFkLZKxlaopVQGvdaDmHwKAyhkKC gV1urxbPFtOCfWlqWlvs6sK8RWEiqy7KwIIZBjEQpDFGxJuJxxjI2iCoLSGwIJcby3ysDXuPe4nE +IprMDsO5znkKmrynJ8Z6fM/t5p4/R5n5mD7H4ZD6KcFf7SdJxYD2ESwc7uOx7fgAB46Npc8dR0i jiTRH6z7Tg4cfVydnifPEn3J9TiyK/DB8JqpXZOpIvuiB7SeD2Qk+aPv6PC+ULfthpnHKsXbD1eW g/BswPsVs+jVllXF/JMN5MJh0JGrGrZxeLVq1VzUo82Vmx0NHQEMTmQtC+i5zFjFekXisNN1gIws OIVugSBowEYNDN9O7e+49J5lnXNaa3Q2xialaq/QojVJJAPuenNfNxDwe/2f190kkA5vr+jx5I5p HuiB/WSCIeacPRVLioEkjyPeSARCwLUHrdgJqe0FdomQwLwewFeTBijQT4hh7mxSlbj8pMHU0mf5 6n5M1VPw8HmLPw2yT6PJl4ISfEamR37Cc3jEbvVwX3tVf3JH7z85pPnMp4z1J7F6zyHg5TV/YSTK HVzeD7niVvzxebNkzAra9uy3K7M8bbMt7APiWvknF4j2plN7nDOYjXcPl9RhxkJZCQN1GMzH30XJ HUWJEee2ZdLvQ7UUojGjZGZXmVBn3BucjH7GjksPE2IIRo4MB0222XC42Llei4XkrCKqtX7OziND Ru8WjgrVybNVZcDRshoVxehsOZyauQrRMjRlGFVs1GXVlsbMMv0cWWtW22fthwcXFlVeRoroMKrV WHAMFDPB1DE8W08pm5iMjPGdL7ec3QJe7U6QWiS+42j6Nu17o54bZU1wthURqtTwliAwChQiw2BC AsMEENjA54ecPbpc6KQZlsM2Zto4EQwh0II6BEVlGQ6F01V1eiLasNaKNWo4XRk6y3GtccaUpw62 bVHCkBYIa3Rp1G0fRy7XujnhtlTXC2FRGq1PCWIDAKIIsNqSqrrEQ2EGur6ySKRJvYDAEGQoqKVa sqUUUYGyjAmQwMCiT0fcDg/LL8JE/hHZzBXoOp9fk9bqdDiZcREAxaztuwOG2jkFJxOJAxePFOZ4 Jz5idZuAuB5by0d5A6q0yVi4xcbJEiPrJBENHi/DdXl0MuzR25YdhTRiTg7q6+ehOHSfOandTbsc UOapCTVWpVKiyW2pUkg508k0R+2y1pFK/aduB0c2rka64M0mWGFRWVlJLFl6pZbSS5bWzIYREwyj IYaKjCmiowqp6CkwqqIRCopJRUJSpWrDQjxBjGM8F80eKpxxYYDGMYFLhJJJhpVZswiIogdZSGMQ my1ts8x1l1XS0uaKKKVQRWwRWCqoJBHO+6qnbseap19XwYK9hg4w52Li4vFSDHmeL1jBwGju6Hc0 Tq5jEcZvJTMl5WgFLZ3eG8MccdXW7u6jGMW24wTJVUyqJhgTCBhQy4J8jx5rbbTdOY7nEYHVKTDu VsjV2SR+EQOxPr+Oz1eJu2Sfd+aeLu7urLm9WUfmp9V9bcOHrZcNNLcPMARqpokMFMJhSSVSKVVQ 9cE7PilUrAmhXsqYQlVFSjCTDCTiy1avFHoGyNUOj6mU2OiNx3fRXLwj2V2YYYYcmGGWGHdzHy+S +KSt2DDDyzbllgww9Ddw8jq5o5o9WGCbeGYmUtlsKqItLVJJKsTfGcYxbhjGUVUkwjydiaHoaDBC c8NlfZWFYUrDBVYVpR0J3kn3DROSJH0T6T3ZdSt0kkA+h7p2r2LvG2cgIQIQIBFMNEiSFBsVJhCB G20wSZBwVJjYqTCFlILSWKj6NUwn+alVJqsY1YTSy0LVsincb1wPi4OZJKhJyQk85qyLuMkHMRai yFBEqISFG84rAMTiFKVQ/3N3ySf8ljo6PZTgMlEhxHi0Q0eD/tccln/PKf/TMODm8HqrpE6K1V44 YNTCTmOphq+7BG58BzZVH/OJPkkjoPqmjHU+CObodUqpToT7qTu/z/SYJ5Pr0TnKKp82HBQyVkoO RCEdhDFV2waI2bt1UQhOlSVDUVoIqQhCMGOjLbiY3JLEMEkkLpXbbnLs4y4o3GGWunSuMJ2IUEkn M7U+dxA8B7S8MR1kLsInAgtE5nu10NGLDzHZg+LknzKj3SN4Hw/4VNDkYez1Zdj2JmMDZ/RGr3c2 h4YdWUrWN+z38cK7DOx5m/ij+j/FImB0n08vKiXrjEswWPWtZIJEbYfww8mzop6TQanV/KNRl4uL xEIhuw0cWGzeaJwfJqaqfzYcFcGhk+rRo3eynHuNQ3oQIcaTQ00WMss3Ma58vf9/PlfOhdPDynWh jAJwlazRZruTqL0+spgDCSOBwFDhOTqQodkVSyhiCGEiQoUSCFTT62164cbieec7vGMAnG1mM2Wa 7o7jW33lMAYTEjY4CgOPtQCbDIwYIjAlKFJFFE0yZGSiiigooJRKkqqVVIH+RI8iP6IScpvs/DuS T31f4jsChzAzFReqQkolfGg4ovuPZWiwB7dA+oIPGprQd3c/KfAh6DRvIjJwTZJ1flWx+2g1NFYa GWRgeHBwT7HxcGz8sWqsSSYDd2SbqY4stDg8H3Mqnt3cjRRVOQ9zBO3MDzN09+yTY91KpVIYhQO0 NZcuIQvcge+hcpiYj20HUf45guKsHRqplJP8U/J/k8+Z4I67v3e7xbB+j1aNjhJ/sfkB93rPHU2e R/No0YaGiV6iMMGBZCEEQjjE2hiIJCQgYhjZGk220MRBhQyhFCKEIOwfpAe3/U2BaG5oIhvDP3Gg iGZ7ZUkqFWCjBjNxbisajVlqSmNvN1RsfZ3ZVXhjrVpato6qPwpVSa1pNkTebtiex9LyOgFfJu8z qFPa914qoAHabA1p+zxcn7I+R8pIIhuPIe+59Gj5P1JJyT4T5E6H0cufc6HNKqlVFabSMIyM4I5m sE/k5z9CR6QhEOCN3+3ugqmfB+o3KrzECGUj28rtEklgrlwjkswJHLzdzDVwdNGXkhxHPBMuDhOy RpB9kj+hEOLz9H9mJ4vB1TKoid1MYMRbaLbZJJKbnGvuwMJWmO7GMmc5xjGVjVIy5SfYyaIfOK+T J/PnG7UkcGpN3yR+Zhgyd3XykMH5tE4nwfHJsSI+JlHEbConEmqMIZVJImENWjBo0ebsZdFNm6Vh FYSsKwtwrFxLMYisS4aO853u6FawpyKmSsYBhWXQ7MuB+aRP6sI5su52fw5uE0bXpVqdlmLLYtzY wuMMW3rl+WiTwqTKmphGrJgoyqRhS1an5FHVUT8KMPNtMjDZg9RUwoVR4yhxFbCp3UTL9XRlGXAd GkdkWuEJdVRkdpt1EWmgXZ8aHSVi0ggg2bCCo2mSo3S2e2DEgZoGcCKOBBsKjRrtC0LZmJKISGoq IKNXIsVrYgzQhCA2FQaSjDhU1s3yoqEY6MbDlPdmCSqoLZBBBs2EFRtMzM4xLvjfVhaYbGHFRxWG 7ekm6SMAe51ijvC0FdQqoAHMUeAZcAJB93Z5h3O96DgCu42OkwuAAyO8FdhnTfHYnpzGP8Jgf1q2 LqOganinPRRxaE1Q3fR+rf6LX4Pi4Rvbbb3Nbaq6JJseb4TcbOuDxduLKOyczQ68yhlRsaxoqNCT V9W4ZTL+4jLZpwNRNGhwc1bGrXji24pjDCqqoqhhWCvBc20yV9iNSY4So1Zk1TGGB4C+TLHMwwTc bNyUywjRgYMKzpWkYlqW0wjDRlgqZZYYRSTNn5ecY8JLo/U6snBR5Dk4BjfVpq8F2stlstTRHQqT DZwfJNzxcs9mMfp+Kqd2k7rA4DxYcgikCB8AmFDHXkMKp0aySfNQnZZDwcUETVRxSUR4JFkh1sia 9ElYYYYG6pGWTBFKkjKxMUtWwqwtkYWIzS2QwsjNWrSVYWyMKG6YMsk/kSNDHBomrKJWjKRIjJPl 6zUbHihg/+WxlVKrQw3L0XoTVNSmCZRgqT/52SWw2McBmSaDg48Lbbf7dBs+7/FgyqJ9FRyKcnTC ZPfsczbgjZ5PqI57HFzEIh4mEcLbbb0kgiFcSxgj+aRWD3SYwttvBllsw/4/JOF9dz56cX2Scjij jTQVx8mrYaNCqlNVLxP1cvJPPVR0BR6TinodGjm/adgiZTxRumyOCVFlWUnGlqclZlLKMK6Jz04O Bqim0KSssTGUYbhk7DKNDUwaieKmhOmiG7NW23bXDRNEpWWSmUhkrjM1zm8FqzW824ZKzJYuN0Ek glTRTTjIlQi00EPqAgBlJgRg0m81GUEIzhmyKiyNimrBtJsjYhgtZasVGjga6GVSVBomIwlkEIwT BjxirBIkFC+egGUd/Eo/A2LGMYm22m23sHIgcXKTBhKcTEJBg2GFJlGwcf33P6oSfzOT1nEcms2B /lMj9X/VU6VMsdKJyVCREgKqh1gPhBBoBRFExUJhIySSpCQ0atUGGHzf1P4cTRuPB+hxaGr8kqvg 5tGjDyU825Em7Vsyy6jDzasNG7Vs0dtttNlm8mdmtaNlC3iG5l3NDgtttWaFiLKoRSKKrx7cq7ru hrEWXkMEa5k5dnPTpLce2OrFm2oR3l3NDgtttWaFiL0YG6EiFBGgqFFD+McyuCk0RG7BOMST/WyI t0eOITY5R2w8VFGXF5E7ns0Po8T7pzVFW26LhakxgkR8xKRkMDi5NYT1Qy2k6qNx5MJPRujklMuR w3R5qJPJyc3dx8XBNa0tOjOIZstSLUtC1GJ5EzlPe+ZU1Tgiv9bCByVSqy+jzTDzUttk/DqG0bBD eBcm3eWkUKLQpT5Fori2mw9zQ4PY9HeTwNX0EpxJ5xnOzAYjFxaqloiSqaqh1HEMbQ1B0A7yDC8L hL0dP77BzMxu6DB+Bo5yTionF/3LNNi1bbb6p3cW59m0ejgqMe+Gwz/vsSBk9ZHvLqxh7UVX2RK4 MsziqroqpKeqsOBWjLBVVsy0ZJo1d2jDcaoYTZ0Zc2XAmVKVUww5XdEAIQRdEGXalK3yqzGJJCx4 hiLt1aMRLbSVVWCOwK0YqATYVYgFp00aSVOO0YsjGIBY8QxF26tGIlt22JqqxlJiTArKnY6MuUaL DvNLOf/t18mpjdcvcycJJDyqGUnR4OA7mRqPHpokzI0OTJ4N3NsdmDCpbbKpKpbLZVPZGJOtQ9jV VUrAYKSIRhZJMxlHYZI4Dzc5M21LVpwyZFEZWGxtJy0ajzENJ5qfBSqVRUDu2T/yrwSirIL82BMR USejqissDAwYSMQh2HNHoqKqVTJr1Rs6GhJGBuqthuqFK3bo69P92HDOPBFuL4XD0udrbPCXlVtW 1d11cGe1baGJjaX1fFgfRHA+ofwj+jr1NEeBD5dHc5lUVhg86WwkkEmsXmGrI1D63ZtkhQVRIZQc VBvRO+AP34HEcgU4Y9WGFUVUqyKvWEMKIj86TDLgYGWEpI6ppFqWxZJ8nycCtVYK90niYV8nx7Ny N05KTFf8595xcEwhhGrLS5iTiwlKPBlH9OjU1kmgHUZ2QkEAh0JCoIaEWxjYEIbCl/5uuN0ck1d2 jRqwpp8XM5JXM0cGjgyJTuVHRxMM7u7Z4LKVEnEyGA3kKeW1NxY4nrvDYVaX5EE55QdpebTWbvRK 8+U/GwaI3dKSPR2Rqk/Ng4bk1VVYq1iTiXHweyY0cHs2Ef994Js8QQ9w7FV5/JH5rrHXpmNJDdf0 4BVWE8CFVhFP6qqsMMKOIw6qaOGD4NmHImCsGCqrKsoZRWHFU5NTGbvRSxI5GgMkU0N6v4umbReZ CX+d1lHeb1MOlzekDajQUbCgcBxySdLBeHpodkVSS0NCCgQggBETmLkNG+E5mOdOwPB3COj3vNzD pqdbQN05sOjgamQ5CMCGBhFFQlA994JlD1urXrDMfIucO8Pncp8jg8hzGXfnMu8siTTy8/N4pRw9 e6PIVw1nLq8VT5KVSiUQSR/E0ZYj5PgyjU9zD+TJiT5vm8K44PHq2blUr7MTBZKbVg4KmIZP7YMl OCMD+ZARQgjKdT6CH3VePXHEgSKVWy7dowghgG4dD9r5z0kgiHzRA/3T5G6f7ZzTDd/qRl5xPc6v /8ynmnzUcT6owYPg+ER0Uniqqq+ySJ6qqqqqH+35JIRDCcUdlK/mwwqqI5tBg/+78DsqaD7JhJPQ ry/DpKs3Z9fM5majqpFVSoqnBsunjwZYKoqyrVPzNh/t5PDm5D+piPqy8D2KX3stiWy14vq7u7ZI 802T9Cno0HiOSSaGvo/OZJ4+vNcMhYKpdkchCxHPmJ17gI6HCPU4CqKbNGiKw8ucTRybWW2y3VUk y/188H/FEDUwUlPhN0eUVXW2xhUtXGMYxGK0FJJ9JgZHUxu7k0J1KQ83BlHdXFqhwNyVPxxT+bcf JqedHwOpxfwPnH8JNHydHz4+J5vednoh9Gw85NrhHFTujTBPR5uGjJBkpUVIhqbNlaMLNcpkqqVU sVVL9Gw3ZNFNcsOj+Gr6KqlV4n/NPkxCEQqK0MMKOFN0VFiPg/D5xEmic/YkdXRxRyMGavZHtuTR pSYSrSRGIwMwMvQd97ldur693ZW15KmjKbI9RoyHiwwKUnFg9zLeZMGE8WcxHl7nk8Hi0Yc30KV5 umst0LBAizwvYbswQhGCaRNJwQ4nAUrRQwRRSFFSSipIlFRRSSUVEmyNT7fzdE/DiQwSsvaq77xq VdS1wTVjdtbbuk1wyB3SMI0GmDxZI2U6itSOxo7OD/uZcli21YQj9tzdxeEk/Wz8jkdislYDFJsx 9knwFDQ4oSasEbHs/N14vEmybJVVFVFVKKhVCVSVPMj5PqHf7P75u7qr8MMKr4tT0avGbfpJBEPO eZI6tkJPokHwPN9xwOdjoPb4GkOg7D8NJh2PUKOA63YWiC7hzKgIhQPidr0cn1HaWmXKCbbEMW7S y9F8CXx5eNaAyz02S9n49n/HyvyEjnhXe/B8HDH1+7zSSQDRs/RQ+Eww/fDFW1Ju7kE43MTBmez7 4A1oC4mVIkwlTBVeJhlZPVTXhbsyyww/Zo9Hq0YUahYVXSZZcGiYebigQQfU6EOhdVTIMr9BUBc1 MR49t7vbq+/AytZl6zjOIcLFxs0hCIIrkQAzd0O4kT1bLdyQSJKkHG0Jq7ZaGWMDARgBl0twiImt JozopgCqlqfL5UZLnMoSCrKpyVJTl+/jaq3vzxjGMW7EcIlOjJJJoNZmLT3Gw93EVUADE8XeG0YQ YRVduCROzJv8fIkerySJ5SO8pb74fc9YSjQWnaUTvJJJuOLlXbJF8yjqDSUFtA6nRVKqvJHNEdR7 DnujwRmf78HLQnRMKnR5m7SJ/pSfBUkm4jqyZGHZ2RyfAyNXFoMte8LpN0vP/39T1cXL1KpbbDs4 HQeaK+juk+L+/DxGyoVZJsm8iHGYeDLmw7PDTS3gbK4KxVMEUwVShuKEkIJxkE4yXXwHn4kchwkf 31MDmwGipJ0OOeek+eTByaKGCEVCFIYzzBgzwEYQ66abgo6ZbbWMYlMTOMYxhQI0EqGFJCAqSgVV iRJJJUCkksKhEsSQkKskIqmTmYj6eDInVlUiTkYZRRo0c+hI48ZwX/eqatmyqq221cI4ilTNlsJ1 g8HiI73NxR2o6KKK/X5OYgqkpPnFOpXR+QpPHu7jJTJ44TKpTISmEdQy8H2NWxQnYn4ew4o9jaRt GVSqVUqSTj6MMkqOzi9ENu0WNrjDVP7YaJSbj6f927D1dGSqbrdxgnkwUlTNdHuR1SmFhbaehHoy Zaj6iRDKHMquMhq4KPFSPFsf5z80iath6oSbjaE+BOB8DmZK0ttWvco8mf9dDiMuLtVowTeF3kh6 Dprokn72b724wr4mcLWbjFxhXPXA4iazcyIRD4q6yCJ8DwQ/R/9u4lbHaScTf+lWotaGw7P58WDK lqqvqmJUiknymswaFbRgdLAAzERkkCQkLz1NAfFylLe0kJhgrCqV0VgyVKn7sTEZskYRiC/7k5v7 pn6Kc0Vu6PnP7pjkhqe1Jkn9jR8AicXQV8WVkpRP1lk4j9cI3UfdKhPMr8jlEmqLGT6mscDmrUwk pxTZf0jZM14o4qVVGycEldUbOah8D8vKd3Wa9m6av8pxd1asGHU9U4Y1DdZhMRGp6Gx/ohJgeM2D 95UarI/fGHnjBT7OT+xWkypVaGHUZ+JdNCVJJUWDGIgiywtqJ+7pNqPMBhAauFqWrUBJK3LuokqG DGrS6aZEJrq2HRYLVsnZZIwmSRWDwaEy4xo1TCQVUKqqIMFkNFMnnJpEytOCU0o5JJoYe6kaKRbb DSSaG71kqRyOaSvMijIqVJPJI/ZMGqlc5IVXOQQe7W2I3fsIJr2HSF5re13uxvOsybt+uFVVUMYH sUQhB2lCUihIRIlCHiDKP6OqgApoHBVA8D7oj0ofaXFOpJw3DGUWtcXA/+GYjcFKxA4jxPJAXt/E YMeBVtyh/opV/Xztf5tRlgcA7PQw34yH8WbdVzuQ8cY2yFs3o9FR5d743PY/adTqHzV3Km5o5NHg dGzkjd4Iy6FVq5NHBjtaq6NGx93J2c2x7u50Tm0HFgzheLi7Tm1StnZu5MHi0dm7krU3YHd2clYV s3ZdDqcHNu+Lk4OSdFeDq1TLRo5mjKvfda4nM2Tgy2c3NXE5K1auhi4EHJnUSWx57iNDORkgaNhl nJuYIrdhs8HBq7sNWHFTiqnZTxat2ytHN6MNXBq8XJ0VlWrCq2cFauzRkoXhBVbVCZcT0ysETZwp Gbmr4hjvwhVN3lX5sT0m68LWPzaXU2s6SOUYjN59mbAKlD4Ho5Zehy7Y1Iry2qSepw0wKmTEv469 Rc+vPfTQD5zw2BtUCSlkekin5Su03rtZpG3PrjDnG2lWHojKN0Q+/NurJsywd2zi3asNXk0aqcGD g8Gh5nBhYxiBiLNzzIMs4PQZsYM2PMR0BHUYjA0Fm5gzyMDc5LPHocN+aImqcHT2KoiPLbrm95FS R4ul2y9t9RCjvZ34K1QoQmiPTIOC+0yRpqOGZLRJNHeUEGOzKxEezY0JZFUHPlPTISd4RI5tcNZT BEJBycMRo6EMFHJQkhimCQOeu8tmWYd8ZlkwiBkjaBHb6svh0Nbap2/GNa48ee8zVehscTlCMIaN HNs3bNzZg5OR2at1amGipu6MMM+Sxp2kih2HxuTLyhQegoYKEFCwKJVOXccI5yEY4jhEXjdu0rjT l8uhQby2JQXq18HPaIyDg4vSaXW2ceO9+mfeUDdp5Xal4OqbCletLrKdcssWi1n225GIQ+uGRFl+ yIO49LLIhCFn9KjefSS89g6QqGDS6co4isvCVmcNMCpkxL58bi5358dNAPnPDYG1QJKWR6SKflK7 Teu1mkbc+uMOcbvaWeiOHfgs2Ro6DNeBo4NjYZo8yzBGCNyBueNnmaMLGMQMRZueZBlnB6D2xmx5 i6C6tYaL3x+RhoRucjRppnaFeQhIm8tttrdSNxSUVyqqWpIqKinETBJirVq0pKSTaplWauDDGMMY wQmCpgUJgqQ0RUSoxCjAyKGEZFRkZJymVZypZmaiIqzalkqaAygCqWSlSsxZKpSopTCKkqKkjIyY GBVFJFFSDCKklKgUVJEonlEC1VgQFSCyJZJEQqoWRJiRJi222iG6pNUZNRlEYRUjasKgUJScBg1G VI1DBIRhFQySkioyMEGoiLMqIiKqzapdllXERFERFZUpZldWSrNoUqEhGEUwWQTNMo1GEaipkik1 FJRUiTIpDAlRgTBgyRUVFRirVq1JMCmEVCYRSRUKYKkYRRhCsjKSYJUVmrVq1JgUwUorWomo1GDQ VCTVJKMipIyKZRTWjAzgtWrSRatVFxVhVtLCIiyzlksrM4Wo+p/UD2/R+f5u7+s806NH+k/d82R7 Kw4UYl4GsT1OY4B4G30ddGvjS3zlCRqVBjbfY3+DRnF++M7acd948DXUy+skK+I0UeYm06vs0PZ9 uVtZHyOH+OLVt2fGrbb1Q9zcNHdg4B3kn2SSQD4GBoPObOruJok7vM839T6zsGyxbaoPA4oy6/8J IJEaiyjJKrUwciU6o0b4X9VwsBpEhHEpadTx9V/ouFxNBsPq5Mpnz+dxe1dXk9lamiSVl8TGIZ8h DNhAzQxqkqEWMZYwZZppIhimMZWFyWxpKlG46aoRG4xjRgI1FRyHJRX5qYKfMeTi0aGZMLuYrS4T 5HiwbI9qnRokmh7SmimnjXBSaQnJTDxUquB7OKNTipVSqqk5FSIbd54XFYwxaxwxlEmj1NAxB0OI cgxFd4YGDFVgmb+TYHs/M9envw7J7rB6rJT3NmZDw0xcUcXtHKdqEVXJSgrgyFIVxxOm0rjrTTMu V0ywf4K3y1OHiWwQQdxjZhMksqyVO6ZVNYy0YHOJvGrmd5szbepTghPc2VvhQoo9U52DAwlSQoJA jGVVVCmoXw1mImcMAVCOTQc2UkkhG7LjwYR1eDgbr9LJRad7se0TrHjsHWEFIt4QRxBPssCzOkau 5lT5KfJn1suWGKu7qp51D9lR0IcXZ9k4q6DY5qn0eaaNiuLVCo9xyZjQ0KVyMN8sTojd4RP2aPER IMbGNjGzQjg7BlC3EBgWAjSejCJZNgkwjlow2VsCVlG490o0NHJ2TzGg5E3YR83FHE3fB8nr2Xgf +PR2ZEiGnI4/dgrz7GVKdWqkCBI6bdUNum3XyFQVuAeYYFBK2NCKwb+MRhI14JzKatImjcrBswV5 GUOIdsQI0MYgYggikIhYM6lJlWRWt+mu2t01111hpJyqRbEYBCu81mDczMoLMEV8zdj5A6HAgQhh WETBplHj2MRNKM+6YJCIZJ7YTifY8DByadm7L1gkhk5d5EmG6PJlFM9jyTiOTxVze2jJUr5KYbYs tMREkEnTmOTzRJs8wfA3GzrsyOyjdRWqv1VhUiIh4HdFMxwSVSqgVbbSDwJWrkywTgnWYiXB4NvT o0GtbIwqSz6Xgjslao6/+5j3P5PizI+NR1dTwZJI8nJ6mrwHf/Zs58LLZbLVSHsKK9WDDDBl78DJ LKlqVj1nHGMKyPZUNakVUi3+FxUiqkWikhQpFKFJRSkUUpSkpJKKFFSBSkpJ8XrMPu6+3XqzM55+ /jLrHhBfWeqioqlXH60Q2EVFnBmLh0ZpcKz2+HwcH4c7cMXrzY6OrcmHMcU6Joy1RUaNzkrdgbCt cNFNCD6tzVXF0cnNo6Mujk3TQw5OY0Ybujo2MK25LJsyy3cHRs1cHFMGzmNmGErZ1asOAyTLRwau asoww3VVYK6GyurDA+jRq6OTg3dHXS3dRTCpxc35u7mbHY5FblIxbaTihzVGBydRlmHQ0FMshgeB CzDtObfTmcYsRMRemK8Fd8IXGpOE6zb4pDBDsyJSSUKYyc0tMqIutTDwiM0K6DOQxedJvbEui2OT Y3OozBHJoohBkMDqYOGsggglRgYDiqjJhggHFVDCihpdLCFMZjN+jLRwhadaLdQRduqtbWzMcw1s O8U1tvZiarlavnk5whhhsWGxorQiHJZgdDDRoeIaJyp2edcnRO1qQXCeqva8mThK2Sorh1yyaKEZ oQRTKShTDHNLLKiLrUw8N3epjOOCy86Te2JdFyaNjqMsRycgQhhu0bHRs2bOSjkxVg4FFJKKQUcm CYFCikUUxxbY0D9ytAwhRwhdhm/ffk6dHFzBX+MB3uUdDWhhvtjiaMuwnGkw0evxJwHFRk2U0noK 5PSxJzGzDi+PC3UO07mySbln/HDzR81NBR5DCHAcND+btucDfZFkSIhuFknlTsZRHE92Y8U2YTYw efEgI4sMMLIjCiBGFTgYVxKamw4ndu87xtuLfgYGURCOTBGFJVbnBs0Roaq9KaYwYqTFmLimK0QE RW0r8yTdvUuq+1FL4QzuPc9MyxmMIhIIivg8Q2DVUxiQ4qgQ9iasEmpjyLhBCMxemHA6aW5hJSt0 cTaRoPGxFMTftIrmo4uCGFTwVMLO1gzdbExc2GcpyMMkwWcqlsiVUTBBTgPDg0YVoKVRCqSSVG6l V+TJOJwK1bCt5OfKuLmmik2VIwLEDNxDN/Jtuj8FVFJVUjbdaEV79TkPBHOT2b9TgehxdRPFCSuz PV0dRXVxI3MnJl3PDK2W3VDRNipVRCIdB1E3k3mmtxjGMYxji3YOx4bo03PB5KRH721CfNsnJVK7 mGJbZUjxlhhCAcEDwBgMBI8X4OEOyO+0lkbSBYmh0OJHElSSi40lgrfnhIYQkcB2lGcsFoS66ts5 YzOLIzM3MSkxYpJg0UMQNVVMFSWDBkhYwZBgzpBQiSibdPDqM4BleZubB3OgdiuCixA5KxgmFC6s HmcnIxbbLbSNxtOqsLOyZc3YX2MieLQ5NldJwe5hHXu8iafqjc7G6vSD0Op2KwxS2WxaqOyTJuMI 8x3e+6quzd6MPV9DCeLrgnyXf4YxWOTOMsVio7D5JFfBHf2e7RUquK80iEJK0FeJtgzi3AIVDbG3 SLB1EkMPM9Nxgdhhv3EklQvVtujcEEiTo6hqdCogNwOTDNCVeLDLB0U49nTr4MmdR8zQ5mRUiUbN exoyk74JGRq4EVVothbCwRSavNOzs3by5SeeEkkiHgcTkf79G43QaGTCcnGZSc3R4NuGjDUch3iF 5+ZM6lCIIo3EOrA4O5owsWt5td+e+a1mtak0BDc3IWfQEUHgiuUV7qhoYU4AwrgCRQpXZmZs6XLa mDVTBmpaqWABhwcM7RokpSUsSUlSScEEIqGFCUqRQpJKUFKSUUqXHLW959mxOLZG52eDTqiTiwnR +mDLiqYPE2OGUwrg4Nj6SRtI1E4Nn/B2/js8fQVJu1+biTk6vNVVVZZOyd5y5sYuMXGPB9inR6yP F5OI5zwLCYPserEfBFSk+DBhYWi2Klch6Q6HNUqo4u7TI3VGrirwYT0NDKcyKqFngMgQfmfcWHn9 zqm2UaSVEjKba7k3SQpAVEE08QyhI5xDmKKJ1jPKqoh4hZXGg6B2OoO22223XJhR60VqidU2MpOh hHiiOOhk+Buk08fRjBwD1YPFRODSSO6k8WB5cETuuqj50kf8+Jo6SnmanD3dlep0eKeVWp2dzAVV +uSAChQKAifjEEVQbLDj0BguoyAgqoZg6OQcSBuoUXpIqJ+58j/h18VUpSuPwyKnJYlelGDGM/BN ojR4iTwdzI2N2wn/ryH0+D5VOLQTzhlp7JmeiN1RxNnAOYwmDcwjg2DDRKehxTQhWWsrY9W6GHed CtGfLCXzuDMeBdJJpkqoSTOOwfLc5Bo5cHZNZJOOXqf2U1T9CqUjzJ1Uo+OV8HAHnQXQUQofUo9z 4IuGdY4iIaTgbDmNNYjVxiYRO73SOyMvyatHk8E4uLq1b1ayxgtdvtiPdVp2KmDBXPsjop8lScTY baxtq6nuamwweI7tX2VOJ4M7usc3clUlWVLKovIPHxcFPDR3Hq/OpzevmfNwMPByasMhgocaHxGR iAY+9swYNJJwcKstEvJYCcAEZBQEHD0r4mabEkgPDNEvJYCQCQQR0B4qOR1QYGCo7vd2G6OEst2S G6JRsskSLS1aWojkTkwcnoorvVh37F0Vo9vha6eyg5eHAh3eaSRJeHyMvSfoHA4hoMm4OAdZuLXO /f8BPf0bRBYUH3Xq1IwcE8P9jy+jyfNQ+NfICyT5NhDSB0lhQmMEvBiNFDkDej9DwwLzOYculCTq 4uRTslKiqRwZZFFZWWK2Xw2GW3t6Zs4oy2dXr1edetHAlkjosR/nujlZK+rYHFI48Bg2ZHbQnJ5R Vqppg5ybm8TpbYPQ/lNz7z830c0dE6OJ6usncsqpVttUki0iduzZJuU1YRwC/vVsJ1pNtXDl857n eafF4/BPyaunQe75FYeKZsxM1akhIorD4upD6jpAu+phuNAUMdbYWAWHpfkIL9wm46wT8BVQAL13 l71d4o+oXWJ1eHb+rJ9zz5H5Gh5z1+R3P4JGqPZ7OXnX4Y8cvNwYau5hhzVuV7FTg0asP0S0mQdR AkyEiTIfCPMooA7/1QqhAYm85HYdgmcVUADb19JgKYjyMnMPSbU9c3HR+PP0+IqvgNTXsn5sTKf7 3o1JHzPj0PqkkgHRgOC3vhjFYKxcLisSSSsMMsHzUp8n9HLBjxeSIGrgfo7PB0aE7PocTV8jZhNj t1frPAcD/Cq3TKJeK4nSczFeMN4iAZx6DrOZjm7CqqVUxGr6vJJHoXR+6fd6GDKPX4yuSleuhmSM aGFZSaO79Z6z9JoeKv0dsKOB4zqFO48DmZQ49ogt4eL8cCI9bOW+yy0UBAdHdhqo0JQ1FSYFiVUK iUekqYRQolPsSSnydDRJBkFU2FSebgwmiyFsLSfqxDAEPUZoq5fzkjSylLuRtK6GQwqBQQRTVJFN sBIGqRCBBFKWWPFCxXdyNpXRgQsZXPfArRQqooopCKopoKTCKkiSopFRTnPtIH3XxIp6hNZR2HoN 9idzLz5YviIgFqGY7S3s9Jr+7rB9B9omPF+wG3rJNN3xRu3evFwU8Ww6voeKRqfvWr4Er70P7ueA 6pgmQXkWFCaBDi+DYFpvIQ8z0GvY+QKaBdpJOTB0e7oZRJFO6YPj2eTgjuiB9psHBCTg/U7vmejU wJFTUdRhG7JT2ZGB+kr8kJPxObmn4NXm4Ckek5vebvR9GX6HFMrIn0pyKTgfJxdzq0JJtLK1fozl Hwc56eblHDrdf5mWjS0E07vV3fYioeIvGUbG3kJJKGG57mwGjU/Z827+G7VudDUckcSatFatUcZy A0QQbAaLgFlhoQz9389vjbjfjN/tj5vub6rU5kXrQ02pJCgQECDQQgk4PYdVRVChCmDg4bDkICEW 9Xc6new9psSojU3qLyJ1oW2bLIWOSijNQeZvc51GBzebeevYCmUznqE5O95te6b04nR93V7e56HJ K5pX3cJ+3Q8Pi9tXNu5uI2cJpz4zs/k9/ZIn7v4en389p+r7Ae8zmcDaPk9yoCIarE4kQUjcKH1Q E9HsMPCCfqhJzmjR8HinKNX6q0VhWxaK4PaJ1FiAqGhVLhBc4UCnIcTAvO882hV1vAA7EgIxIInM hywZOtcVb4fh8n6kgfLxifn4T1eE/N2ZmAIDzOT95wd5E/dqz+1GHxI7TJshP1VFWQtS2Wi2Qwp+ 6jqfOaI/dU3niKUHM8w9RgccZEFgOUILCVI2Vwq49+BP4avk+XwnUftPq5sm/VPuyfX1fF8pvh4z ZNOk1fJo6I0aPg9mr9kf/UxQVkmU1mVnCdGAQYn34AAEkCP/+F////w////8GDAv32AAAAB77vdv AvF130KIgAHS963Adxx9d9ndZ692u7uovfb3sb3KO28+d3ve3e+9nPemvXL3kPvetbMbAaokUCRK VAEipOtJABJO73wAPn3dAAA+jQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIEAAAAAUACSmsQiUArO fR73hzTYkr1xdivd3t6Nbt0fHze75315LWvsd97fLXtKOfe9z3qfZ95ifM+XtbqIDN5zOdnzd4fT OmJvuUFWsa1Qi6DQ6bYyV1rbl8Xuy9zhvvT2joFA9GgGqDb0c6ALx7q91gAodDQKo9bzAHr0r1vs 5fA73B9AAA+taAr32CdivrVXbp0K195ugB6y9AddaAooAJXffX3fH0KdaaHuyE6GXoBQppRF8gNA +m+lsIVoB9aHQGgAOgU6c33vdyw8hQ16NKvWmt0AABlS+93MAdcPQKj2BRSgASBxNgM6HRKgKASB 0B9A600PcyiXG1GTREU8E0AEAhMgphBlMpmGibUoaZijDU8gIgRqahPIhqeqj9KDT2qbKB6gNHqA AlMRImgICNE0NTKmynqHpo0npPTUZDQAJT9VEQQEaEaaNEmmQD0gAAAACJSYJBMUxqZojTQBMp6S DyaaJ6mTI00BUSQgEAjQgIyCE1GmmRG00mQDRYgiDUIIg9yCIP+3/1kST/7QAT84CgU4flavGiAh /aIr/H+uv9tMf3LY/bWvsaX/NPLyoHYvrT+h/Rfb7DMTgQA5102r+JhT/Tg55pGFdv/uK5SkP/tI L12BbPBlNyA//RYsTweC/BicNsXgtfi0r9M7lCJaRweP+kaMv+pzxVfIvv/z/n/crzoETrymrKh8 UxJ/Oux/dUzKrq9fdE38V7P9SKM+1irp1S79LT7xke9dO+aa6Zz4pXfy5zfw8Oaa5wTymCwZ8QgG bezauzbU5DXnzv+rn+VQxFRh2/vSjg2794S31bV/dPCvMCDVm6xK4FaXMueaUg7uffpDjp0lhPNa RoMhpvIZ6ObTEA0EPLukKJs4knwWlqRdvWI14lhj1WOqWF0SIS6ebGDnxjytsyCTAUC6JU4tqewo LoCTp+UeyknadIRwXFKqQSK89T/VSYisId9Bf0owaMTHTphhdnMVdYaSY/jSOPGr07Fy+J1FIcPd mr2DY5a1cguB5jCgPNHQUw2EgHvAIpj/T9/Ny6NqGHxwNLJeQ6q50CWMzCKeaz6F7QntEVpQoE+T ZxiMKQcQmULzmQekXgzEKRIw3ieuaHalJLA4RnBt2M3RHqPd8GyCb5zdfFJU3cF2dMdpI+jns7Mt usHQpzAngPQS0o08EC3WTNs4BS56H6dNHefR9bqNo1TTQuvKgmiyQSBSLpeiOBinm88vDANg5F6g UwqaIXR9Os7Tn/uekg9dM2i7uyA8GwZ6aeXbGzgGZDnqRqNS8ZoF/TAxfN2ELv4efY9LdhW4y//W cu/fk+gu4F3JOlr5I9CIgzNfIkXU3DH7y30ezjtw2bFqM5aX3zgLXfNUby83dHhiV8R8yJ3L622m b/Dtjdd00g2JuodWQUdBNiQDVya7nHo7HRKJET+GgR05u5s9tpR0jKMGHAnBtfMtHyqSALUGvhS/ 7lugFszFGXC0MgEBQX2IEV5rw4zqJ9YDBwLf3YVp01fAFLp5FJezRCKo4PPna/YbRkr5JchzLhAt V1JpnQpd4X1g4HXEhF0nXO7p0XjawN9j4DxuU5amXDWzV+XfMhoy869LeU2b6OfQC03M04Ljw50l MZjbvRqz7tEO0TUrLKLo4ZyPKnD4rwzC7bSTZ5vFHgQjfyRL39cIg4GyW4o7mBdISlhcR2sroNSB B1FLHPUIO3wtbI16uQeY5lS1NytiIx0qXC1r788zxjb9tPuvtrTs7mfOj+eTQeNg6z4fU6vS+vRA Sxjs9/o53p2g/m7T4o2sNbEth0ZjiwzPxDEZ5r9uzDLMcfHFun2J8dcuvf/+4RsOQAHRXenv+wEq JmZKJ9+ly02J7IeMTvNSjXjO1VVFdEB48JJelqG9Zu3K1mmsatYYgxlGdJA4GsDf7M12e6m/sxjw 4aYxnTVQKxRE2QEH2UWLapVoDyPzsCeLAjPkxqvKOq/RUkDRbPNk90RKO0AxF7rr39Dr6kFT+cFT P0+Vv+/6d//vd/XW/+KZ/pvn1/8/Pf1bZrv/x/gpS7v95/QUX8ER1rVeOZU/7X/P+qzfODVEpoFx 1RXaTCT3OASexT+E3ZRG9d/y6Sn8npqs/K+8BUJwVP2WFXadqY1JMH/KqvG07BIypQlSKyk/sz9u AWXTXaq7N/xpL/fDQHpn489l68vVM6Np9/H8z38R2iXUcZrM5dvn5V1zPOi6x70Lr31ugEx9r6JR YFn1KfdY4h9tJvdI2bgtHYdQGRNnJLZ4aX1rR6Y0rYZUmqLFVhH8qVfIfNH7p7ayBzLgIbbOlzGE AL/fZu5Xzw+KBqHlFfGAH2k+9E+x0gKyIJb3aOM6NVnDKCjCoqkzDMCLKMxMos6LK0KiMqgMMMjC wzEywosKsGMzCEWQUkBkTETSW870CpSlKew/hX8bU+n44xa0X9UTTdjbpjQkYsbDLyNCbYhKMjpK VpZ/KhtBVgqIXlr2xARDdBFt+X5B9mHNcw7S+XWv9UmBW/PQx6fEDIgLj+Pon0Ig4iAU0+n7sUcb t9oj5OfoUYTmCiIMeUsumLe0+fp9f68P9pyfpkVvmKoX9ylm7+7s6U2oMP8UB4UvDpx01EWZmMzN mrS+sVl/cRnHpVVUTD+Jz9fr1n6dWInYF+/HLP+uUVo57thh3bjd+mhdBIRGwxGEGc5fn+dV2xDp pzZm2D9YHhY3HahefBnwpmDZN0HjcPUTEvp7I3o+EIOqyN3rsuTRGQnEKCYrj5vvCkXuO59TP2Qd IMkFPhBWu2ZN+G9bDo4yJCATbkEGOCAxBhWGV85dOFuNNHpAoWMG5XYbKEfWYWfyUp36UYwlPSAC Ics/15IMxId4lQSFykDhIU8yMQQSFDEbEFRCGpO4IJTn8GD4uERn5l2HBl5GQTTMGJaodH4KJbpj lkxum89w2oiIiIiId3d41MoSZMmTMoSZMnVHLsdMmOstnMNqIiIEREQ7u75utJUoY/hkx+bNQ8z7 EsZJPRJyfsSFREYfdmZmd13ELjz4LIO/Ve+xY9HI2XQT8lpq7TMJSk+mlFEiLIhDwPOdqjPWWYE+ 43AemzRByrUniImIiHUhNJbFq57qx9KT8xR4FcSmO2deELbNDlAAcI+ctH79P8GqZ5p1AJdPKJh6 02hMYdga/XevYQHJQ7WGQ+Cf3IMZjYfuQOOtgYUkPgfCELDkFXYuIC5R7bTOAhMQuPJw++d3aucY 68zfSnfhukMgc2DXYtAV/D2AE4fRAUTSAEl0w8kWnG6ZeYg6p01Uo9dreqm70YD7CwbeRc5fESsh SOWWCV3HWjKWoRzfm/UpL5wZQ4Ig8z69cL2cZhfQK9rT5z5qjCIh2MjEe3Z+T1ESOU9HVONDsJio zEh/jBh1HKPW07Wq5ZBuRAZ13uu9jMKhB6BWuzmERAZTf5heGu8ApjTrLuzMFe04rgcrj7ho+znv yMevM4Q93gw000v6XF3fzcXNHiZn30zpuKCsk7qPcZu85zITyaZ7+XN4Tv0uDESzAt7V8AVS3BSy 6eLb2kDR+AP8xW5gKhe93GN30kl0EuA6iYlvI0V0A45m93i3lnfrsiGPkRGIo2RxtJtxCjZHH15Z 5axabtCjZHGQiREYgJkQGR2afP5/zJ4bCDpaqh8ni+L+NRXqvh20Bh8PgEfscG9w6j9vH46PyyAC LuxD7ypU0FCIomZmQF7N7VrV2akjbC55eAKqvB08DGxjYxsZrVq1q1a1atIiIiIicZnr6WdNnwlN m6vfTqr2cb5vt4Ko1goDykkkkkkkgAZmZmelZmZnVV81+LC/T7atouBaqWxotCQkJV6WyItCQvlX v48eXf1Aoyy+H7/rL8/w/r9D/X9ET+PNPr/H7e7+Z/uIfOiQoJlO67wSFYB/MiyhmTjSanmyWaP0 W/93xwOpEfzY7fVdbrm170qNGtSF7liOk4V2kJWL6wdnXptTEtdokgFFYPPOjHFGOo0dYT2d9zho tHa6RTqMZSnt0XpLFvVwZxw7+adcNeoh+Za2zGD6YoXTaYWhG3koB1hvDXpe9O1KPduwvwGtHWiN 4hH/D3yg+UZRQGHdxrMh8uvZJNZjdpAIVUMPpAQn11zsOyUvxw7y+f3+8g2+n6CDpdvx0PqW3HwV OnXbhFhtFBLuvwyAAgAZB2xXjEN33AR7ZSU5fZvSpIOI0YSLIIwWURZGUWRZYZlFkYZZJlhmYSQZ AQWRlFGWGYURmGZZBVcdfztWvz3rc/e3Ixj/nPaZjdwkl2Xd3ZcGNkhIMH/bn9bKvBjYxsgP+au9 cuqhau7Icgo/oAdgvSSP8CB/MP3/0/k0/0P1/ml2eeTkkiWGjYPB0b+Fx4bnh0727PZJ5nA7vJza OHr8W18tFZ6JPSUDwZ2EjkeeJcwQHIwGbG5sFhDtKBt/OSspSlP0LnMVDU/X2a7P5Z9HSY0ri+MZ BMPNB078CRvNlJgw7+pOCOwOKwSCQT48eUnXI5cJMYg3D6BYwGQu0mDPp4xp8GGaSYM2CzuTEkYJ pe5D++xbB8vp5NvyDY9Cnsp7PI/2L/1t8E2TX0te2ZmfJ931QQBOgCoKfr9qdfT+VTnu7c66a1vY tSt7aa1prlzdOW/s+nr+n41rWtnpsvy8x7JEJI/4o+T7mcxI+wQ/dtaz5PzdzJl3UySzRR1RQkCP xPl9/XJJO4bGwCEG/6fn9PpfxdpJF40NyMb3ve9Wtc8uOSAASH0/A9r9v6/W8vb9W9rJmXQFVVJy 8wScvPw+yWZrFts2sy8eYW8f0uJL1VVUSIqadjDRCeHdoLlREd/kSRjFH+z+WH/Q9/z/nGZmw5FJ 7q8/W3DFNuKkfj6btPAgigv9Eke2l8z5qCiUkZ0/JL4BBDx5W1skQkjszVuMdUYnsVu/QmpKz9d5 XXsPieles58nyfq502mrQ4Z4dNDEklNX8yN/40reCHeDBDjHA6W/5Dku6u8MsxNv6folyPqfsA3D +wAMPM9z2Pj04pt+Zy6W+XpbrVunkCYUhJ+b+70ehW5wf/gKAooDj0/eeiTcclJv+Af5fj/l89pd y/6gcg+xh/uU5rbf+Od8uXFk/5DRHE7rkN1tt3P0f0cD/Y7GnhHIOyx7W3Ld2TLWWqvy0cjyHg8n Y3PyOrkMPI2PADK4NH+RoNg+gINwgIKXXX/LurTVwvmHj+Ont7aVppX5M3/h864+EvapW14fcD2m pUOJQ2H0IB+IB+QfkaTIzIxyD3hIHy+2qGiInxBkEBFg/ELg4IByP0nL2kk9jRrxiT6lfYw2P4Hy CC2WvVqOMcX8fPrimfiYYREmcSARoAjv5/3dj3RZy8M8REb77+DyP+Jkdu9uSpVSMafDk8nk+vTx 32/FxZmTMDR/cCrl347W5L+h7HofQ/julX1NizskuVcxf2i5i48krPQPYPQh9l7scjam50BGG5Z2 Nq0qTDpO+76+RcJmIRsaGQXty/ap+P4dda19/zQiUT9L0wySRFVWtSLIq8s5DvMPF1p3Jv1E6G48 TrPUbjBjsI9Z6zjfbSlO81UU7pICz3fVo+Xx9F+6fq835Pz1aq/KK/J1fROT4VPJ5uj4cjc9G56P 2eokhI+z9gEODaeBz14UpTkbwd52dhOACoKbTyBEV6DJJIcG78nJ5uZu9Xy+HDybO7k7N30H8u5j zJ+HgHDxnGXOZ3ZNW6zGZsV2V+7Zj6Tytsq9mjm/D5YeHw5ubKty2vYQ8zxPd+vtkkeZncNjqehw AAUH8iig/0KpFdC4egXmCIrQlCIdfj6fT2Z3ZMdVaaXtbdxz4585hlXofR5PZXu93h5Gc/NmZbez oBIhEGEWDp1DjxSo6CIdDECIQX0FQ9fTX2Q3LPs3tB9HglTmcEsI1WFijBTNCMTMqgdQmD7CgVpa zRal69u/Xq3Z3t7gd/xAD2utfffjfG55+/TV859tz9JcatLWtTWtJrQQJD6XW7lziWOJ5HjaQ6+B 2a017YV0tC973TJwjJDtPA/R6zytnm8iISR8+dvkOruwn1fD9Dn/S+nu3PspLbjkku7u/cs+PAu+ 2y9Prblq+/NLseDzAQkGS9d+X7VrFlZnvez3hoFAMAmHUAHxvceQEByi1pq5553xCc60mtBCEPpd K7WfIGI+fmlZAs7HwHucwODOqTHnwN+w3BvzTc7rmzMw3TvRaxzdnscey6dSfk/QyHI2mo2Ow8Tt PRkkklywbATIQ8Dx9W/E7XJjlvXepFHj5L3GkTG61lPpPud7c7lVuhvuIYzlgu2a7muLN9xd9knM +3e+Nr5Vefh66t5fEzkDGc4qGaEkjIQhvKHEeQaHcQ0O47A0Ob/z39NNKaalTmdZjyhIvb3k9x2+ shJPB4dHNPh4fQjUkn6e+LmScH6vg9n572932zpcuX5Kr6HRu04bPq6W2bPscO55nyaZEmWeZ0MC kVX/M6eL2pNzgie7ckD6nM577FL6DIFj537/U+7+6rzRp5qqd3qYl5BkTLs8Td3LEkld207u5d3d 3dpCcsTbcu7uWJy5bu2nLu7u0vH2f5V5pDY5bgrbQmxKtqrbbwREk08P0Twer0dNei5p6tPmfPg+ fXwu5btCaeKS5IxuSR5YxJIQgkDefMXa73FqfYetuzuPO6/gdfmeGlVff8/yPE3kLUjS+Jtl8q8m tt7SJ9EMWfdV7/X5hfC25KJTu+0UFuKYM0FmZO45YormFuTXGAmLNhUeYHJ435PBbYcs5dw7bxSO wkDcBokjqJN6bkZEkQrDzII2Dudiz8Dg+oOpw9c33XRwyEISTZKJYpay0KlqUSSSW223SRCSN3gB DW9tcZrUauamJwHBXCTZ6JJHCFKRJQklIjABCAoqQWg1FYQHxPqYAVBTAa2AkEiKqoQF1GpBdAVE UwKhCBqUFVULgKrc0AAEIQFRXUroyLDI7O7wpTlShppp8R3h+QTyy6BLpnA8/alMvP1iPo4HF2Iv 1EWe+uWQulOiVmtYZLrnhq25eWrmTAvgesg/gUOTW6CrYgKXwS3orCG03U8W93dPB1pDRszN9pMN QaVDj3y2dhKjmB0Y0laq3Tb/DP5gNu7f4cQN+6po2VuvUr+PSXwB8Wl7h3RB2zYLWNzgUELEDRbA JEOWxkoge+9nqfDYRAg+jZDndUQnm2mTbl6gJEwQpFzz31pIjTeM0oq9m9rdTiOGz4X8f1+Xi2sZ vjDEETv7x93Z/sSKQ+8QL094uf4dy5ReBl7wQkv34zPx3HcNSIGXu/Zu28nAzQf0UDmCEYCEIyU4 J1dCKTSPu9ZfP5n3mM5ZQ/WyeIP3Wotvtf3/XOpv0WDLNlMndvavH3f5XL9Q7+tNr+HFMXIMHfym PomJZJBY5rl3wLI7q2BPsQ5M6kqTGXVh3EQCWEeS7PIIwu0QSEhpIGqNpmsPfuziTn15mfXY4Cnq 7r5iHp39fHp50REZ3oiMnq58Hwi0YRAYlrXTtn3HyPg/IQNdXj5QFuoeRMMEKYG8wmYRJfSkYQlC B+QnI+3WWAyEeu2/1/H8e7d/2/s/xHL+xfz8v0/N9c54KH7UUZucP7Fi3wnKPxk9Y6h8bzAnauQa bRg7W36OteE9QCmy5QOsBso2oqf2/rMPrKL0bEjn0iUOKbWfpXTM2BNOFzzlFuUm0l5Ypl/h9bba RqulyqUZrpfYnJornzje8qj1fq6KDtptbECDFDOhQOG31i/FulozXOkp5Ukwur9frhpi43jLR3NN kob/1exjYiup4z65ds7a4jmtzd3d3vEfE98qePaV7mQUQ9Q3LUZRLw2+HPLu2cu2uwZiBCu5kkrS 2M1Yi3fC7iGgy7MIubiIiqqvtnWc1TNbvOYXtzzEZOc5m5ERKSnqZR8OlGbQrad17bvHnl3cQKh6 zKnTxIcP6bw57J4He+BXnQVlnbqWYv0taCvCEXw2LzVRZ8+dURETmXbz93z+AR9xZfBf6mH2j/UP uL73AWGYxEZEv4CRDAi/pIslLlt1+6RLSeLezkqEP9PH+q46/voeD41/M7fX66reV4I6heFEPBwx bhdSUF/rqo/rLDPNuJdN59q2I+Rz/sM2i8eVrJAdR7nhP89hOTiu64TlZCbzNw6WNQnRwgUB8frI FDtZ8MO2pSaZhrLR59Y8RKT6WTYaBvMgdVxl1fzJVzDUUhe6VyjAKcuRVyo1VcRuIUI3EF5seWkL p1l2319Lcq6hCOrh8zt5QR54ptF+Zb25o3h+nwATdZuM2s51uFdTQ32vZtcWeGKWwNWMqk8fmIAg gQ5VsBBSeJFXzpV668ytvmDMluGQUBail9ucJvwYOBNR7jpj+H2fXXo+FrgUqZxu7QwB9IIqj7K9 yh5N5CFCToLFHPgdHS7xbG5Qyo+IC9O+jS1LKSkBRUDyEWkW69IJcd8JrKvOj7jy7gYiSHTpvXiT YfGIawNM5AWbocFoZRjExNClhDB8ic056SLVzmBD4heM4G+LwgrJhUj8unMuq2aPy5HGmePnG7J8 6jjzQ6wM2sScaMkHbPPtnzuRMi/alt4jh4IARwNzhiERix42Y6TITC45Hmh5ZbCGrMESnpngwMos E7uxdTpue1Ee17EEHSYDVavgMXcoZYFNSiC0uuDhd0KXG6Jm2iJtOE4RdGMAkinTCoo2koFu89NT eLdHJCzidDM5yB2OrvNR7eInwvnd2l5UebmX7hNPmRCQ88+FxFKd4T5ieIpltxfxl4plGw8pZeiZ 2nzmY86m4yxHNtznGL3s9Xyfak9FSQIyPAjEgxIVnmcINATVC2zOx3oG2GixR69TmKnHK5FVBufd x5ZRvutPkMVJxy2sw/TfXl9nyNHDWg2kHNH5dqopkCbpg5kQoIRHD0PILBBdLqwwzMIePTsHptC4 4GA5UFLiQjmfLqYoIj7MnD869fKgZ/L4q/p8FTnL19PdUxyhxNGp0qYXHD6DeVRvR+ZdqUslG7rd ZOShGDeVU6jeJs8Na6uTtxhd3xxAcRxuF1DfGDq1XszeBcYgQhsToIETEaRffunHEYOjshPf56lW Bj1sGougJc8zywgROknnjlLxcpBM+koZqzJgzirPAX3dc7tCTzEIhPV0ZstZBBEyXlMpOwfoD8sl EMrhY7nKjsn6kciznFgfK4pBWbEHDnqPMXCM48aapsvZ00TuMyK7MiBKTRNN771PewqWdiHAhBXr 6Zyf2HuMb8Eo5cbSWlcsDphOmQaDKQy0gk8sxyzTYnHndwZP7kq0oGuJyvduXbY0rwJysB6kB3aD 7zOpzkrnauizE7XMYQCgyDRcRipIQumlks47gcZcZ7tvRxmvEbPcr5lF9m2bLfLfNyRotxxbzEOO AMD5+161Gc8JbVBkcyPFyISFHA8EefSyuRZYuQVwJA7OU0KFtsHZ2TSLIAEAYCJJTxRXBDV71dSM jFCA7TSnUn2KVh6XFA0M4DxZyGTANwK5vPcJEDqA6j3LoZXeW5aQIN7xgSvEHVCs9zdsM2F2w0d6 n5v1kd80Wbc8uN9dGoqfJmRkHZwJ6nNlEStQEPA00F8NIQYJy6YXNwZi8X84BLDSYak1bLFqZ5Fe 3tEUDNOwdVYYFd+vWoEnRfPutcP6Pb69M/jaYXhm3xx2g/BWbKaHQp+HDxUM3HEcPfjcSKgAAAiI 9JeYZVQHzpzo2p1h9B0fssxMdtHj6pjFcsoTpeyXquJAs1pEVseLuFQxdLCJBlkEssgAByyABUDa d0Mee6m35nq7fn6dXZmkxbNNc67NngFdFkXn/nkIkQEFz15789M3mKGVA3Js2L98ym9Xw6+4/HWp 1GRQR9aTmD9zo08fdfx1lggdN6p9i3gz0f0jJ/TnCghzomPx2NUHr5+vl4+KAnvLgV95/aEYpDmB IRMxeJ9zkCybpsOZc+RuD9dnduTV6vPuIE2vVxK6Xxo8CixsAjJVM7O9a2/EfmVezL+DV8j3OtWy h/HCeIP3Wotv0v7/jOpv17Jw61kpk7t8r7X4LjNs/UO/y02vXFMXIMHfy4EBoIG/Gbi8ODf2X18C Ht49fP07zREZ3siMns5/pGEZP8TvOgDQtdOXdR7+znaq3JdXkCQc8e0BfZ49jeKIXsBvMJGESWcH vi95+gnE/I+qdMsvDuwS9QpCYX2/PtP4J+Xp5L+A/N4en6fg3uDlaSYv7e4Zt7wUTv8HLOUpyqME EolYZwha9/6uq2J2oUKUs5zVf+6YbDxKC4gn9jcR6uvSCsJ6ujUEm88C766OYUkxmgP0JobbTNfp a892T6FS/03/dcSq9+KD1O6qoOSurpPFyp9kAZ2zunHX5yhN52ilv44zZcyjFA/i820pucZC6BxV 5PXM8Svy87S1mgNOI1MPeIe39C/P3kPv7H+AIQMyHMUHJRgIN8isXxH7wdMw/IulmX9tfntllGXy xhMVX5np1069fn1N2+eOy9GkL3ve95n7S/D4+xfIUAUQ/cH2F7vtifzb7cWgH3tif3a7ByIEKjGP AKG4XZ7Iinwjzd1nMzMzOc5u6p2iqy9Ws5qriGgy7CxMNCbNZmIibqv9GtZzVMwzlojN1Ump1lqo +ub59V69SlWdRa1lmiIj7Q2/CMLM0i+Z1+ThfxLTsfzHyPSVbPiGrcT1fmr89ilB4e75F7x94/cK Cg/e4nCg+4fiIj83EQ/IYeqa9hr5bDf/OY/k38mHH8umxl6p5lSYhCSEWdOUWdB5H5bc8efNsjHW uhm5u7ZZTZvJJwSwyA+3O+9/Xmpdma1XqFVYcceSbo6PvhJPB4P4FfxJamPR/p/ChWP+85QbWpe9 77FBVD/UDmBQVVh/zIiSaR+6Ob6KVVUpVU/LVhatySSSSSSSSSSSSSSSSUskkksSSSSSSSSSSSSS SSSSkkkkkkpJSSkkkkkkkkkkkkklSUlkklJJWUkkkklZJJJJJJJJJJJJJJJJZJYkkkkkkkkkkkkk kkkkkkkkliUklJSWUkkkkpWLKkkllSSkkkkkqSSyxKkkkAQEBAQQBAgEBCf6dCAYdLPlDT/j87/j X5Tp+mxEVa1pVve2I2Jwm50Fe9Rg+0ieWGCrZ2S8jnjOitO1Y4Kj6vW0b7775221cxsFDxvrbff/ gLGOBQIBBBBBBVVV6H/ZMNKVSbIP+SDH5lNpfH2NW5JZK+tne3ZuSSSsWFf+Do5uTZ/f9Vw0sq7o CPq1EQkipoVJIqYMKwp6+2XMmySK7sbmmBjCYIxSYqJj6tIh/yNmypJGlDHJiI3NmyQpU0MD5cMV sx9X7uhpWzHJOiocmld2kRGzZ6v4TDkm6DEkp/q0mjvlvVIaYKlRwmMHR+7ZVVT9ysSoqJFKqVFO 5/DkiRGnJUxMHhjc3bpubDdhuaRilltqv4KipXuiSThBitkcP6qrRyN2z3f3N0/kkiFN1JzMIxKw cjcIk0abGHK2xIorCFPrbeauFbpolRQlHwcOScjhUqlQw+jZ2K2SnU6GNDRp0V9Xq6NNnHp8aXNb 220p0IrEJWCFUYxXTLcYrkbJj4VXBiRHCqrY8nuSlTSaNkx5+LdjorZ1OGjoxiPYQh+SSIcGzAMe TB0aPRW5FiECBlUI5cdk0OBJG3ZgBggRW7FV1bTi3RuiFFTUy2uCmiLq3Ekxg6nI00NhyVExpiTg 0YVNPN7tBp0YxOGZbiuqtEWyUrEzLApJSleWtNNOa1ot7qYSKrzOzqaO8W3disKqvPlbjYo8iJ9y YpOFPR2aaU2ts4YqmjWW0qncx2aYqqpwrGm7SaaViKrY8mKVXI4Tc2OBTA3MbI0//xBEGmPuxyVV eStmisUaaNE2VPciJJ+bGIkklKpw+WGFMf9zw8hsbPJK6mnKxKllSvjarVfS3Ld+/yBqzn1AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAANV7SWVdr4V/qw2V4Yj6KJztscMY7vQkiGSRCNPyOCSCkjE9GyeFV ctpWmzYpior0GDDdhsVpu2GhJFaTccHbmqrw4OEYxiq5NIcEg05t1USSD5PVOyJiaN2rLMtX3SSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSUkkkkkkkkkkkkkkkklJSUkkkkkkkkkkkkkkkkkkVVVVVV VVVh9Xk5t1Yxwx2RzbOEKbsVjHI1ls0+6aeZzNMYqlYxiFVUxJKMSIjExGKkjCRVKmKQVUwxiqSU qSqxiMSqmMTCYmGKKxUxQqoKk/IwmFJ/qJJKkbNJjFExUjFTClVTAkl3t0mFSaKYlViVimKkFVi2 2TCpGKMYrBVMKqTErCUoqqJFSYpUpgqqlVUxjFYrFTBWKwYqW21KxMVSpUkRVUmMRiMURMVKMUYV jEYlMYrCpOHkdvvbXJWxDg7Oaad3DFP2fnV0kpp2JpyKaMRjCqSvI6qwNJo2KcmGxUrYqpUqYr8n gbGn/seTTDR4TTDCpipN0kmJIknypCK0x8no+7c3T/BzJwREkpJJJ7kkQqGJFFFSkpKJ8DSMSNB7 ICiMRSUhUpFSo00kxPIlBycndB/ukGyTuKknRPDoaKxhGit0hU0qPkSSYdFaExUn1cMRioqoqoqo qoqoxSSVsEkxJI5ipI3fVW371bJ9i/TbMuWJG5h7HVU+6hiqoxU5bW8fa3TTZKbOSq2NOzZltkkS sRER+Rj6tjkpwbsbqmxjCqVXNMTk0hUnEb2221sbKinVR+Tk2T8lTYqVXJWJVemW1mLU5cZmZJ0U 2VRJCR2fg0mldXNw0nm3kGbXMqvDoGkkqfYJJjzU8yugcObTmYmyT9lSFVVVVVJsaRWxWGlYcFbK 6FTZsU1ZfGSSSSSSSSWbrfuNxhXyiQeiQ0ezZgpz1bs0KQbKTqoTHMSnN1TZ9A05Ju6nNyGw+Uki RiYcyuhyVmKtuKxkcrcYVWk6uysbJsqqzrbicn0bNOjYRjRSq9DGEppVSck0wjTFKVMYwxJMdhse 2raSpVVKqVUVRVKTHrxbVPAk1ltNmLbZsTTSqmiVK00aaTo8InBs2VwFcKqjSq7nZJPo9HhW70cm LV0dzEiaVXjPTMzySSTZubIKcmJEweDEKpscst8HVODGlVucEd2NNiUYwpujTCrTM3Sy98iksSkp JJJKSkl2tWLitSVLOkzNC59QXz8rbbY3bG+W10c2NJ+Enqch8Ikj6UhJzEkg3VBVFVVVUq2JYliS WSSkkliSUVVVVNxBJHI5KJbbFWJ27ZmZbfcxs9lY92MeR7sOxsYlVF0xtgMRZoZ6AeRgaV5kOMeZ kxWCE5nNhpUp6qoVSqSSqklVmUvaSSSSSSSSSSSSSSSSSSSSSSSkkkkkpKSSSSSR0bGnIc2DUts7 GMKKUoUpZdZmYxYW2KU+8IIgrYeDyNcW8Po0mS1bUocinI0YngqdGnZVVVVVVSqSqo3NjPUBVllr DCkvnMtMKVzJJSSSSSSSSSSSSUkkkkkkkkkkkiqqqqqqqqqqsdkiST0SYUno3aaMQ6qelt02KRH2 dWJNlmZmWZJcRPyleEkkkkkj6vBzcN3JiY2VVaEaK7MbNsLjEmFTZWDBhsxsbNmzGHQx5GhNDQkn CRpjdWk0VJJSsVBJh6tGW33zyuXLpRJw8wxqKvJiMKr1Mdrbpist6VmbHsps2d0YfJU+C7WWvfyt 01bVXkwqn6JpJ5qmlOTGcVbWMKxXc0eiqkk0w2YxWN2JqrRatKm6qr3JJJJJJK3SSXnXasssyaaU xQEORNNmmK8HQxGnqobAhiICKQMRTP/h+m/z5/h+abdNXeRfbWvs19VN299yMk0WlZatXutRmMxR VNnHcZTAdoSwYLzLSaEsvzeGo0ZapBIRCZTaCZBoUJ2XbSWW3KFVgRLtwQtLGxkzs25aa1w2lCSJ TbRkJCIta5bXxrUlbWlSl7aOQ0SyRMlFMTwcPKJeaapBKBJUM0RqozQSLG3dsXcOYTKXlC5YU6UI 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 NlQbipMYlf7HIxPy5t2iNNNnY6tyEhREw/pjSJRyTS23RRUpycm6bm53MMENClbt1eonQk5JJPu5 EnMrmpSuFE0623BSmylVEpyObo3bjxOpoaTsf/ESRIGwiabjoIYaYTqSnR3OHCtxjhK0kePQAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAC2223JlSvE4KQcHmR1aEJtpR8bLGo2sxptVuo2yzZWSWSqk80NWqq0TuT5MPYp xeCR5vESRDgEkkdDuVKVKVVKpVK3eA7DUwMDR1TzVubHo9GzgT3PyEOiEDr9f7FVVfIPUgeQfAdh CB3I7D6JJ+fK1bVtW3ZPJDs8uFu6DGLZzNlMDKq7DRHoUpSlKVKUpSlKUpSlKUpQpSlKUpSlKUpS lFKUpSlKUpSlKUpKUpSlKUpSilKUopSlKUpSlKUpSlJSlKUpSlKUopRSilKUpSlKUpSlKUUpSlKU pSlKUpSlKUpSlKUpSlKUpQ0NR6miT0VOScFerdD7KSMvgfAyPgVNmTRXRUOiBO9JFJGp6ojU0Ekm j6vyn2GQkkMKTCVJOKUJhgIwNkklHA+D2HR1diR81eiT0xVuo87attUfQaPmYEXN0rFxWLdGXgqp HFHgybbW4T4GgYRwcEwioJWzZlPUI0K8RVFUZYYFUVRlkkyQVNWWCKqSVHNRhI0SUQ2zbrjGMYqs ieJSlKUpSlKUqUpSlKUpSlKUpShSlKUpSlKUpSlKKUpSlKUpSlKUpSlKUpSlKUpSlKUoUpSlKUpS lKUpSlFFKUpSlKUpSlKKUpSlKUpSlKUpSUpSlKUpSlKUpq3SNWx9RqhPQSRD2I2RlGSeyPY9UmCN CNEex5I7BwZRhGCNUhJuN24w1TZxN24TVqOPa22223AAAAAAAAAAAAADsNlwbX5qy6sqw8SlVPFU eKmip7K1UScxJJTRUaph5O9obKyphU1TRhqqKknFhorVU0FOBQwJGRI9mEykJKlHu3HN2HoMjdN1 TkqzMyu937Act0DLxK/F2v2u950huOZk8kpSVJVSpUipSpRKlJSUipUqQlSpKiopRSgqiUKlRUqV KkqUKlSoUVKSgqUhUpzd/RaykZPNJxavMjmchxdyVq1VVVVVVVHRwcUjzatVVswwqtmhllVYMMKq qqqqq4sNnN2cGpcDGMAYxhwMAHr+Pq3Hz+I/spKqqqoqK/LW2s29f2RdvbXdvd2reru73qd73t9x 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 KSlYpFEqEIJMTKMUCjBqtwIMICeUOLakv2XFoAPZZtWy6SSxpuQXWVbMClK4utxcStu5yVuri0YZ VybMMqr+jzNG7c3ZRXcElZcWrDKuLipVZMqVVUMYmQoyhSF724Q9xwX2N5rlJLg+RxeFdLvcX13x ub8gBAAAAAAAAAAAAEAAAAAAAAAAAAAA4ul0ku9eTqjRowww2ZREexUlfo1atGGGCaOjLdqwyrPZ boZVVV/I3ZZYSHEyyYYYZHe0Pa1aqrV4OT4etvuYbNG7DdHk73arIeqjzFN27grCssMO4hDCkNw0 CwpClKeHIe4U2IQ3KR/2kAhaWuDkuNqwqa1CS9eqmWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SVVl3lnxvdycXtvZ7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOb43urmc3Bg6tGHtENBDkOrRuqtECZc2HaVq1Vg2Y ZVWUbio3OrA1asHewyrLqwSHgh70RGWWWOltdjxV2uCYdHRzclV3OrDVyVqrgnFUMtVVWGjDLImV ZaNmrQw82AiJyENB1R2IlRhAglYSu0dj3o6iVGUeap4OxxdrRHNXRW6p2CQyqIVQk8HcNEcXF4sM N27DCCGytGVVVVhFVyVJBBhJBBSsuDrbaw1RxPE3bmqlVVVh7H4K0O9Wh0eTqZTRwYc1ZVHR3vc0 NlVqTDDZsyy0ex3tGjRwbDMMKvBvCDGdDbTbNjkLDDcpTobHuPAw0bhBmjkYcGjRTkENFKUpuJUy 0c2XgBBNGVVVVVVVVVJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJSSSXNtskkkkkuba2 SSSSSSSSSSSSSS222SSSSSSUkkkkkkkkkkkkkkkkkkkkkkkkkkkkuLZbbJLi2tkkkkkkkkkkkkkk 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 NMXCRfYjHTuRekJ7nsBwxj7HmRdOHe2aVVVXNuYxelttuHBDq7MDdswicGmIShQattttttAAAAAA AAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAABtg2vylbuvtVyqvV1X6VXJ yVTk4elt4G7dzbO5huN27Mq3Tfa3X2A8rkvtfW9qvPAPVc4Byvc2Ohs5qqsQmomVbu8WHk252228 jbVW9WlTDba223kXFrDweQR1cHHFttvMxXVjGOjScEkFQ5q3vatf/tttVtXv2B9K5wDlJJBKVVgp VWD6Bsqrg9D1I9Q9jdu0Rok1523i3d1dyScMUciThzbNGml6W22/qcz/J4OR09rarBhDvZV+F1fa 3VclZ4JcvuAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6uk8vtX0r2quXLl5LbwSTzcmnPlVvJ KRyac2zdzQitON6X8QGRYBkWBkWA9C4ZFxyKVTyTmSaVw6qnN1GJu3Y2dHRgGGTgCpQUoqBATbyx pN2c4zm03EU3VDuSKmKmzojZE4bt1VzyreTThsdxueakdCbOFRTRnVa0aPRuR3uzY5OGZVuKTdId XZE0N2yE6Zbbb2NMMMbRq223k0SNDRo0eQhpuU2YTc0wqsPEo02dGjk0qSfFtkxmWz4StKruy2at s622klRGypzeLhXe7ldnbirdNOSSQ0dF3VV4KY6MJnfbbbo1qi9Dhy6qr0KFIKVVg6GBD2UYU5NM Nb2228GjckmyRJubDuRYIQRDpsi4GRYGRYJoJonNRVNOTBsFOqbqGGiSOTyIcORzcHDwUCZtVu65 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 U+yyVUlLJJLJZJKyVdzBgiqiqVKoqlFSpMp3RxYanmw7tGrqnunQ2eavhXwrc4nNhJh4q8WFKrya n02c3gw4JVEr3bPZ3RRohStX06NSOrybPNk/DDZ2cEbMvdq5MtT4YV1U9Wzg3btW6ssuDVwErmap 8k8WHy7n04PsV6vRzfpuwQnun/s8yIknMoAVKkiKkpCqgPMeLDdJPhl4NGHNhs2avN8vlXdsat33 V4Ky4Kr3fsRll5sMOrm4NGjkwwquJ5ojwa5t8FfCqeDRXck2cXs1SU/k1dCtzZu0Rh9nqk4OL0PJ 2OD1cXJ5uCndwE82jxV6uRMObc4tEaOD8n6NA+VcB4HAqaqiZIQ0To0cnZufdwIUrdME9E6vF4Mk 5tiMsq4gwQ0aOzdq1d3Y8WpWDV1cEmGry81tt1aPh+H4dHBq6N1TL7BHNzIrdHuVOquT1Zfw6tGj 0ZZeT3ciCOru7uh6OaRP/dJBJJUkkbN2rd5qqq82pOju3bm7myRlq1J+mxu3cHoknmJyZa4WVESy W2pHiwy1SN26qqmxxZdGho3eDV0TpeN6but43zXV676t5S7/aAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAcupLxu60qpEakJhocWHRVdn8O7VwavB6MODg1eSRGxor7vp5OB+Oa1FT1YB4lcXNhDch Uk5O7ZSqVUridVVXBhweLRqH6V93q7OLkwiVW6Ti6GXIYYaNZNLbJC22SBbZEJwfh2cW6t3JgRsw Knd0YcTV3dBydm7KSstk/R4qbE2fl4uDKTJ8nkGXg/lXVMq2dmHkerLUmzDZs93Mj0YYYbsObLLu w+Fe70dHgr8vy2cRJ4P4aJ+U/TmyJ3aojR+WhI1URs0ZQ4pEPuNBNW5FGh/Liw5pJ5OTyPM+6SSR 5tSez3eSRNhVGyFTB+HBoknBo5vcR4PuqVB4OSDDDgklNGZmVMAeQOgCUEXIFV0IFBWhuDgn2auL zeTiw7O7DJkwT7HkeauaYeDCclbK+ysE8HJ7uadk81VUifBs+Wrg8DVhKmrVXuqtnU4PBXBxatm6 uIw4tX8ySHwogSPAphUkkhMFfo5iTu/JxcVV1YYYR5ssq6qqq0YZdGHWNFywTspVHcUw7NnBgcGV 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHC4UldtnqWeRV33C+e5NXEpzejcyYJGrNN Vizc8k8CSScBRdPdQfRYsZrlE1UpJueTe2ITxJ2UPNQk8lIajo2KUUUlKKUUo+zm6Aycm9YkfKeD 2U2Ti8Gj0LPJdZdvHF2cG86n6TxfTRuNHw5t7o4MnN3ZrrMLDioik5s0wsp0R9KaJT5XWUUlKSw7 GCnVdM0833ejQ7HQdSNW9miiilJOqzq3iJGrDushg3N71amojupJopEpKJ8Uxlij5uDgxYsTjFZi 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 2rKEbfWu9zAQ/m5YUxGoB3xR6yqHUx2YMbQVfeH0JG2QSvni/KeQiLIs8MNJT6qonGMgTqBvczoM tqARRDpfzmzBIR0zHsNAe5Go/F986NgAE8AvEfaD1B+Y7IK9qIRFT7T5KnmPwwlVNnEnMGXiR3wi u1s2+/29/iIRwt4fCopKPSMSmqGSGg7j9tPhJk9Ffzab+SpivNfLcp5IS1atKqZHR3RYp0pftuOn t4bSLZbGiYZGCeppjqfM2ocN4b06vYI0i93jxFepkndcpHt4bduZzV+3aVRidFxR/TQlk8pH6+Oy NnwT4lilSn+0p17Wo0vySF9ywq/cZ6Ml7N1z8+jSP27eZ2uX1P7sY9j4619a0XXL4NLOld/PokjY junlqt4Z/DXQ+F1K89RZBdJJB926X7teJMCOflrdS0HnOU5pPv2xzFE2SNcyqMlz95vutq6dfDfT NjnNBmb9FUQYkWzjDNQpd6Q+6QNW9IMK7zxeFpPC/Ud7500UnijlS8IYp8Y+p5/K19c8l2l2wN/s f9o0luuQnsi76j5ayB2OdCSXXjU/X6ZWkne11Y39xCbKX5KvNy9Q/v5kLjFa5Tv3Zox+J63bwd72 RO4+rj4UaLN/df2+KuOvD/J0Kzf7rur9qnv46xM32+UblTb9i/Hv4atT5O17938+pO/gfFM2L78/ M5xf7l9qYv659ctNn8L2jXb9s76tmlPjrPalooMx66PlLPGC9ziUrL2p+fetecc4UtUQ+3cdu/xR 7lJOvmP5aiD/c09LNE92qnvqcLf0xTqEqmo6m7N5t1D4+P3/cu35/Yi9n4bvIa/0+UOpdU1M+JxO zV+jaUpIZ0/m6fptq8ULBL52n5eRarvPjvz5+Pv3bvlo43wzlr76OXw7lDrDRQVQDR+Mjlusig7u T+ktIU/fhiOpBpRoD76wE1Ca/79eGwG6X0g6fP8/rsnnK8JAoAoO6DJEpRoTJMhKQ+8jkCUJStCl ClIVQUJW+TI9YcgaX9YAyR1ImQnjDknlK5KFIFIFI0JxhckSgP+u2AahGgWgWhCh/b8eD330lf/m /3+/2fC+nPt89/ME+8o9CUSlQoApQoBpGikIlaShaUoQpRoKCkDMjKzPvVFYRFlGGRZAlA+EflCN CL9pRaFKRQpQqlGkUPjKZ59vy/b67/Xx8eOuf8Pdtr2/Tfy/Xmcfft7OR8RLjgDg4kX8LP+dMoX/ CoySF/nLvB19FvNzAH/XowoAsSfLr/BKOxZ4vfgDJccYwfV8EBxxSYp6s8NgdrtSvA4sMf0piX9S /v/AQKJjjic/c0TyjjA/vxLWhwJF2IJ/TH2G96HDu6aNez3aNfX9PB8Pb+Pgdol8YRPS1VhRqkkt ec7u/n5d+/ft0iDrmK7Mw5+XTy6fH8B+v1j+r/r/NBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6p BkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6 pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU 6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVUU6pBkVWt+2/fh27/6ft7Pd+oij+8/BPavog4IcuXp6 cPy6xfL+SI5CRKRCPtDwB93+vmnPZdkvam9XIFvSJBDZY4AJGtA7I9+efAFz7/t+3u+eLlfwf4ex EZuv6Yn5z0ym0IPc+fCqX9OotH+V5SdsbUv0V2dk/oiJM9RSX1ucLwX+J9okk3xPaKL/DtulJ3p4 JZa7fCCkpEE+71IvV6vvA0XnwllLPSryw7yeawKSYvrzEU+HEqT1ny/MvHj+vjxiofUZ6oSv6SE1 rLcExsSd6TXrWPUvopOOkv7/rOuvhqfRTtZyCrJAaJke0pXt1CkekTyVCg5IgP4WTe1vDk8JHpnK 2YEilU+KSWg57Mg7Nwe9InrXWNx77S5U6am6MNguYUQIeYI1KZIBi4A84dGczICpcWrjtid7xUc7 J73Vd7HFPKnTnxo9a8LHWvXfnH+WaOHbO/qd296889sdLdPWDRFA7raEoTdC+Eu18ZPKMOmY+7x7 a9/bv1+47+evbavK77rfxs/G5fQelFPx2VJocWJ+sQT8fCzoDpXi9dMXpirHemPSu/Vf4NXt/Ns3 dXuIKMShYEF/O4EctDosztBQE8QZGEEgmXmHWsdTx2cl78EqTxZ4Q1dWPOydbA5IEiDDKZogQwZo OvjgDjJFx126HHAQJ9eeXdjf78IlCDF7+CwnAZvx+FqQ+qY+lD6nIgs0+5Ti0mQ2RzLx59PzTtS5 TOmhlmvIUDcnJgyM0fs7UKm/wi0p+2PFsgdddV6tXzKiuV4TfbkU6h6FXJrbsnNV6KeTnQ5J6ftB kpDFseHxmsVoM37fn5Zee1KTqQul1GiL3QR0xeEv9fXx18fjH3sXIuamnwal3jv8+/uieZc88888 y7+NUt113TXC3/so5lLvVPvzSPjzE1z6tb1+GohfjIqQggXPRsepFKugeaGSzFO57mrg6M6UiX2c gUfn0kdcxaT2yv6f1hfPenr43v3/enftvNbfOiXRdzPq/aBRb2MvfvzJ3W2bPX6ePovnkYYU+ifd do55aRdJErW6H1ITmUd5UF+OqJbsXT9hnpHmOb9Zg1QD98J27drbLIyfa6gWP4lWhVqUupRqpRPD wr3vYtWyp/mvYtVVrlrtvUOx1w5HxJdy5/PNtRWh2Oef5X6X9ynNmt3XhqOxEC6ZU5ezt27+fndZ +LqQ84EyGEm106p2+alNapDn8e/uX7+Pbd26583+GT1tPgSa3tX8+kbzwvOPfqh0njS4TW/USpOf KkWJbW9PKWgUTn9TNPmycqk8Y2c0bT+Zzb5l9TVtdvR3IYmKyPsbEky4LpK9Ge98rEjS54PHhWJo bFfxY8+0ngeuq6Iff5/f3+/39pDfj6KbhTM8sv70ijQnFSrK8v7jvP8y+SrOwKiKqvMflwfjfU/H jtojt3b6/RIWC/Oj+Cm3Z9AfMh7aWRecI5KZzT9JaEs/DQpqEaEbMFc/L+P9eG5Xd5YF9+HTZP6w pvhSgIlKRKFbriGStmImSJRQJQjQJReOKZBdcXP0xDIAvXEHIO0q5mKZmAOStAlIFK37sUMgG8/3 aUNQDQLSjQBfI8U+0r7ue7p3d/H6/w+Px+XRX6QAde2CrykQYaahQCqAiRiIgF82UKCYmpH6Qn1I AXoyikwK0qp5Si3jP9f72+x+u47++3+XhvbDwKf497fHXA/eQHA4kJS/xlOX9P4FpEYydRUN9fFf 8/kcc7P+5AZHAs2DIl+I/hX4zwAM568O/qi9e3L3dumr+J7Yt/hX7BhAGwOxEMBUkQdE834hJByS dnk/0ad3/BXgJHxv4r8b4dASBIH4S+t533WVksQqKVSqhKIingSOqEQ4K+UO6h6O/C92wk7JPRv4 NVnle/Z1R/b+3qsy83G2rwbGXOAAa0Br5ghDg6EDQ1rXcjkOzo6PJj+CG7uvO2sTmSvFIr2Pu/2a O9tkkk9Xd3eLhufR2Rj7sTk+WJ/Dmw/7OTDBOcJIMP/IQSQ4eDwczqU93s8nq+TDxRTGJ0T6ni/z uRSDAwAAB0PoVHTz+P+Pz/Oxp8eaagkkFoUKlHaVOOfXrjO2ufXt4nDTsejHmlE9GODc5mlN1e5W Gnd+HwiSSGx+0tlsFtqt3R3flt0tqnJMfL3c3NHMkk6Oafp4nd1Mf8H9uy/VzKdzo+rh4Hh4dvHq zWtvY6vevW869b312uV6Xz95gAEgAAAAAAAHyvZdXlclhO6SJzNlPREk7o4OzZsjsfd1dHN5vPyz Lk6nY6KSGDfjv4bZtrW31Pdw4cMiJBTmcn0PM8FdWPVNOQ5HtztnJp6DzcHkcGjTq02PojXV65mX 6PJ6nRyST8kkjwdUiP+aSSHLp8Zc3Pser8gezRE7v+ISE/SdRpySJ3NHJ5tx7O7/gdzh3Q2dHAxh Jye7xQP13t+HNzadH3fLZ3Vu/4ObGld0no008Tsxh4ETH1fV2cHI6oqbHs5k3Nnm9GHY8XSERCTx RBzFPNTuPr9Lbbe59HL2WuxzOju3TY6t0jmwbk9bbXs2NPN1cynM/Ko8nJWOm1u7G76uRXHzaq9T Cq8DDhX+ryczo6uA4VzebZwrzbGT8KtuPg3PoeByCdVFVVFSpVVUnUw7H7p0dlUerxTo4cjZ5uvv b9mOOnX2t1rQrw2Xxfs7uTo5vB6Phu6OThNxHl+XwztmZmmM1j6/zrW0/H4+ConYWlSOyG3BRWy4 di9lsRoDWtACRcTx4VTqZtNIKkJkkwhNspGSyzqTgKE7doQSIAMQQgCIBzU+z6BezGdH67H+v590 pjBaufCFohxouEBccaCJZ52LjNc3PGdTlxi2x9FtTW6rWkPZUepX48nkvb3/F2/ZdvjWfb9845bt +X3R3/R+uymVUkULVhD6WPwapnBpBtp86/F5ykclVL2qIVkFT+XeFshfk5/KiFFInzJ3dV7LTbGV qzwqzCkxU6+KfOfFZd9awuyD8KeSwSmZaipSv6hvEtxVUzeUpN+WYVMOKGKQz4qq9VsUyqdz5lVl x7Pu0Yzh+fV5Ho8Yz0yCcEf4r2XFzt79d0pq46sPHUEp3IiLozJcNKjS2uupdc41i1iKDXLK0yKR YSgS15O2bCUFzUrWnF/5d2neMzpgFvcwol6TGd9Wbn3XneCjVkBFPt2UNyHgsmwWphj5I8YjlZvV kCXS3MqEg5Tv6tR6clw83zojrgRg3FSu0kRiNSEoKyWHqtncsp1SfevNBPhyXxBorM1fM5RVJw7Q ilPrpR1aEFi6OY8SMMciPt4uhSBEZWrabHLV1YW9t11Sk2ntDVV7cpfVZ9uqvaVZc0jVOztw3J4n JZkZG99JLxj56m1cxYauBBeLFO+GFM9dY5hZ41rHveEtLo+AkikwmOVMqiyPHeehPUXIWKx1d34e ipCxnlvBbDaSr/Fb4mD68oPlu11sWkVTJSr1z3eQexGOx/I+AQ44H2CExUFMETBiTCVWMMUYiTj9 LVaEn7Zmmta0xpjb9risx/FWtIjZBUCFAIwM+dYbzjPCThOTbW9s5cm8CyTkJxkwkyRhs0CmbayP 55SsGACLgiEMKGEIowRWIN1IETbjpmZiiRsqTOHPWrOstNWwHdZ09ShJ+zPE51lu5mZkyW3wwkVQ iHVu7PxbK9sZ6Z+dNav1e/tu38IZadvbD2slYb+V9/cBJwHdE+1+LVYWi0aaRXfWJhWuffcYvWAV 1wGPVz1UN617GWiJIRPXtx+rImS+OCLgV2mxvlpSwVyFS4iacx0BxwPA47Dqv3Ud5KSbdzRQTuD8 /VPkvZWuE+vmRGxo6EGiUmeUgTuCJGwCCIHwCNy6Ufcce5qnVGJqdIUKEAc+aF9ee5J3JjZ39mPU lRyiRfTfaGyMaFT4dQizX0PJrbVt3KgzThRFLZRJ3e9lk7obznXbzjnpz6dM1V428AiHu8/exdeW pqxda0xrQwNfAI0R8CY90lQQmCd/L1/VJRV9b39jwSKM0zKZm6DgcccWED67toEZ/Xcec9fPzA+m B947GkkapVZISoUFZTpVyOeC4cS9Tl+Ts+NVaeJ/JZyRHRCfi7R+v5fTYrmTTHbnOa4NeJahJX8f M9dUuTT6qfTOOxSJfs8oWZPJyV0qSr43Jly/4XGe72aQ75oiJ3s5TgP3lyR5bsc0Y2LJNQE38oyn oSRJMPKYmzBfVcttvEvGqOropCLkvflktI9z81nFWrM1oyU8exZHlEWnBUKhhaVWjVBER+r/NOO0 5ULqnlDLoWya0Wkdk5aDxqSC+0r6keseEvyVUvhSSndAvNX7hJozkfs0il1pI9Q6D2TuYraXVVco hbqXNFl1g4ClTB1mGSGh3DQWJyrXD1ITuKwYwZ2E55UCt6kmb2TJj4jBVviZLmyXoYbMYbFO0mIk NkdCQgfuMUeUIZmlxhmpIUDFHtgyzES005+X2xe0ThD6m2Zx3xjBa6dW8fHqVHg+dKXv0OdFy3Ap 5lT1ZuxRM4aSbx0K9jT3KKgqYIGt1VVv4TuUuurOTO8NPlPBWuc0cS8yhPgutSx4xnsc3S25rjGa kZMDUw8zZVz459dReQzvvYI79tSX4XuvRcHLt2k8R4FvL+4rBl7ZYG0MZM4HZ+VD59O1128u+sfH 7L5Pyr/V/qcnVj/12XT/vE2c+Pv2vhvCzXyMn3/btC0Kqf4F+FHnOTB1uYhimlJKx4KU244c+u/j w667ulnOu/t37+1wN5V9kFQMHvI99Ekkkn9B6D7Qgl9+/Nw/z9vzDNVFVV3ZBmwSTVXt70pORzzN tjDa222LfqsQHoCBFVVfKWW1/lfqr2cJAkkkCIMj+A+gjx/dOdNzLngI+oH2/b3j9SNAfyR/k6FI E/yNEfvd7YuEBD3YpCdfelqGtIrbgkVUIiOl6Lxtz1Lr1am51RacSMsslwSkQUCqc1AMkdIPGFzH bZQBNqnC85I5kczNuTCTvfPW5kh11Nyb0YBA6qsoarLu7vM5zmZjAfDMzzjbb5znNaGYks05xxJN 5JkmQmQRG0EaEcjYgjbTBvubSNtiT1+vx+31/Hx8b/ft0/x/PP77aZnTWvlj+rBx+lO31+o76+s4 ZqJ0KLjlty/XMrVnU3Eqs2+bV6nZ+h+RTLke+X3Pdik/b9SBW76kXjX8agTpbYQ363q/f9pTu1V6 WmMbO0eN5izfZciMT8R3YdcoswS9+9I8QbmU5TpTfa+KdpoXMovHs41EOb7p0HLxJ8TpfSrRaJ14 OmaU7kd7VkOzC+D6dyFuWXv+yV9/F7469e3216DwNuh8kEZhUYT2U46RU5Sc/GHmm23N7F2kU4ci 1b1jwt29++tzzCbkcn9/DCMYlvC9/dZ+fEeeeze+xRqYYp+mvBa7lhI8YOp9ZrOviXbWd9iSvIeD TzCXi83LkkMtAvfVIo9Jy32dYZG1ftGZS259rWpX0/ONueIn0cukbtdedvvCCwpaTu1SwQM4PqyD tZgnwVZzKqiY/xVpH4DmIPfdhclhEMbIAlMZSXXlwhVracinV9uKVY1GF+jthSfbxlVHd8vz6t+i nH1SFHidEKMBWyhQ1ihYnQ5o9prJaXqtnvRoLqI6a8M266jDumBZKRP3hos9EORqG4m2qKKxVBtJ hq2BLEYrMcx3kvk/9Clu0htsEmz5Hg9UvEyLlBNaSk5BdmSGJzROiBuLkaHKZ+DZuJlKfRUVaC7C 9tRUuk9+q8xkc7PmOVi3NmfR2exCQ7zKVwd73R2PCC1wcjS5IQdKCsOlj4uL3jDeKzgFBmhSpNym wQlHjxWCJ0sUCKs82zqM8z7eMYJyjW/Ew7u+Zd38mIu3NWmDoaczFuruHFt1dw3MMpptCN1ESsAo Ullllllb+T6855lPH09T79j79kTu/iVEthMpNL8uzKVXsc2Y65aTzeJ6POdPqHIaSurByMIkXaS6 iSMXmptfnNWauGyrPVoYM54srlEXrha0xjFMkE/z/70xST6yRhXUgW/o657+N37jEscjAzve6NN5 ieHMVkT5KMazZZDe8LsOIQiIDr4fDz57XXXXOvhyQk94AAADxPW1CkZ8t3JXUdogg8F7y0pB5SpR ayDAVczqlKz/Fq2KjURKgg6mVGOtIrK1DpOprRazDcYQ2tZ131314534K7kxGAjZDffLoVXe8eu+ 8iEpN9JS5zOK98SNg6zGusrnOXzjx2HqXN8qhN728leKVScOjEz0oHpQNBFxeh1rZXrW1L0vcjsx JGAjZDc5c2RVdut3fWbvJg5ITcTmZldtYBiXMyrM5nMW1OqI5LXHXN7vKe5t6jLWc7vrnfWd9z04 2CKIb6icoTue8fWxyuFKJybxSV2hJmeow7OuZUCZ47wXeWqW4PULOur6zobrVaKkAgKIEQXsrvZY rW1b2rc7MSpMEJEtmWJm7jUdLb632Z5wrgWbD4QXzl48uxsIJ7e97E73mONiFBouHmVTzI2dzLu7 vNqluASlt73QraqtmBuKWPuub4N8t44sHUQce63vfJTSRnxdkalorWorWSlNIMwK1Rqsr0pal4pY 6sTjAdkd9TXcu+998VZ0uSXGwdRHHmxu+ZW8h9gAAAeW879jlzy67dXXXXje/l48Vze7I3uDyLxe Oup4QDG84N02eN8XN+Oq6Ou12j1sooiFZHsdpVahcVI6m1KqJst2OzNY7Tvd+LZzsrqeuusY6Swx C0ONPOMbUKcWY8OvCzeIbgdLh5110OZm6mZ3y+RW95GHXRXOEbXORXOcjDrhXFOcYyX4ldTPS7zx 4rXfd8yq1VdG7HS3ze6qsnU7yTanF1zJAzE8i1nIri5t3xcOvC66pZEHrp85zDrhXM4huIPIri66 77rXfffZGdwe4vtdQyN72dzdbsocIi9xocMXdvVzZpZkVtbjZ1hWbxC4g5FYu+lVLM6yDropre+m Nx4a477XeeJHXVZw85zxmEHF1kDj4zxvi5vk65vgtcPOPe9b3e0KiDuK2siruckZVUMus2hu9mtg zazb2dG00JvZU72tnXgrd7Q3EHkVi5xgZm8VwMVYsx4QDveK48Ncd8XfXU9HXZXannTGR21277W/ Hc9HXZXarnTGR21277W+nrnMJ5oU5rPsB57HwRnH8EXkdJiw8bLTBj8mE3Kd2l0e7YktB3tqvmAU 5FbVEK2nwU2UzyVWzjN14fWnlSPnB69mYrd48qC0QEBDPx/NcLSp2qtoCWWoUhYhLhBZLW/wEgNR nuaGaF+C6Lm6F0va3jx4kGnTulaBUnD1o0hOhUFFnUgsX9oMqZNOBJGSmsGOq6WnfFJrTud8vm5y wf50URv4vUTi9yKpTO1JsugSGDpjU5kgn0tCjoYRNArwVS4Qh6OD+sdx5K7dbhj3mB+u/rO8+YtU L3I8kGto61lz22zDEdkxaHNTRJ+Fqedbi5KXEp+UoE72UzxmZCRBeZTJery00jnd4aFKW1Wa4O2F GzOfUJ1SomFnpZ3x48eM2861PDddnx5+EF8Rvk9dj2Ic38MQfBBJ4vdj4gBdJHhHdtDM6nK6VWLJ e4uh6lSdw73wQjzmiaJo8+FFhDnQtFzI8lxIYJ/PS3CbB2je9ou8IIp2Q6bJBQ8ZqSMUUhhypVut 6P4/b75jHaIxs/Gm+PjJJ3lZR82X9ss8+5oD0aFY/CeB6X8KcGWvZ91C3M5ocEn7a7+5UTySBpVc Uj17S7eJRQLg6tJJFfLJGDkcvU0HhSt2ofJz7V96wl0Ny8lciKbF3NVUvJTUefc38RWdfZWFRG3J WbhlMlZlJQShAEBBg1EkL9suCSd/Ph2tikpKVmrzmOLXXfbzvvARGcSTGcnolRsOQSCFBAHcBZtD l5tn8ZapSFKPOcREjBih0IUCigmGEgocegNckRAgnoiIMzgj4IGPQHw0vVvdVdVR3dEBgw4IKNgf AFgPsGPscTv+/j+ZoqL/A3f5/tZVNV/p/2/6/2X/X/7/0hf+R/9v7yj/2hP+X+yf6UCnZ2l/zFs5 d4jMLU85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZTNAp2dpZFs5d4j MLU85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZTNAp2dpZFs5d4jMLU 85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZTNAp2dpZBNRbTy6SyVIp cq4lFYxlEtm0KksYZnicLM65lGYS10xQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZh MZTNAp2dpZFs5d4jMLU85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZT NAp2dpZFs5d4jMLU85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZTNAp 2dpZFs5d4jMLU85lGYTGUzQKdnaWRbOXeIzC1POZRmExlM0CnZ2lkWzl3iMwtTzmUZhMZTNAp2dp ZFs5d4jMLU85lGYTGUzQKdnaWRyep9T+YfA2IgYhRV/YAUHAwUYpIifupJIoKiihISsKMPQ/f/TO Wvv8939vz3a4cNcOG7hw3AcQYhDQCg/1/7v1cm/x/kMMf+X+cOf9+XYv+Lj3SP7rP/wJK/H/Pe8a LddDDHS0OeNuxbcbpGlnskrvdhgszqF3adRNN23u9WSu78JuM1qz32S53ueK4JKZW16WlBqmnO86 rTVAmnpJq6JL63bGjaNYqMLa0WnWprFa1FVrWK1oVZ4V5uzpi93lmQxWU8Fi+M2sWbVWJuzpXOXl mQzWU8lm+c2sWaI8qZy2A1yvK9oK1kaLWs1g1itK1dXmSTutZUhzvd2lRJ6mE08/7Ze2iTGt7zrR JS65nWHPG3aVEnuYTbz3p7bJMb3kbzt5Zdqir0YTdZTm7TE4m7Tw1GaQklnm82E2mjTE5vPmnNpk k7LXVLyiRo2IWZ8yB8rGWnoktrf9edc65JLYXWbYlEkbmHnZOZsScvLbU5JL880qMnXUTqVtROR5 hSzByyWa5zWgyd8xOpWzE5HmFLMHLJZrnM82F5VrZKUnOYm85zTMzMGVmZGZmYMrMyMy5uZ9J3m6 5y1NjK3zcUpSlKCkUpRKUpSlBSKUolKUpSJrGasGrh8WtS1qUWVrMGtZ7WtXd7klarE1KsXucj1A zHWV1VLa3redklNLKileN7OR7gbjel3VLb31vnXJJXa7zW8oVkiNuG20b09Nklt73re9klcLrNby hWSI24bbRvT02SW3vGCzZHlzmLDMsxid5VK0kaLWiwtK0Wnbc7FeaTib1Nb3aNx9E2azWmS3fW95 yW7JaVHsa7y0bjZNus1pst33u+nqiInOmJjau8vpQk9ay09EmtatgsnE84dMkmc51l6aJNa1pod3 ZmZm5zspRe8qA96lzIJucS1mudavotYtadgesy1IJqcS1qutdbxu57zhmxXEoNdu0t0kG20tNTZJ be913nZZthXxW8okjbh57kF2saaeyS292yWZpSJqy5xKt8y6J9NONWO+tX0WrpSJqy6xKt9S0T6a casd9avotUSkTuSXlGXyWYwk8klc1uWLpR5UJMSjD4LEXSeCSuK1gPZJ3nOdKvilZWSzpR8Otim1 5SgHOGOcCr1SViSl92wWJ4XFp1lBrt2l2nqYfTzy1dEl9c7zgt0suL0tKDXbtLc9zD7eemrskvve LlqdVmpV1iWZjNI7Lqmta1bRanZZqVtalqY1SNLqmta1bRanZZi2QwxbLOTjwZkg5mWcU33mGPWd yOSvN9Z5852fC76udSS7SYXY7xed72u9pwzMzN3HHA444Hd+2ZkkbWeaVlBqm3PM6rTqgTl6SavJ JfnnkcADnnW9klsLrNsSg1TlzzOq05oE5ekmrySX559+iKg4uCHI/yA4AaaaeZEqn1fQzSxKSvhS 7W7NNiaaaaVX4/+luNDh/zY0rlbexRpSlaczTGNHupycnBw5FV4BHDpvbHs08FBy/jfMzm1tb3V/ 3NlVVbcreR9nNIkkN3m9EQ5OCCbKcOCcyzLl8LazsRkABkAMrMv2UwpDVttthE0s1bRGKiHcigeS g0pJiPB0aY9O1vJm2szNN22rdPRr1WpyMcndpycm0JENJvsusmZmbDFKpKUpRsww3KDFCqfwU2cI NjRphhjTxSRjmwqiqSqRVUUqiUksku11l7RbXrJJSTuedy5K2Yxs0E/kT8ubu4fDhyNni3dDwN3e 2z4bN2nLVvDTmIxrVu5sYfh4t26q5ZbycJsaaNNK2aaaVtluitK2YmytIxjBybOrdu3cla3t2VXR s002y3Hq5vV4tmnI4cmzTEJJDZit1Rjh0YaKMKnw+EiMOTm9Gjk6MaFHVs+iVy2t6vJ1BuJNyR7C V2cnTVvJVcNmm7s0rhjch9nDEScxNmeNvN+Gxjh3Y8mmK5IhXMStK7uT6uOtvRs78reSq+rxbnw2 R2acW3m2OTFTq9nDds3VppwcmlbvF6JJK0dG7HZybK77ruxWmwSI3d0mAMWGUUugRoUCANjYofAY ZJ7Eig2S2K5O4jTT2Zvbpw8mzSqqlc25jHN1Y5A9BK7vc3PB4t3spDkEqiHs8Wnd2cjwbESqmypI 5AlE6KOKtQSbvBgnJps0adWObZVNz57LpzcOzDg5tgMObhct3TyTXg3PVpsxwfDm5cW8My3HVs5O THwqpXDoqqwkeYm50Vtbejk4abuTjVvw0qY22t5MV5vgI5nj4W8nCscITq8GnVv1t3cyujurGz1b PR1cnJzSoHkIYomu1vds7O6MY5PlITo5NAR/uAgKh38K7EQZlYRERERMy3GZbjqdnDfe3d0bEc1S VUKU+jsx0cMRuod1bsRhHgJ0+bbzt4ez2STkxT2V0VU5sV3adHd8mjwVs2d2mNeVvg6vd1cmvO3T HGazM7NzcG7wY4bHZp4ppipyY51eZyaOe+9rMtzLLv9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfs7oAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC22226IY5OTVXq7nYKrZUnoknm4eDweXa3olR 1dXDtNrccN3Ds7ERptxb5jMtwZluGZbg4Y6Nst2TFKpz9N8zOTdu6ObSqqqrSsVjGMZbJJLEpbJJ LZJbJLWzZ0SSfL3TmclcPJTk8hjZWnRUjTsgqEScnfOLy2ba22zDkVRuU8VB3CUmlJycOhG5E5o0 qRIqpCOHCq8XRjk9Td5OOy9nmxHZHDo8mGOFcmOB5K3bu7NYzNNGJzQeAjDm4bITnlvZpsqtNNDd WplW83w2RGxs2ae5CmnCtmG7TaS29tK5dXvrPKldV55AABkADGBgBdXpWZ51VtlVQlKlESoke6JS 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 X9YOYQlaWgocFxOk6DXS2gWlQbqUMDaedRq+FLWhOqqEaXS+rvvWMbs9wwKS3e85idb1tV8mE2ve oMMb0mLpKNI0tF0biDfxFr5wwzWN3UcMqVjKIVkuEaVmvip1gqTvFa1jG7iUpVrm411467N+Wu9u Lx5f5vm1eJCHUk6uqMJomFKeTsmpJBlq0YYaPu22XUklN0RIqoiRWWWxloqqiJGjLQZerQ0bmBBJ PsME/soZfBzUyJRUpTISEUwVGX6YJkqODqZMuA83U4ODg4Kqq+wRwRyU5CoRrm3BSVUkw1YEQwME H7GjRCEIQg4htFKMMDClDJqgNlQlKifZUkwoVQwgsI+9tKpIlVCKqFVIYVAyoRkVJBqTUpRUp3YO TJOvS2poEw2iRBJoHRJGiasFUVSVSKqilUhS9LlivSSSSSSUktrvZeVqy1asE4OLRo4mrLwZIycU wYE0aGaKEKGBSlGMgKEDCEOhDBmVVowwqqpVZGxAkyyykZcGJwtrgTZswMoyyqqqq6OTLLVqbtGj I1apgOBswhs2cmZvbuYUqKWMrVUrBXYpuplKpupzZfoFchqSNSuTBoRllyZU5ILZoYiCCGjYKiVK MpD1KQZpCmGrZRl4ODKNGjVlqOqmEmjRVYGGFVgww2ZbOJhRSigw0aKBCEDkATS22xaEENp2SKmz Zq7MstUbuDBo0bmFYZclGRo0YMmWWxmONuphHYrkpKvK2k2JQ4ODDKVMsE0d3+ipOqdW7u6GG6Ob 5tBoc3RVKrg0KU1amrVWqeJhlVaJNjLRk6qZaqqsmS5fSSNts4BnYwgbOBjGQDghyURGjAww2YYb ODgbJNlGycEU3ZNShX/okSA0cWTky7t25qVoywGCsKcFImgkasEwVWrdlk7mB0anBzaNiuLiyGUk w3tvBkalaOjAjVTZFNXilYm9tblNlrrw7W7ttZXwkkkkkkkkkkkkkkkkkkkkkkrMSSSSSSSSSSSS SSSyySSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS SSSSSSSSSSkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk kkkkkkkkkkkkkkkkkkkkkszKrJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJSSSS SSSSSSSSSSSSSSSSSSSSSUkkkkkkkkkkuvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 wHvyEvi5/3Ah8fv69PrJvs/Enf0fxOfbhqSgzT806OqJAIO5/kBOBkEHAr9OOw7i4yPQdx+KvqbX 2nlOhrxsqyYZe09b0M6OZj5jEnY+c635P97V2vh3e5+5+T7Xc7mqjqcm51yeRwbMsk1fNPJ/B57P iy4uzox+Tj000pW1cXY3pqpk/Gfa1ZKydDZS+thX0732NGY1P0GG4+Kmc3qp4LdP2vucm5zPt4Nm H7mbhkTk/M9Hdn/7z/E/0JmT2b2/4He61OidziOtvx6ZqfB3P+7z8Nn+B/Jbob3D7/2nPfx1fF3N 50f9/H+lh3Ko2e5/I/k7Hk/c62w7X4LftfY636rW2fDye5/gf6X3v4/P7Xxert9yfT8dXi0fP3u9 vVjGnX6vc2fi5u53O92tHFw4ux0fTP8/XNIclNWfs7WU5PRbJ+vnVVVVMGTZ+5/mdf2qafA8H7lu p9j+xxe3v6+7zb2EfaybnZaz+8fJ2Osm80dTscvXQvp59X3uaPNqiT4vT+Hh/xdMssssvjwVTsbO A3qZsn9D8GWqtl/Fsj+TtJufk6PhhWby4Ey9vS/Vm/zP7mri5Dqc+L4vVM2apPJ2NwZ5HTu/n6aG 3Y/e+5ueM8n4v7ngts1zvyebx9HAnZNGnY/r36HWl+GrSSKpMjc2fU+TTjPH3P4Pc+DKfXr2P67t e/DG75vFIycHYtOz8Pfty3u7zd7Z9H+B+19Gr9OG+QSZPR1OmfoxMPte1z+L6172n+LyduTJ2tHo /L6Ozk1fM7lU91t7vfM+lZo0drb13TJTxcM36Pc7UzVODU3KSnc82501iXOI72jDqb+E0dzm0MOp yasNzD6ny5fN9r/Lo2O1Tuf1dz1Tp1HN/H/I/nf+rDF6PNr2K72TDqPRQ7HW6PGcs3iz44b3o82H 0f6jo4RZ9r11zb+vb9+/51G8iH85RIUpEKUWQFLJIUIYsQr3MRgpSlKU8fL7VcHZ3/iul4/d/ixf crGfvfI+b3dWLKTdZHxVoBfok/VXl9f5/KR/ZP9j/z/Edh+n6FUSZmXYTSqJMzLsJgiCBQhBlEIA xAoQhBRCnLjlokvhgPf85/Dt+cTQlg3OX8wM8nc62GcDr4KLnE7BEC7mDIiMGBQwaUuU/0xbbfY5 Oc76yc5x+nq31w8r9pmX6/WBZU4A21JArKEnT6524qb+skqCzM4UPn6f6Wed1XGYO7KM/bnxHOfH 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 --MP_/ByHHwKh/.YaHjmiFc8hQDt/-- --Sig_/3aNY3EucdUCEh31=b3MEVzY Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqoI64ACgkQ5xo1VCww uqVqvAf/dHMacbdHNm0OuBqbRsEzH8FpFUGYcw84u9iSUJOAlSW3wrBc1kS/JVMD m+ApWEbylvLt34ar3dEtBiKGIi4Mue6mGrsAcizqFlsYISJo7F+MKnZx3jDh0gb2 gqTtpp7p3YZGcQpMzzmz2KEF40NO8PMWxD8ESDHQKmzIks3NePfV9DAwBWUX/9qq B0N7eO3cRYNxL7f4o8EFx9MfZQcZCGQqKoLnpIEEhWuBKRkC5M4uSEFDsqXf1RgQ SSs7WA+IyeT4W8njEXLbnmmGD3dYg2OnOhBVL5bwwhqvzpbF7sjB60zxgnqtF8sz 01Swsb29wkfHaQMYIx9AJYukCoPG4Q== =b/2o -----END PGP SIGNATURE----- --Sig_/3aNY3EucdUCEh31=b3MEVzY--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 12:28:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 08:28:09 2018 Received: from localhost ([127.0.0.1]:58177 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evj2G-0008GI-Qs for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:28:08 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:50922) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evj2F-0008GB-IT for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:28:07 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 4A1DD33613E9; Tue, 13 Mar 2018 13:28:06 +0100 (CET) Date: Tue, 13 Mar 2018 13:28:02 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180313132154.212a1b92@HIDDEN> In-Reply-To: <87fu54fjfj.fsf@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/jsGxhjTxmRKxa6Rn/AyYHxV"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/jsGxhjTxmRKxa6Rn/AyYHxV Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable > I=E2=80=99m using this on the bare metal. \o/ Hehe nice! > - (let ((modules (matching-modules alias %known-aliases))) > + ;; Look up ALIAS in %KNOWN-ALIASES first, and then, if it fail= s, > + ;; assume that ALIAS is a module name (some modules such as > + ;; 'dm-crypt' don't have an alias.) Note that > + ;; 'kmod_module_new_from_lookup' uses a different search order. I also wondered about the resolution order :) At least module dependencies can't be aliases. > + (let ((modules (match (matching-modules alias %known-aliases) > + (() (list alias)) > + (lst lst)))) Yeah, same happened to me. Did the same (back then in "resolve-alias"). So should be fine. > Something annoying is that my external USB keyboard doesn=E2=80=99t work = while > in the initrd (when I type my passphrase). Did it work before? I remember that Andreas had a similar problem before a= ll this. Did you implement globs with [0-9] yet? I remember there were some USB dev= ices using those :) What's the modalias of your usb keyboard? Does your initrd's modules.alias contain any patterns that are supposed to = match? (You can look into those via=20 cat initrd | gunzip -cd |cpio -i - it will unpack) --Sig_/jsGxhjTxmRKxa6Rn/AyYHxV Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnw9IACgkQ5xo1VCww uqUxygf+MRub2zk/V+bjGnAET899eTQrpa+rL2ailthjXeEgBXkGti9xump0cNde 6rgUm2sRFyzz1bnCbqyklaG5B3cefP7FHcQqQsr9rC+fAwBOcWLsCHLY1skv1OeC 6E8yvaZ60VzsUXGK6HzFWmTGSITquor6iwwkMtx1MnTBqKuELfqZG1DB3amVsAVz 4SN4b6ZQSdIicm1uI4JCrxYBYfNSEBHIEyE0mxtfCZUCSLN5lg/vRmAdN3zaERb9 WN9CCPLTIPMPWftAzX3Xd3eeHGRfcX3lumerD285mIX1w6k//CRJynxWPu90fCeP f1EdHUu05t/7fUZm35j22zDQD8Hwkw== =GJWH -----END PGP SIGNATURE----- --Sig_/jsGxhjTxmRKxa6Rn/AyYHxV--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 12:06:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 08:06:08 2018 Received: from localhost ([127.0.0.1]:58165 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evigy-0007fL-Mo for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:06:08 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:49300) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evigx-0007fC-D5 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:06:07 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 907A43360129; Tue, 13 Mar 2018 13:06:05 +0100 (CET) Date: Tue, 13 Mar 2018 13:05:57 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180313130557.247b02c6@HIDDEN> In-Reply-To: <87zi3cp7sx.fsf@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN> <20180313100539.442c4aa9@HIDDEN> <87zi3cp7sx.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/AmXGoZ.8o4AP.J/b1Wof8r9"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/AmXGoZ.8o4AP.J/b1Wof8r9 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Tue, 13 Mar 2018 11:51:42 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > Right, and the worst that can happen is that modprobe will fail, but > that=E2=80=99s fine because the functionality is already there anyway. Yeah - but what does the kernel do when we return a non-zero exit code for = something he wants to use? :) ./fs/filesystems.c: if (!fs && (request_module("%.*s", len, name) =3D= =3D 0)) ^^^^ = uh oh --Sig_/AmXGoZ.8o4AP.J/b1Wof8r9 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnvqUACgkQ5xo1VCww uqWuFgf+K8xlYmtgpo26Gl7ucp1qTzN8oeZNOe778AXvoFD3KkBL0rTrd0+yWLJ+ f7Jmtm0H7lSwa8TvsRdm6deyXxcIggqJXyBStEG2tp13UB0ox1RLfpQJTX0atV6z HRe8AR83nLQDf6GEWoFDvg0yzt2BXH1vuBQ27mkXrzvugzqNcw7a3ME7dqR1y2ub ry7HYBmrXCy/3grvqJL8O4D4QsZ5iNaKAS9xwdNbt7DsjAw0ZzCkpivNl0zERR8/ sN9bCGBlT4Qei5b2vL97OCgn2Ts6ULo7jyVTuWWao68KG6GhOqX6ODPAl1SBa9Jn Hq2JRrfrCqLMrQrBAbwqMnn7r97LJw== =xN11 -----END PGP SIGNATURE----- --Sig_/AmXGoZ.8o4AP.J/b1Wof8r9--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 10:51:47 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 06:51:47 2018 Received: from localhost ([127.0.0.1]:58132 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evhX1-0003qJ-EI for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 06:51:47 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58830) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evhWz-0003q9-FD for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 06:51:46 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 33E53125F4; Tue, 13 Mar 2018 11:51:44 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id JmJFb8LwayUe; Tue, 13 Mar 2018 11:51:43 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 1D0A01128C; Tue, 13 Mar 2018 11:51:43 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN> <20180313100539.442c4aa9@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 23 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 13 Mar 2018 11:51:42 +0100 In-Reply-To: <20180313100539.442c4aa9@HIDDEN> (Danny Milosavljevic's message of "Tue, 13 Mar 2018 10:27:06 +0100") Message-ID: <87zi3cp7sx.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hello, Danny Milosavljevic <dannym@HIDDEN> skribis: > On Mon, 12 Mar 2018 23:14:59 +0100 > ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > >> > One of the devnames created statically is the one for btrfs, so not wr= iting or >> > using devnames is not going to end well.=20=20 >>=20 >> We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80= =9Cfs-btrfs=E2=80=9D, >> =E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.= alias=E2=80=9D. No need for >> =E2=80=9Cmodules.devname=E2=80=9D AFAICS. > > The other filesystems are not such a problem - but BTRFS has its own snap= shotting/ > multivolume functionality - and it's possible that someone accesses /dev/= btrfs-control > "too early" for that. > > I applied your patches to a fresh clone of guix master now, ran the btrfs= -root-os > system check, and indeed I get (tried two rounds, happened both times): > > $ make TESTS=3Dbtrfs-root-os check-system > [...] > Scanning for Btrfs filesystems > WARNING: failed to open /dev/btrfs-control, skipping device registration:= No suy > ERROR: there are 1 errors while registering devices > File system check on /dev/vda2 failed; spawning Bourne-like REPL > GNU Guile 2.2.3 > Copyright (C) 1995-2017 Free Software Foundation, Inc. > > Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. > This program is free software, and you are welcome to redistribute it > under certain conditions; type `,show c' for details. > > Enter `,help' for help. Do you see a modprobe invocation for =E2=80=9Cfs-btrfs=E2=80=9D or =E2=80= =9Cblock-major-xxx=E2=80=9D before? >> > (I'd also copy the modules.builtin (from Linux). >> > Also, what happens if we load a module which has as dependency a buil= tin? >> > Will we try to load the builtin as a .ko file and fail the entire thi= ng?)=20=20 >>=20 >> The dependency of a builtin is necessarily a builtin,=20 > > Yes. > >>and the kernel won=E2=80=99t invoke modprobe for a builtin, will it?=20=20 > > I've read Linux's __request_module and I can't find where they > pre-check anything - neither whether there's already a builtin > nor whether it's loaded already. > > They probably don't check. But I'll read it again, more carefully... > > (request_module isn't that popular so it makes sense for them not to comp= licate > the kernel by these checks when there are like 8 callers in total - and a= ll on init) Right, and the worst that can happen is that modprobe will fail, but that=E2=80=99s fine because the functionality is already there anyway. Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.ludo@HIDDEN (Ludovic Courtès)
to control <at> debbugs.gnu.org
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 09:28:56 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 05:28:56 2018 Received: from localhost ([127.0.0.1]:58078 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evgEq-000698-B7 for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:28:56 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58300) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evgEo-000690-QT for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:28:55 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 453C9125CD; Tue, 13 Mar 2018 10:28:54 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Yx1kwIue8iEg; Tue, 13 Mar 2018 10:28:53 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 6900D12592; Tue, 13 Mar 2018 10:28:53 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: 30604 <at> debbugs.gnu.org Subject: Re: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program. References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN> Date: Tue, 13 Mar 2018 10:28:52 +0100 In-Reply-To: <87fu54fjfj.fsf@HIDDEN> ("Ludovic \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\= \=\?utf-8\?Q\?s\?\= message of "Tue, 13 Mar 2018 09:50:40 +0100") Message-ID: <876060qq7f.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable ludo@HIDDEN (Ludovic Court=C3=A8s) skribis: > Something annoying is that my external USB keyboard doesn=E2=80=99t work = while > in the initrd (when I type my passphrase). I can see that it=E2=80=99s d= etected > early on, before I type my passphrase: I tried looking up =E2=80=9Cmodalias=E2=80=9D right when entering a /sys/de= vices directory, like you did in the initial patch, but that didn=E2=80=99t help: --=-=-= Content-Type: text/x-patch Content-Disposition: inline diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4515839e9..213a8bbb9 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -480,19 +480,22 @@ side-effect and would thus need to traverse /sys/devices again." (string-append module-directory "/modules.alias"))) (define (enter? director stat result) result) - (define (down directory stat result) result) - (define (up directory stat result) result) - (define (skip entry stat result) result) - (define (error name stat errno result) result) - (define (leaf file stat result) - (if (string=? (basename file) "modalias") + (define (down directory stat result) + ;; Check for "modalias" right when entering DIRECTORY instead of waiting + ;; for LEAF to be called. XXX: Doesn't help! + (let ((modalias (string-append directory "/modalias"))) + (if (file-exists? modalias) (let* ((alias (string-trim-right - (call-with-input-file file get-string-all))) + (call-with-input-file modalias get-string-all))) (modules (matching-modules alias aliases))) (load-linux-modules-from-directory modules module-directory) (append modules result)) - result)) + result))) + (define (up directory stat result) result) + (define (skip entry stat result) result) + (define (error name stat errno result) result) + (define (leaf file stat result) file stat result) (file-system-fold enter? leaf down up skip error '() "/sys/devices")) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 DQpMdWRv4oCZLg0K --=-=-=--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 09:27:15 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 05:27:15 2018 Received: from localhost ([127.0.0.1]:58073 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evgDC-00066U-VX for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:27:15 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:36556) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evgDB-00066M-1F for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:27:13 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E6B2D33613E9; Tue, 13 Mar 2018 10:27:10 +0100 (CET) Date: Tue, 13 Mar 2018 10:27:06 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180313100539.442c4aa9@HIDDEN> In-Reply-To: <87h8plkkkc.fsf@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/sH6RIRsnItffXX8vE6x800c"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/sH6RIRsnItffXX8vE6x800c Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Mon, 12 Mar 2018 23:14:59 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > > One of the devnames created statically is the one for btrfs, so not wri= ting or > > using devnames is not going to end well. =20 >=20 > We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80=9C= fs-btrfs=E2=80=9D, > =E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.a= lias=E2=80=9D. No need for > =E2=80=9Cmodules.devname=E2=80=9D AFAICS. The other filesystems are not such a problem - but BTRFS has its own snapsh= otting/ multivolume functionality - and it's possible that someone accesses /dev/bt= rfs-control "too early" for that. I applied your patches to a fresh clone of guix master now, ran the btrfs-r= oot-os system check, and indeed I get (tried two rounds, happened both times): $ make TESTS=3Dbtrfs-root-os check-system [...] Scanning for Btrfs filesystems WARNING: failed to open /dev/btrfs-control, skipping device registration: N= o suy ERROR: there are 1 errors while registering devices File system check on /dev/vda2 failed; spawning Bourne-like REPL GNU Guile 2.2.3 Copyright (C) 1995-2017 Free Software Foundation, Inc. Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'. This program is free software, and you are welcome to redistribute it under certain conditions; type `,show c' for details. Enter `,help' for help. (can't evaluate anything here) > > (I'd also copy the modules.builtin (from Linux). > > Also, what happens if we load a module which has as dependency a built= in? > > Will we try to load the builtin as a .ko file and fail the entire thin= g?) =20 >=20 > The dependency of a builtin is necessarily a builtin,=20 Yes. >and the kernel won=E2=80=99t invoke modprobe for a builtin, will it? =20 I've read Linux's __request_module and I can't find where they pre-check anything - neither whether there's already a builtin nor whether it's loaded already. They probably don't check. But I'll read it again, more carefully... (request_module isn't that popular so it makes sense for them not to compli= cate the kernel by these checks when there are like 8 callers in total - and all= on init) >Thanks for the insightful review! You're welcome :) --Sig_/sH6RIRsnItffXX8vE6x800c Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnmWoACgkQ5xo1VCww uqWYNQf+JldN8uxgw6yQsYw8jQ9KKV5ilkDItpc6iw+L5Sl3JsYovJ/ABc6JX5m6 nOuQHU4f1rjqJS5kqpFW/qOJbk+3tJSNfRuleJUdKjHfzp3qtTLLYOsN3fTF7OSI fqN2zqS0y5o/C/T1Ienr7Qx+oC6u56smD1FyoLELJDmL8vGj0qUjNytilqavqxwR cwtlGxaREEHmuIB2UjNCXUTUdgw5SDS8Dga/x53AvOEIBsc61Cjyd+j/jzoH3NYC g/reldxXWMPq/DlSkil2293jbnK11+5K/6do+bf5a7uoEdE8E5gKZFqrze7ZiwRS rfgNmo0u7rv146A2b1bNEw1XgZ9tPw== =fti+ -----END PGP SIGNATURE----- --Sig_/sH6RIRsnItffXX8vE6x800c--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:56:43 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 04:56:43 2018 Received: from localhost ([127.0.0.1]:58005 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evfje-0005Eb-VS for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:56:43 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58080) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evfjc-0005ET-Tn for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:56:41 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 62704125B2; Tue, 13 Mar 2018 09:56:40 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jQWiA658I8Bs; Tue, 13 Mar 2018 09:56:39 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 7303D125B1; Tue, 13 Mar 2018 09:56:39 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v11 6/6] linux-modules: Add "modules.devname" writer. References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-6-ludo@HIDDEN> <20180312235547.6ac0af0a@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 23 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 13 Mar 2018 09:56:39 +0100 In-Reply-To: <20180312235547.6ac0af0a@HIDDEN> (Danny Milosavljevic's message of "Mon, 12 Mar 2018 23:55:46 +0100") Message-ID: <873714fj5k.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> + (call-with-output-file (string-append "/tmp" "/modules.devname") > ^^^^^^ directory > > Otherwise LGTM! Oops, fixed!
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:55:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 04:55:58 2018 Received: from localhost ([127.0.0.1]:58001 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evfiw-0005D8-J6 for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:58 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58064) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evfiv-0005Cz-5Q for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:57 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 3E3D2125B2; Tue, 13 Mar 2018 09:55:56 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id xeXLrwfJREpr; Tue, 13 Mar 2018 09:55:55 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 5B20F125B1; Tue, 13 Mar 2018 09:55:55 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'. References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-3-ludo@HIDDEN> <20180313000031.06767edf@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 23 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 13 Mar 2018 09:55:54 +0100 In-Reply-To: <20180313000031.06767edf@HIDDEN> (Danny Milosavljevic's message of "Tue, 13 Mar 2018 00:00:31 +0100") Message-ID: <877eqgfj6t.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> +(define (load-needed-linux-modules module-directory) > [...] >> + (file-system-fold enter? leaf down up skip error #t "/sys/devices")) > > Isn't #t a strange initial value? Shouldn't it be '() ? Indeed! Fixed, thanks.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:55:01 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 04:55:01 2018 Received: from localhost ([127.0.0.1]:57997 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evfhz-0005BM-Mc for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:01 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58044) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evfhx-0005BC-7W for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:54:57 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 7A097125B1; Tue, 13 Mar 2018 09:54:56 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id koZNniL82WHx; Tue, 13 Mar 2018 09:54:55 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 7BEC712572; Tue, 13 Mar 2018 09:54:55 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> <20180312221226.72eb6cb7@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 23 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Tue, 13 Mar 2018 09:54:55 +0100 In-Reply-To: <20180312221226.72eb6cb7@HIDDEN> (Danny Milosavljevic's message of "Mon, 12 Mar 2018 22:12:26 +0100") Message-ID: <87bmfsfj8g.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> That was why earlier I kept /sbin/modprobe as the name (it's the >> default Linux uses) and made sure that the file /sbin/modprobe is already >> in the initrd (as opposed to created by boot-system). > > Note: The simplest change would be to keep this patch as-is but add=20 > > ;; Make sure that Linux can modprobe even before boot-system started = up. > (when modprobe > (mkdir-p "sbin") > (symlink modprobe "sbin/modprobe") > (compile-to-cache "sbin/modprobe")) ; Note: without this line booti= ng is dead slow. [Maybe in this case that wouldn't be so bad - since boot-s= ystem switches away immediately anyway :)] > > to gnu/build/linux-initrd.scm Yeah, done. Ideally =E2=80=98program-file=E2=80=99 would take care of this= . Future work! Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:50:46 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 04:50:46 2018 Received: from localhost ([127.0.0.1]:57993 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evfdt-00054z-VV for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:50:46 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:58012) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evfdr-00054p-Pe for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:50:44 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 96753125AF; Tue, 13 Mar 2018 09:50:42 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NcE1BZd0W6ME; Tue, 13 Mar 2018 09:50:41 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 66D1F12572; Tue, 13 Mar 2018 09:50:41 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: 30604 <at> debbugs.gnu.org Subject: Re: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program. References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-5-ludo@HIDDEN> Date: Tue, 13 Mar 2018 09:50:40 +0100 In-Reply-To: <20180312221541.1886-5-ludo@HIDDEN> ("Ludovic \=\?utf-8\?Q\?Cour\?\= \=\?utf-8\?Q\?t\=C3\=A8s\=22's\?\= message of "Mon, 12 Mar 2018 23:15:40 +0100") Message-ID: <87fu54fjfj.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello! I=E2=80=99m using this on the bare metal. \o/ I had to make this change so that dm-crypt would be loaded once I=E2=80=99ve entered my passphrase: --=-=-= Content-Type: text/x-patch Content-Disposition: inline diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7a167146f..ef81fe718 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -115,16 +115,19 @@ when modules need to be loaded." (current-error-port (%make-void-port "w")) (current-output-port (%make-void-port "w"))) - (let ((modules (matching-modules alias %known-aliases))) + ;; Look up ALIAS in %KNOWN-ALIASES first, and then, if it fails, + ;; assume that ALIAS is a module name (some modules such as + ;; 'dm-crypt' don't have an alias.) Note that + ;; 'kmod_module_new_from_lookup' uses a different search order. + (let ((modules (match (matching-modules alias %known-aliases) + (() (list alias)) + (lst lst)))) (call-with-output-file "/dev/kmsg" (lambda (port) (setvbuf port 'block 1024) (format port "modprobe[~a]: alias ~s; modules ~s; args ~s~%" (getpid) alias modules (program-arguments)))) - (when (null? modules) - (error "alias resolution failed" alias)) - (load-linux-modules-from-directory modules linux-module-directory))))) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable FWIW I have: --8<---------------cut here---------------start------------->8--- modprobe[146]: alias "net-pf-38"; modules ("net-pf-38"); args ("/gnu/store/= v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "net-pf-38") modprobe[152]: alias "dm-crypt"; modules ("dm-crypt"); args ("/gnu/store/v0= ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "dm-crypt") modprobe[157]: alias "crypto-xts(aes)"; modules ("crypto-xts(aes)"); args (= "/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-xt= s(aes)") modprobe[162]: alias "crypto-xts(aes)-all"; modules ("crypto-xts(aes)-all")= ; args ("/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "c= rypto-xts(aes)-all") modprobe[168]: alias "crypto-xts"; modules ("xts"); args ("/gnu/store/v0ay3= 02yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-xts") nfo> [1520929735.4127] manager[0x12950c0]: monitoring kernel firmware dire= ctory '/lib/firmware'. modprobe[173]: alias "crypto-aes"; modules ("crypto-aes"); args ("/gnu/stor= e/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-aes") modprobe[178]: alias "crypto-aes-all"; modules ("crypto-aes-all"); args ("/= gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-aes-= all") modprobe[183]: alias "crypto-ecb(aes)"; modules ("crypto-ecb(aes)"); args (= "/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-ec= b(aes)") modprobe[188]: alias "crypto-ecb(aes)-all"; modules ("crypto-ecb(aes)-all")= ; args ("/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "c= rypto-ecb(aes)-all") --8<---------------cut here---------------end--------------->8--- Something annoying is that my external USB keyboard doesn=E2=80=99t work wh= ile in the initrd (when I type my passphrase). I can see that it=E2=80=99s det= ected early on, before I type my passphrase: --8<---------------cut here---------------start------------->8--- [ 1.532237] usb 1-4.2: new low-speed USB device number 4 using xhci_hcd [ 1.648836] usb 1-4.2: New USB device found, idVendor=3D413c, idProduct= =3D2105 [ 1.649189] usb 1-4.2: New USB device strings: Mfr=3D1, Product=3D2, Ser= ialNumber=3D0 [ 1.649533] usb 1-4.2: Product: Dell USB Keyboard [ 1.649882] usb 1-4.2: Manufacturer: Dell --8<---------------cut here---------------end--------------->8--- but its modules don=E2=80=99t get loaded until after eudev has been started= , and there=E2=80=99s no trace of a modprobe invocation for it. --8<---------------cut here---------------start------------->8--- [ 20.968938] input: Dell Dell USB Keyboard as /devices/pci0000:00/0000:00= :14.0/usb1/1-4/1-4.2/1-4.2:1.0/0003:413C:2105.0001/input/input16 --8<---------------cut here---------------end--------------->8--- Any idea what we=E2=80=99re missing? Thanks, Ludo=E2=80=99. --=-=-=--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 23:00:39 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 19:00:38 2018 Received: from localhost ([127.0.0.1]:57815 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evWQo-0006iX-P2 for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 19:00:38 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:47852) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evWQm-0006iP-P9 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 19:00:37 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id AE84C3360290; Tue, 13 Mar 2018 00:00:35 +0100 (CET) Date: Tue, 13 Mar 2018 00:00:31 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'. Message-ID: <20180313000031.06767edf@HIDDEN> In-Reply-To: <20180312221541.1886-3-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-3-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/DIw3c_UiGS0K62uF_LkfGGo"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/DIw3c_UiGS0K62uF_LkfGGo Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > +(define (load-needed-linux-modules module-directory) [...] > + (file-system-fold enter? leaf down up skip error #t "/sys/devices")) Isn't #t a strange initial value? Shouldn't it be '() ? --Sig_/DIw3c_UiGS0K62uF_LkfGGo Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnBo8ACgkQ5xo1VCww uqUgxAgAjg3Z/ieFvl0Up29vWcWFDgAx7wbEyTmyPlzbcJv6Y64smPzrWawa05vJ OUi80fg9cnoANXuEdVKslegj48YbpsYtcPC08hUS+Ccjl8KJc7frPtZHUXZ8mPzA v4V0wUxvaT+SW5BxCI6ancAZJdRutQVh9Nxztb2bLqnnagxAVXn/Aeqy5tLQUYjR HulvVPHEKyI7RwDAjhm8IFSvuks3IUp5yOnh36GxhQaqdwvuhW5o6iZHjS7R8LER BXo8NiAK3/RhOiUx7I/i72avNHqp4tnAPDpSRGm2O1fSS3WD+ZCf1vdEvdq5u+E4 oUVZalTFyual5SDiC4ZsvDxtrM/00A== =tBne -----END PGP SIGNATURE----- --Sig_/DIw3c_UiGS0K62uF_LkfGGo--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:55:56 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:55:56 2018 Received: from localhost ([127.0.0.1]:57811 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evWMG-0006a2-8o for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:55:56 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:47486) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evWME-0006Zu-7B for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:55:54 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 3E53833600C4; Mon, 12 Mar 2018 23:55:52 +0100 (CET) Date: Mon, 12 Mar 2018 23:55:46 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v11 6/6] linux-modules: Add "modules.devname" writer. Message-ID: <20180312235547.6ac0af0a@HIDDEN> In-Reply-To: <20180312221541.1886-6-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-6-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/bBw2Tipy.+Q3VfgtMZPEXBM"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/bBw2Tipy.+Q3VfgtMZPEXBM Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > + (call-with-output-file (string-append "/tmp" "/modules.devname") ^^^^^^ directory Otherwise LGTM! --Sig_/bBw2Tipy.+Q3VfgtMZPEXBM Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnBXMACgkQ5xo1VCww uqUZ3Qf+MApqVj/sHxKgauy8+bnT5EbH1jEqXkqa/BGsD95wRG5WodT0AZi0iRBv wv8mIC8vOl4VS9pcmQSPBvdkIX21RB29Bqrf8CtaThTDqYI8Z5N5izWJLqP2uFan MJC6ckHcokY/WpTXB+kNZUCfyqvQgqLEaAWb/5JtuPNRQl8ogcX2ccpQosr16f7D EUplZLt61zHZj90BJBmqmfUk7oWw/PMUw+A2+yNUk4PgQnDQ0R8it+tNDs20ahQX 6Gs2YkDOYtwteWXQnKQOL4cgy7lp9Xck5GnTDpJU21wSYxnePg1CwNjRdfJsGft0 kMS7X1UKiFxrZwg8TUNWxWGuMDLzGA== =2nsk -----END PGP SIGNATURE----- --Sig_/bBw2Tipy.+Q3VfgtMZPEXBM--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:49:26 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:49:26 2018 Received: from localhost ([127.0.0.1]:57806 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evWFy-0006Pp-G5 for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:49:26 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:47088) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evWFx-0006Pi-D7 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:49:25 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 56AA933600C4; Mon, 12 Mar 2018 23:49:24 +0100 (CET) Date: Mon, 12 Mar 2018 23:49:22 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [PATCH v11 4/6] vm: Make the virtio-blk uniquely identifiable in /sys. Message-ID: <20180312234922.14fc6425@HIDDEN> In-Reply-To: <20180312221541.1886-4-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-4-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/MUUK7.39GCW=rUC2B8yCdwu"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/MUUK7.39GCW=rUC2B8yCdwu Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable LGTM! --Sig_/MUUK7.39GCW=rUC2B8yCdwu Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA/IACgkQ5xo1VCww uqUC9Qf9GftT17RdFjms1zaPaJXnpZKbClxAvlZD1xLNy3muQXYcznwdEl+rZs6s YSeDaUhblppXsORQBjcuNJkgp0/dx6hsdZGmjgChwxNyGxcBHQgGUmf6BuUYwt// 2q4EFmcA/rjXGUj9BdX6n5tdPFXHFZtXA0dUNiWx95j+/6gY+8BqLuovn7vlxrBR 32MpR9o5gapDgRABtI+OYxwuPofwIAnSscyxnVFHkm/PA5Bh62KDyLuJYP6eMqpi xdCEWuzaGpZw3TarvjTuqwsAoPdWsJ15kHeEU6I5cfH8/W9bqt/kJQt/Z3wERaQN 4WLepIiJ917ijx54RtGtMuUyj/Pkww== =4Olm -----END PGP SIGNATURE----- --Sig_/MUUK7.39GCW=rUC2B8yCdwu--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:48:43 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:48:43 2018 Received: from localhost ([127.0.0.1]:57801 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evWFH-0006O4-8k for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:43 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:47014) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evWFF-0006Nt-Th for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:42 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D7FF533600C4; Mon, 12 Mar 2018 23:48:40 +0100 (CET) Date: Mon, 12 Mar 2018 23:48:36 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v11 2/6] linux-modules: Add 'load-linux-modules-from-directory'. Message-ID: <20180312234836.106e2eb0@HIDDEN> In-Reply-To: <20180312221541.1886-2-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> <20180312221541.1886-2-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/qThaS.wj._AuZt.lYG_5z10"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/qThaS.wj._AuZt.lYG_5z10 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable LGTM! --Sig_/qThaS.wj._AuZt.lYG_5z10 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA8QACgkQ5xo1VCww uqU5RAf/RcXh3olPJFZykEZMmUHATzkHioRJD3XilWmU0row0mm1LZR4PzN/tuRm ASvxkAvXbTc/FeoFU22rLJAv5vY8WfXCFk3NS2PDI7eNyVaeW3wt/qZE4FYiIi9C oHFzAh+q1v+AHyxly4FhNpGID4XGoCPPDU4/FcRHDvVjBaDR7wjebBluZAxz7/DC z9CYLPGLTdaxHeNIvW+BRaKfAQrj3tEtKim3RIQbE8rSWFEtj0wYZ/zEwB1IQBRA oV4X40vz1FG1JkGSNWO/mDD8yJQ8m4XJfOIhfWK2pLWTgknh1X0ShfYUPQY7PbHk PvMjaWU1xpdu2mOtnivV5Dr5NqkbHA== =4f2L -----END PGP SIGNATURE----- --Sig_/qThaS.wj._AuZt.lYG_5z10--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:48:24 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:48:24 2018 Received: from localhost ([127.0.0.1]:57798 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evWEx-0006NC-WE for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:24 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:46992) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evWEw-0006N4-PG for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:23 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 1253233600C4; Mon, 12 Mar 2018 23:48:20 +0100 (CET) Date: Mon, 12 Mar 2018 23:48:14 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [PATCH v11 1/6] linux-modules: Add "modules.alias" writer. Message-ID: <20180312234814.6b89aecc@HIDDEN> In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/0frEtQHqINaKL5_ykn_CP8K"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/0frEtQHqINaKL5_ykn_CP8K Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Mon, 12 Mar 2018 23:15:36 +0100 Ludovic Court=C3=A8s <ludo@HIDDEN> wrote: > (%not-dash): New variable. Old commit message? Otherwise LGTM! --Sig_/0frEtQHqINaKL5_ykn_CP8K Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA64ACgkQ5xo1VCww uqVHgwf7BoMySgvE89KaihiVsydHIYT6X+ewGMl4O+hJqVk/qLunMnIp9bEwSoOt HzwIRt1iZwVPVkZUKkvnb3KDrL5OiDPGhTMOxntfdjHCnxU9WnCo/5K5SJEu5QJA H0Bnr16fHa9O8e5Po+1fCbS8lASoNVRuod7/7MaHOy5Q8h/8k7smwXL5m4oNPxKL Dc8CtM2bCOmr/WimkMqkdyWbEswZRQ/ZpX2qbKhGdaYkhvydQhxPmskSpkyWPga6 blmVj1z/7ylLux0YNGPB0Eg1Gatga+enCQlJmP8DqDKgCj1OXS2r58HQWKGCj4ZR 183Umm1tGLdgSgY49SGmEVEs9y2pXw== =vuYP -----END PGP SIGNATURE----- --Sig_/0frEtQHqINaKL5_ykn_CP8K--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:33 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:33 2018 Received: from localhost ([127.0.0.1]:57783 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVk8-0005V7-UR for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:33 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39157) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVk3-0005U8-O4 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjx-0004U0-K1 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:22 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40062) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjv-0004TL-J6; Mon, 12 Mar 2018 18:16:19 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjv-0001Ef-1U; Mon, 12 Mar 2018 18:16:19 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 6/6] linux-modules: Add "modules.devname" writer. Date: Mon, 12 Mar 2018 23:15:41 +0100 Message-Id: <20180312221541.1886-6-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) * gnu/build/linux-modules.scm (aliases->device-tuple) (write-module-device-database): New procedures. Co-authored-by: Danny Milosavljevic <dannym@HIDDEN>. --- gnu/build/linux-modules.scm | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 55161e026..d3ba2c60a 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -47,6 +47,8 @@ known-module-aliases matching-modules write-module-alias-database + write-module-device-database + load-needed-linux-modules)) ;;; Commentary: @@ -415,6 +417,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by aliases))) aliases)))) +(define (aliases->device-tuple aliases) + "Traverse ALIASES, a list of module aliases, and search for +\"char-major-M-N\", \"block-major-M-N\", or \"devname:\" aliases. When they +are found, return a tuple (DEVNAME TYPE MAJOR MINOR), otherwise return #f." + (define (char/block-major? alias) + (or (string-prefix? "char-major-" alias) + (string-prefix? "block-major-" alias))) + + (define (char/block-major->tuple alias) + (match (string-tokenize alias %not-dash) + ((type "major" (= string->number major) (= string->number minor)) + (list (match type + ("char" "c") + ("block" "b")) + major minor)))) + + (let* ((devname (any (lambda (alias) + (and (string-prefix? "devname:" alias) + (string-drop alias 8))) + aliases)) + (major/minor (match (find char/block-major? aliases) + (#f #f) + (str (char/block-major->tuple str))))) + (and devname major/minor + (cons devname major/minor)))) + +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (write-module-device-database directory) + "Traverse the '.ko' files in DIRECTORY and create the corresponding +'modules.devname' file. This file contains information about modules that can +be loaded on-demand, such as file system modules." + (define aliases + (filter-map (lambda (file) + (match (aliases->device-tuple (module-aliases file)) + (#f #f) + (tuple (cons (file-name->module-name file) tuple)))) + (find-files directory "\\.ko$"))) + + (call-with-output-file (string-append "/tmp" "/modules.devname") + (lambda (port) + (display "# Device nodes to trigger on-demand module loading.\n" port) + (for-each (match-lambda + ((module devname type major minor) + (format port "~a ~a ~a~a:~a~%" + module devname type major minor))) + aliases)))) + (define (load-needed-linux-modules module-directory) "Examine /sys/devices to find out which modules are needed and load those we have in MODULE-DIRECTORY. Return the list of modules loaded, not including -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:33 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:32 2018 Received: from localhost ([127.0.0.1]:57781 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVk7-0005V1-2o for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:31 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39141) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVk1-0005Tz-An for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVju-0004T0-Hv for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:20 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40061) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVju-0004Sp-Co; Mon, 12 Mar 2018 18:16:18 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjt-0001Ef-6R; Mon, 12 Mar 2018 18:16:18 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program. Date: Mon, 12 Mar 2018 23:15:40 +0100 Message-Id: <20180312221541.1886-5-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) From: Danny Milosavljevic <dannym@HIDDEN> This allows us to load modules on demand when the kernel asks for them. * gnu/system/linux-initrd.scm (modprobe-program): New variable. (flat-linux-module-directory): Call 'write-module-alias-database'. (raw-initrd): Pass #:modprobe to 'boot-system' and to 'expression->initrd'. (expression->initrd): Copy "closure" to $out/references. Add #:modprobe and pass it to 'build-initrd'. * gnu/build/linux-initrd.scm (build-initrd): Add #:modprobe and honor it. * gnu/build/linux-boot.scm (boot-system): Add #:modprobe and honor it. Call 'load-needed-linux-modules'. * gnu/system/vm.scm (qemu-image): Add #:linux parameter. Define 'modprobe-wrapper' and pass it to 'activate-modprobe'. Pass #:linux to 'expression->derivation-in-linux-vm'. Co-authored-by: Ludovic Courtès <ludo@HIDDEN> --- gnu/build/linux-boot.scm | 13 +++++- gnu/build/linux-initrd.scm | 16 ++++++-- gnu/system/linux-initrd.scm | 97 ++++++++++++++++++++++++++++++++++++++++----- gnu/system/vm.scm | 21 ++++++++++ 4 files changed, 133 insertions(+), 14 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index df0b2b2d1..eedc4bb9d 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -435,6 +435,7 @@ bailing out.~%root contents: ~s~%" (scandir "/")) (define* (boot-system #:key + modprobe (linux-modules '()) linux-module-directory qemu-guest-networking? @@ -449,6 +450,9 @@ QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems specified in MOUNTS, and finally booting into the new root if any. The initrd supports kernel command-line options '--load', '--root', and '--repl'. +MODPROBE must be #f or a program to install as the modprobe program that the +kernel will invoke when it needs to load modules. + Mount the root file system, specified by the '--root' command-line argument, if any. @@ -482,9 +486,14 @@ upon error." (when (member "--repl" args) (start-repl)) + (when modprobe + ;; Tell the kernel to invoke MODPROBE. + (call-with-output-file "/proc/sys/kernel/modprobe" + (lambda (port) + (display modprobe port)))) + (display "loading kernel modules...\n") - (load-linux-modules-from-directory linux-modules - linux-module-directory) + (load-needed-linux-modules linux-module-directory) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..4fa2bee7d 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@HIDDEN> +;;; Copyright © 2013, 2014, 2015, 2018 Ludovic Courtès <ludo@HIDDEN> ;;; ;;; This file is part of GNU Guix. ;;; @@ -107,12 +107,18 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init modprobe (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script at INIT, running GUILE. It contains all the items referred to by -REFERENCES-GRAPHS." +REFERENCES-GRAPHS. + +When MODPROBE is true, make /sbin/modprobe a symlink to it. This is useful +because Linux invokes 'modprobe' when it needs to load a module and its +default file name is '/sbin/modprobe' (see 'call_modprobe' in kernel/kmod.c). +Creating this symlink allows us to make sure there's no time window during +which 'modprobe' is unavailable." (mkdir "contents") ;; Copy the closures of all the items referenced in REFERENCES-GRAPHS. @@ -131,6 +137,10 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + (when modprobe + (mkdir-p "sbin") + (symlink modprobe "sbin/modprobe")) + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 1eb5f5130..7a167146f 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -63,16 +63,87 @@ ;;; ;;; Code: +(define* (modprobe-program linux-module-directory #:key + (guile %guile-static-stripped)) + "Return a minimal implementation of 'modprobe' for our initrd that looks up +modules in LINUX-MODULE-DIRECTORY. This program will be invoked by the kernel +when modules need to be loaded." + (define program + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) + (ice-9 match) + (srfi srfi-1) + (srfi srfi-26) + (srfi srfi-37)) + + (define option-spec + (list (option '(#\q "quiet") #f #f + (lambda (opt name arg result) + (alist-cons 'quiet? #t result))))) + + (define options + ;; Alist of options and non-option arguments. + (args-fold (cdr (program-arguments)) + option-spec + (lambda (opt name arg result) + (error "unrecognized option" name)) + (lambda (arg result) + (alist-cons 'argument arg result)) + '())) + + (define alias + ;; The alias we are asked to load. The remaining arguments are + ;; module parameters. In practice the kernel doesn't pass module + ;; parameters so we ignore them here. + (any (match-lambda + (('argument . alias) alias) + (_ #f)) + options)) + + (define linux-module-directory + ;; The module directory. Note: We expect a flat directory here. + #$linux-module-directory) + + (define %known-aliases + ;; The alias database. + (known-module-aliases + (string-append linux-module-directory "/modules.alias"))) + + (when (assq-ref options 'quiet?) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + + (let ((modules (matching-modules alias %known-aliases))) + (call-with-output-file "/dev/kmsg" + (lambda (port) + (setvbuf port 'block 1024) + (format port "modprobe[~a]: alias ~s; modules ~s; args ~s~%" + (getpid) alias modules (program-arguments)))) + + (when (null? modules) + (error "alias resolution failed" alias)) + + (load-linux-modules-from-directory modules + linux-module-directory))))) + + (program-file "modprobe" program #:guile guile)) (define* (expression->initrd exp #:key + modprobe (guile %guile-static-stripped) (gzip gzip) (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) containing GUILE and that evaluates EXP, a G-expression, upon booting. All -the derivations referenced by EXP are automatically copied to the initrd." +the derivations referenced by EXP are automatically copied to the initrd. + +When MODPROBE is true, '/sbin/modprobe' is created as a symlink pointing to +it. This allows Linux to call out to MODPROBE as soon as it boots if it needs +to load modules." ;; General Linux overview in `Documentation/early-userspace/README' and ;; `Documentation/filesystems/ramfs-rootfs-initramfs.txt'. @@ -89,20 +160,21 @@ the derivations referenced by EXP are automatically copied to the initrd." (mkdir #$output) ;; The guile used in the initrd must be present in the store, so - ;; that module loading works once the root is switched. + ;; that module loading works once the root is switched. Similarly, + ;; the 'modprobe' program installed in /proc/sys/kernel/modprobe by + ;; the initrd, if any, must be present after switch root. ;; - ;; To ensure that is the case, add an explicit reference to the - ;; guile package used in the initrd to the output. + ;; To ensure that is the case, add an explicit reference to these in + ;; the output. ;; - ;; This fixes guix-patches bug #28399, "Fix mysql activation, and + ;; This fixes <https://bugs.gnu.org/28399>, "Fix mysql activation, and ;; add a basic test". - (call-with-output-file (string-append #$ output "/references") - (lambda (port) - (simple-format port "~A\n" #$guile))) + (copy-file "closure" (string-append #$output "/references")) (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:modprobe #$modprobe ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -153,7 +225,9 @@ MODULES and taken from LINUX." (copy-file module (string-append #$output "/" (basename module)))) - (delete-duplicates modules))))) + (delete-duplicates modules)) + + (write-module-alias-database #$output)))) (computed-file "linux-modules" build-exp)) @@ -196,6 +270,9 @@ upon error." (define kodir (flat-linux-module-directory linux linux-modules)) + (define modprobe + (modprobe-program kodir)) + (expression->initrd (with-imported-modules (source-module-closure '((gnu build linux-boot) @@ -229,9 +306,11 @@ upon error." (and #$@device-mapping-commands)) #:linux-modules '#$linux-modules #:linux-module-directory '#$kodir + #:modprobe #$modprobe #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:modprobe modprobe #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 4360adf15..7f552bef8 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -249,6 +249,7 @@ INPUTS is a list of inputs (as for packages)." (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) + (linux linux-libre) (qemu qemu-minimal) (disk-image-size 'guess) (disk-image-format "qcow2") @@ -275,18 +276,37 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (define modprobe-wrapper + ;; Wrapper for the 'modprobe' command that knows where modules live. + (let ((modprobe (file-append kmod "/bin/modprobe"))) + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" + #$(file-append linux "/lib/modules")) + (apply execl #$modprobe + (cons #$modprobe (cdr (command-line)))))))) + + (expression->derivation-in-linux-vm name (with-imported-modules (source-module-closure '((gnu build bootloader) (gnu build vm) + (gnu build activation) (guix build utils))) #~(begin (use-modules (gnu build bootloader) (gnu build vm) + ((gnu build activation) #:select (activate-modprobe)) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) + ;; We may need to lazy-load Linux modules. The initrd installs a + ;; 'modprobe' that can only search through the modules available in + ;; the initrd, but here we want to be able to use all the modules of + ;; LINUX. Thus, install a real 'modprobe'. + (activate-modprobe #$modprobe-wrapper) + (let ((inputs '#$(append (list qemu parted e2fsprogs dosfstools) (map canonical-package @@ -361,6 +381,7 @@ the image." #$(bootloader-installer bootloader)) (reboot))))) #:system system + #:linux linux #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:26 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:26 2018 Received: from localhost ([127.0.0.1]:57778 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVk1-0005UU-Mu for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:26 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39129) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVk0-0005Tq-GX for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVju-0004Sv-I4 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:19 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40060) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjs-0004S4-Hb; Mon, 12 Mar 2018 18:16:16 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjr-0001Ef-RW; Mon, 12 Mar 2018 18:16:16 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 4/6] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Mon, 12 Mar 2018 23:15:39 +0100 Message-Id: <20180312221541.1886-4-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN>, =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) From: Danny Milosavljevic <dannym@HIDDEN> * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. Signed-off-by: Ludovic Courtès <ludo@HIDDEN> --- gnu/build/vm.scm | 6 +++++- gnu/system/vm.scm | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..773b738ae 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,11 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + + ;; QEMU seems to have a bug that it doesn't assign PCI + ;; IDs properly, so force the address of our virtio-blk + ;; device. + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 91ff32ce9..4360adf15 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -677,7 +677,12 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + + ;; QEMU seems to have a bug that it doesn't assign PCI IDs properly, so + ;; force the address of our virtio-blk device. + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:25 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:25 2018 Received: from localhost ([127.0.0.1]:57776 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVk1-0005US-Ek for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:25 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39109) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVjy-0005Ti-UI for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjt-0004SJ-0F for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:17 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40059) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjr-0004RG-0g; Mon, 12 Mar 2018 18:16:15 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjq-0001Ef-FX; Mon, 12 Mar 2018 18:16:14 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'. Date: Mon, 12 Mar 2018 23:15:38 +0100 Message-Id: <20180312221541.1886-3-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) Based on a patch by Danny Milosavljevic <dannym@HIDDEN>. * gnu/build/linux-modules.scm (load-needed-linux-modules): New procedure. --- gnu/build/linux-modules.scm | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 0084f972b..55161e026 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -30,6 +30,7 @@ #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (ice-9 ftw) #:export (dot-ko ensure-dot-ko module-aliases @@ -45,7 +46,8 @@ device-module-aliases known-module-aliases matching-modules - write-module-alias-database)) + write-module-alias-database + load-needed-linux-modules)) ;;; Commentary: ;;; @@ -413,4 +415,34 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by aliases))) aliases)))) +(define (load-needed-linux-modules module-directory) + "Examine /sys/devices to find out which modules are needed and load those we +have in MODULE-DIRECTORY. Return the list of modules loaded, not including +dependencies. + +Note: loading modules leads to the creation of new entries in /sys/devices, +which is why we need traversal and loading to be interleaved. If we walked +/sys/devices and *then* loaded modules, we'd miss the entries added as a +side-effect and would thus need to traverse /sys/devices again." + (define aliases + (known-module-aliases + (string-append module-directory "/modules.alias"))) + + (define (enter? director stat result) result) + (define (down directory stat result) result) + (define (up directory stat result) result) + (define (skip entry stat result) result) + (define (error name stat errno result) result) + (define (leaf file stat result) + (if (string=? (basename file) "modalias") + (let* ((alias (string-trim-right + (call-with-input-file file get-string-all))) + (modules (matching-modules alias aliases))) + (load-linux-modules-from-directory modules + module-directory) + (append modules result)) + result)) + + (file-system-fold enter? leaf down up skip error #t "/sys/devices")) + ;;; linux-modules.scm ends here -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:23 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:23 2018 Received: from localhost ([127.0.0.1]:57772 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVjz-0005U9-4X for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:23 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39097) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVjx-0005Tf-NH for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjr-0004Rf-Pr for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:16 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40057) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjp-0004Qj-Ra; Mon, 12 Mar 2018 18:16:13 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjp-0001Ef-8P; Mon, 12 Mar 2018 18:16:13 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 2/6] linux-modules: Add 'load-linux-modules-from-directory'. Date: Mon, 12 Mar 2018 23:15:37 +0100 Message-Id: <20180312221541.1886-2-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) * gnu/build/linux-modules.scm (load-linux-modules-from-directory): New procedure. * gnu/build/linux-boot.scm (boot-system)[lookup-module]: Remove. Use 'load-linux-modules-from-directory' instead. --- gnu/build/linux-boot.scm | 9 ++------- gnu/build/linux-modules.scm | 12 ++++++++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..df0b2b2d1 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,10 +469,6 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) - (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -487,9 +483,8 @@ upon error." (start-repl)) (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-linux-modules-from-directory linux-modules + linux-module-directory) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index b444e6f90..0084f972b 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -38,6 +38,7 @@ modules-loaded module-loaded? load-linux-module* + load-linux-modules-from-directory current-module-debugging-port @@ -232,6 +233,17 @@ appears in BLACK-LIST are not loaded." (or (and recursive? (= EEXIST (system-error-errno args))) (apply throw args))))))) +(define (load-linux-modules-from-directory modules directory) + "Load MODULES and their dependencies from DIRECTORY, a directory containing +the '.ko' files. The '.ko' suffix is automatically added to MODULES if +needed." + (define (lookup-module name) + (string-append directory "/" (ensure-dot-ko name))) + + (for-each (cut load-linux-module* <> + #:lookup-module lookup-module) + (map lookup-module modules))) + ;;; ;;; Device modules. -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:20 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:16:20 2018 Received: from localhost ([127.0.0.1]:57768 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVjv-0005Tr-Sr for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:20 -0400 Received: from eggs.gnu.org ([208.118.235.92]:39068) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVju-0005Tb-N5 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjo-0004Oo-O8 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:13 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40056) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evVjo-0004OC-Jn; Mon, 12 Mar 2018 18:16:12 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evVjo-0001Ef-0P; Mon, 12 Mar 2018 18:16:12 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v11 1/6] linux-modules: Add "modules.alias" writer. Date: Mon, 12 Mar 2018 23:15:36 +0100 Message-Id: <20180312221541.1886-1-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <87h8plkkkc.fsf@HIDDEN> References: <87h8plkkkc.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) From: Danny Milosavljevic <dannym@HIDDEN> * gnu/build/linux-modules.scm (write-module-alias-database): New procedure. (%not-dash): New variable. Co-authored-by: Ludovic Courtès <ludo@HIDDEN> --- gnu/build/linux-modules.scm | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4fe673cca..b444e6f90 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2016, 2018 Ludovic Courtès <ludo@HIDDEN> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@HIDDEN> +;;; Copyright © 2018 Danny Milosavljevic <dannym@HIDDEN> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ #:use-module (guix elf) #:use-module (guix glob) #:use-module (guix build syscalls) + #:use-module ((guix build utils) #:select (find-files)) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-1) @@ -41,7 +43,8 @@ device-module-aliases known-module-aliases - matching-modules)) + matching-modules + write-module-alias-database)) ;;; Commentary: ;;; @@ -380,4 +383,22 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define (write-module-alias-database directory) + "Traverse the '.ko' files in DIRECTORY and create the corresponding +'modules.alias' file." + (define aliases + (map (lambda (file) + (cons (file-name->module-name file) (module-aliases file))) + (find-files directory "\\.ko$"))) + + (call-with-output-file (string-append directory "/modules.alias") + (lambda (port) + (display "# Aliases extracted from modules themselves.\n" port) + (for-each (match-lambda + ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias module)) + aliases))) + aliases)))) + ;;; linux-modules.scm ends here -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:15:13 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 18:15:13 2018 Received: from localhost ([127.0.0.1]:57764 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evVir-0005Rc-GU for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:15:13 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:54978) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evVio-0005RT-KP for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:15:11 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id B844B12478; Mon, 12 Mar 2018 23:15:09 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PWm2jtYsnegY; Mon, 12 Mar 2018 23:15:08 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 1F0B212456; Mon, 12 Mar 2018 23:15:08 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 12 Mar 2018 23:14:59 +0100 In-Reply-To: <20180312210936.7f89a29c@HIDDEN> (Danny Milosavljevic's message of "Mon, 12 Mar 2018 21:09:36 +0100") Message-ID: <87h8plkkkc.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Howdy! Danny Milosavljevic <dannym@HIDDEN> skribis: > On Mon, 12 Mar 2018 13:39:17 +0100 > Ludovic Court=C3=A8s <ludo@HIDDEN> wrote: > >> + (when modprobe >> + ;; Tell the kernel to invoke MODPROBE. >> + (call-with-output-file "/proc/sys/kernel/modprobe" >> + (lambda (port) >> + (display modprobe port)))) >> + >> (display "loading kernel modules...\n") > > There's a race because Linux could just start loading modules > immediately before boot-system even starts / executed far enough. > > That was why earlier I kept /sbin/modprobe as the name (it's the > default Linux uses) and made sure that the file /sbin/modprobe is already > in the initrd (as opposed to created by boot-system). > > The race didn't happen to me yet (and I doubt that Linux has modules > fine-grained enough that that's a problem in practise) - but I would pref= er > it not to be possible. > > WDYT? You=E2=80=99re right, I wondered what would happen. I=E2=80=99ve restored = the /sbin/modprobe symlink in v11. >> + (define aliases >> + ;; The list of aliases we are asked to load. >> + (filter-map (match-lambda >> + (('argument . alias) alias) >> + (_ #f)) >> + options)) > > Without "-a", it's not supposed to be a list of aliases. It's supposed t= o be > one alias and the remainder are parameters supposed to be passed to that > kernel module. > > (I didn't know that before). > > When Linux invokes /sbin/modprobe, it doesn't pass "-a" but it doesn't > pass any module parameters either - it just passes one module alias. > > For clarity and in order that we don't have weird problems later (trying = to > load a module named "verbose=3D1" or something :) ), let's just accept on= e alias > for now. Indeed, done in v11. >>+(define* (modprobe-program linux-module-directory #:key >>+ (guile %guile-static-stripped)) > [...] >> + (call-with-output-file "/dev/kmsg" >> + (lambda (port) >> + (format port "modprobe[~a]: aliases ~s; modules ~s; arg= s ~s~%" >> + (getpid) aliases modules (program-arguments)))) > > Hmm, logging is nice! I didn=E2=80=99t mean to leave it, but after all, it=E2=80=99s pretty usefu= l. :-) > But with /dev/kmsg one write(2) syscall needs to pass the entire message. > > What do you think about additionally calling setvbuf with 1024 ? Because: Sure. >> + (write-module-alias-database #$output)))) > > One of the devnames created statically is the one for btrfs, so not writi= ng or > using devnames is not going to end well. We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80=9Cfs= -btrfs=E2=80=9D, =E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.ali= as=E2=80=9D. No need for =E2=80=9Cmodules.devname=E2=80=9D AFAICS. > (I'd also copy the modules.builtin (from Linux). > Also, what happens if we load a module which has as dependency a builtin? > Will we try to load the builtin as a .ko file and fail the entire thing?) The dependency of a builtin is necessarily a builtin, and the kernel won=E2=80=99t invoke modprobe for a builtin, will it? IOW, I think there= =E2=80=99s no problem here. :-) >> + ;; We may need to lazy-load modules. The initrd installs a > > Nitpick: "kernel modules" (to clarify). Fixed. Thanks for the insightful review! Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:13:39 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 17:13:39 2018 Received: from localhost ([127.0.0.1]:57575 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evUlH-0003l7-GY for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:13:39 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:54330) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evUlF-0003kz-Qg for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:13:38 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 64AD712492; Mon, 12 Mar 2018 22:13:37 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id iWL9Bwsjb6OD; Mon, 12 Mar 2018 22:13:36 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 7F0481245C; Mon, 12 Mar 2018 22:13:36 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [PATCH v10 1/6] linux-modules: Add "modules.alias" writer. References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312205444.07c05f4c@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 12 Mar 2018 22:13:26 +0100 In-Reply-To: <20180312205444.07c05f4c@HIDDEN> (Danny Milosavljevic's message of "Mon, 12 Mar 2018 20:54:44 +0100") Message-ID: <87muzdknex.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> +(define %not-dash >> + (char-set-complement (char-set #\-))) > > Is that used? Oops, not until patch 6/6. I=E2=80=99ve moved it there. Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:12:34 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 17:12:34 2018 Received: from localhost ([127.0.0.1]:57571 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evUkE-0003jG-7K for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:12:34 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:39716) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evUkD-0003j8-2F for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:12:33 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E1F283360290; Mon, 12 Mar 2018 22:12:31 +0100 (CET) Date: Mon, 12 Mar 2018 22:12:26 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180312221226.72eb6cb7@HIDDEN> In-Reply-To: <20180312210936.7f89a29c@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> <20180312210936.7f89a29c@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/yqyUpe/VHoXpAgll993hj+C"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/yqyUpe/VHoXpAgll993hj+C Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > That was why earlier I kept /sbin/modprobe as the name (it's the > default Linux uses) and made sure that the file /sbin/modprobe is already > in the initrd (as opposed to created by boot-system). Note: The simplest change would be to keep this patch as-is but add=20 ;; Make sure that Linux can modprobe even before boot-system started up. (when modprobe (mkdir-p "sbin") (symlink modprobe "sbin/modprobe") (compile-to-cache "sbin/modprobe")) ; Note: without this line booting= is dead slow. [Maybe in this case that wouldn't be so bad - since boot-sys= tem switches away immediately anyway :)] to gnu/build/linux-initrd.scm --Sig_/yqyUpe/VHoXpAgll993hj+C Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm7ToACgkQ5xo1VCww uqXvXgf/SnwfDNtEZL1XSdFOuX/41Dp/eKf3g0roct+Yxfv1fjvliPoGPFfttKv+ Zx+vSHS1R//outrcrcXifpJJaNpsASsol1HxtuoPtzQ7nLXDIZKB4bG9aZYeVW1H OnWOKL1Si9ozts4KJxfBSyovFyDqIs/J85BrSaYhsCI5qkpH3pmKx03bTuPPOlXH kI5S5j4977ATl5IXiUdZ0Y2+QOun98k+a5XM4ujlfaID+gu+9PrEp4R9bg6V1nGZ M3efWovUJeewL+nk4gB1pLx3bo5ISLeoqdq1Bso2HzYkfmZtiI5Ke5+k37zPpOg1 tfBGWBNxzKJLnS40yu6tbFDweZ/1sg== =5MQy -----END PGP SIGNATURE----- --Sig_/yqyUpe/VHoXpAgll993hj+C--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:10:53 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 17:10:53 2018 Received: from localhost ([127.0.0.1]:57567 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evUia-0003gQ-Qg for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:10:53 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:54302) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evUiZ-0003gI-2H for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:10:51 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 96EFE12492; Mon, 12 Mar 2018 22:10:50 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qlUQ7UOFFKjG; Mon, 12 Mar 2018 22:10:49 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 901B612029; Mon, 12 Mar 2018 22:10:49 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'. References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-3-ludo@HIDDEN> <20180312204002.09bfc72f@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 12 Mar 2018 22:10:39 +0100 In-Reply-To: <20180312204002.09bfc72f@HIDDEN> (Danny Milosavljevic's message of "Mon, 12 Mar 2018 20:40:02 +0100") Message-ID: <87r2opknjk.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> + (let* ((alias (string-trim-right >> + (call-with-input-file file get-string-all))) > > Hmm... doesn't this trim other things than newline? Yes, it trims whitespace. > A quick internet search shows that most people do that. Huh. Yeah I=E2=80=99d think that whitespace is non-significant in these files, b= ut in practice they=E2=80=99re always generated anyway. Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 20:09:47 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 16:09:47 2018 Received: from localhost ([127.0.0.1]:57550 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evTlT-00026l-GT for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 16:09:47 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:34672) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evTlS-00026d-4X for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 16:09:46 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id F0A0A3360163; Mon, 12 Mar 2018 21:09:44 +0100 (CET) Date: Mon, 12 Mar 2018 21:09:36 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Message-ID: <20180312210936.7f89a29c@HIDDEN> In-Reply-To: <20180312123918.22645-5-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-5-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/+QfwEzIV806Sp6Lwi4U+ueu"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/+QfwEzIV806Sp6Lwi4U+ueu Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Mon, 12 Mar 2018 13:39:17 +0100 Ludovic Court=C3=A8s <ludo@HIDDEN> wrote: > + (when modprobe > + ;; Tell the kernel to invoke MODPROBE. > + (call-with-output-file "/proc/sys/kernel/modprobe" > + (lambda (port) > + (display modprobe port)))) > + > (display "loading kernel modules...\n") There's a race because Linux could just start loading modules immediately before boot-system even starts / executed far enough. That was why earlier I kept /sbin/modprobe as the name (it's the default Linux uses) and made sure that the file /sbin/modprobe is already in the initrd (as opposed to created by boot-system). The race didn't happen to me yet (and I doubt that Linux has modules fine-grained enough that that's a problem in practise) - but I would prefer it not to be possible. WDYT? > + (define aliases > + ;; The list of aliases we are asked to load. > + (filter-map (match-lambda > + (('argument . alias) alias) > + (_ #f)) > + options)) Without "-a", it's not supposed to be a list of aliases. It's supposed to = be one alias and the remainder are parameters supposed to be passed to that kernel module. (I didn't know that before). When Linux invokes /sbin/modprobe, it doesn't pass "-a" but it doesn't pass any module parameters either - it just passes one module alias. For clarity and in order that we don't have weird problems later (trying to load a module named "verbose=3D1" or something :) ), let's just accept one = alias for now. >+(define* (modprobe-program linux-module-directory #:key >+ (guile %guile-static-stripped)) [...] > + (call-with-output-file "/dev/kmsg" > + (lambda (port) > + (format port "modprobe[~a]: aliases ~s; modules ~s; args= ~s~%" > + (getpid) aliases modules (program-arguments)))) Hmm, logging is nice! But with /dev/kmsg one write(2) syscall needs to pass the entire message. What do you think about additionally calling setvbuf with 1024 ? Because: kernel/printk/printk.c: #define LOG_LINE_MAX (1024 - PREFIX_MAX) > + (when (< (length modules) (length aliases)) > + (error "alias resolution failed" aliases)) The original modprobe loads as many modules as it can and possibly sets an (always the same) error flag (and continues loading the other modules). Then modprobe's exit status is that error flag. This is moot because we shouldn't accept more than one alias - see above. > + (write-module-alias-database #$output)))) One of the devnames created statically is the one for btrfs, so not writing= or using devnames is not going to end well. If it did work without it I'd be even more on guard :) (I'd also copy the modules.builtin (from Linux). Also, what happens if we load a module which has as dependency a builtin? Will we try to load the builtin as a .ko file and fail the entire thing?) > + ;; We may need to lazy-load modules. The initrd installs a Nitpick: "kernel modules" (to clarify). --Sig_/+QfwEzIV806Sp6Lwi4U+ueu Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm3oAACgkQ5xo1VCww uqVxHQf/SAsE6KJ/6f6BdakZaXlVHzpjRCqHAsBqgjysduzvcrFV8UCjlL+oHwbx wSTlb3pX/UlqNI6URpKE2lAvroThzv4nrohwxTlIHCUM/Y1eYanCrT0F6v6Qwg6z fr+AF1KUyJHeLU7I0vgu+Sl2KWEJwRvQkUCPoF4UnpkQnwreJFatjBa5jkJeRPYP GRQe2vfBmOQUQetL2JjeqvOJ6FSfKV51A//8HoJFHpVgkktBD1mADHR4yiB+CWuD 9BiPndNOCm8FgF5szqQK+htdfm15kMF9yapqCVib12xZzUEji6zXPSN201q3V0uY O0fbTWR4qYQL/2nlcZU+Tm/RMPfs5g== =D7DW -----END PGP SIGNATURE----- --Sig_/+QfwEzIV806Sp6Lwi4U+ueu--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:54:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 15:54:54 2018 Received: from localhost ([127.0.0.1]:57546 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evTX4-0001is-5y for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:54:54 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:33470) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evTX3-0001ij-8o for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:54:53 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id CC0583360290; Mon, 12 Mar 2018 20:54:51 +0100 (CET) Date: Mon, 12 Mar 2018 20:54:44 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [PATCH v10 1/6] linux-modules: Add "modules.alias" writer. Message-ID: <20180312205444.07c05f4c@HIDDEN> In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/168_Ahi6oUnV_8ev6XJ61G8"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/168_Ahi6oUnV_8ev6XJ61G8 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > +(define %not-dash > + (char-set-complement (char-set #\-))) Is that used? --Sig_/168_Ahi6oUnV_8ev6XJ61G8 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm2wQACgkQ5xo1VCww uqWAEggAoQSbJS4ZokiOPU19tL7sruZCtY+obW6fPybblMPoEGu4lvtpYgGS2LKJ WM/BqQ47Gl+YsaHN0rtubgE/x6UR1QSgNT4u8YzKgUUndYDCnTE/IZeZxJpInCHm vX/zZrABiPijn2XScY+CPIZhDSqc2clk0+9SwG0HuZ95YGmsR46fgBk7pxkgtwHi tF2KGNgAvTY9ras70li10hgd8yhddjYV7hDzlD5V4NPUO0zUHq/bnLMvQUwvL8Vf DbeqIeZo2LuEmC8/ndD8cOYD9abRswWxwiV5X6W2Mv/sM1ihgP1qFxXZsfXffq7e IUSeM6PeZH9zXjm7zhULRhbu5jBFlQ== =5l1S -----END PGP SIGNATURE----- --Sig_/168_Ahi6oUnV_8ev6XJ61G8--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:40:09 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 15:40:09 2018 Received: from localhost ([127.0.0.1]:57542 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evTIm-0001Mq-Sc for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:40:09 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:60636) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evTIl-0001Mi-4p for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:40:07 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E92F43360290; Mon, 12 Mar 2018 20:40:05 +0100 (CET) Date: Mon, 12 Mar 2018 20:40:02 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'. Message-ID: <20180312204002.09bfc72f@HIDDEN> In-Reply-To: <20180312123918.22645-3-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-3-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) > + (let* ((alias (string-trim-right > + (call-with-input-file file get-string-all))) Hmm... doesn't this trim other things than newline? A quick internet search shows that most people do that. Huh. LGTM!
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:27:05 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 15:27:05 2018 Received: from localhost ([127.0.0.1]:57534 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evT69-00011z-4S for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:27:05 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:59714) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evT67-00011r-Qw for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:27:04 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 175F03360290; Mon, 12 Mar 2018 20:27:02 +0100 (CET) Date: Mon, 12 Mar 2018 20:26:54 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Ludovic =?ISO-8859-1?Q?Court=E8s?= <ludo@HIDDEN> Subject: Re: [bug#30604] [PATCH v10 2/6] linux-modules: Add 'load-linux-modules-from-directory'. Message-ID: <20180312202654.43eaa5b1@HIDDEN> In-Reply-To: <20180312123918.22645-2-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> <20180312123918.22645-2-ludo@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/8h1YRx+a/y.xMUaBt6U3YWB"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/8h1YRx+a/y.xMUaBt6U3YWB Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable LGTM! --Sig_/8h1YRx+a/y.xMUaBt6U3YWB Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm1H4ACgkQ5xo1VCww uqUaDQgAoQZlq9m3ie+LFkr6iYXYrja7h9oMesSDWz5Prfd8ou8Y59JZnoGHPkMc PucsWmIvytg4OgT7xqbJk7rmNFdwyM7EFqj/oizhKnwYBo0kObRfUXfA6jbE2GiG JdLHMuiIbfJAe2S1B01PEMT2Wdkxb+2qTJJMCQaHR1DPQe6NgnSK2vI4567CYD/U iU3ugZV6pTIWjoju//TvaiNbGFJiW65f1E3I3X79gIiY2UJJQiWeCDJjmBPAC24P XzIGzhywgHcL/zItbRnp6LlVl8pjpg4soK+IIEu/Rlu/Pgfhx4RmSsHqE91c0V9h pdzRqIfDXaqB0PbdF20hY3I1ZMfOHQ== =8AKq -----END PGP SIGNATURE----- --Sig_/8h1YRx+a/y.xMUaBt6U3YWB--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 17:52:05 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 13:52:05 2018 Received: from localhost ([127.0.0.1]:57502 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evRcD-00072k-Hy for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 13:52:05 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:52574) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1evRcC-00072Z-L8 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 13:52:05 -0400 Received: from localhost (178.113.188.221.wireless.dyn.drei.com [178.113.188.221]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 6BBC73360290; Mon, 12 Mar 2018 18:52:02 +0100 (CET) Date: Mon, 12 Mar 2018 18:51:55 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe. Message-ID: <20180312183840.44e1b6c2@HIDDEN> In-Reply-To: <878taxnyie.fsf@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> <20180304010914.1322-4-dannym@HIDDEN> <20180311212430.707ef0ea@HIDDEN> <878taxnyie.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/ofkgarPL=IPwfQpjLIc/DDS"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/ofkgarPL=IPwfQpjLIc/DDS Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Mon, 12 Mar 2018 15:45:29 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > > Would make sense to also support "-a" (used when invoking modprobe to l= oad multiple > > kernel modules at once). =20 >=20 > I suppose we can do that later because the kernel doesn=E2=80=99t use it = in > =E2=80=98call_modprobe=E2=80=99 and this thing is only ever invoked by th= e kernel. Sure. I just wanted to comment because I noticed that kmod's modprobe a b c doesn't load three modules a, b, c. But my v9's pure-Guile modprobe was implemented in a way that it did load three modules a, b, c - which it definitely shouldn't be doing. --Sig_/ofkgarPL=IPwfQpjLIc/DDS Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqmvjsACgkQ5xo1VCww uqXeIwf/bWzHASgwuyDjDHnyky9v07N2HOiSCOKw02bU0cL1fq2XiqTMAOJ1aurg yrijV9mfr6v27OKikXld/AoTPf4kSJR3DLRosyJeu1CoXHm4CdLnBpFm2Zbf4HSm c+jBjo3x21qMmIj1O5KDtJQo22fbgTp29/2ndokOOrDLpShdKxCRNiihK9e3gRTM eZdw10jhypvXZWLgfeWrOvLkxrBeLgR437UdWYXkal6SOZ1EY2jP3d1XqhxCi/BA gGPAcEQYIc2SNVhf30MfaH6ssih+bcDeLxlBkTJ/U9vpXMJDPiKoC9kgpus7ncLN Ph7AT+i7N1bp9JEbQfnDrNdGwqctKQ== =bZwL -----END PGP SIGNATURE----- --Sig_/ofkgarPL=IPwfQpjLIc/DDS--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 14:45:33 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 10:45:33 2018 Received: from localhost ([127.0.0.1]:57079 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evOhh-0001ye-0T for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 10:45:33 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:51766) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evOhf-0001yV-5q for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 10:45:31 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 9DD82123DD; Mon, 12 Mar 2018 15:45:30 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8zwWI3TA9VqT; Mon, 12 Mar 2018 15:45:29 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id C2940123CF; Mon, 12 Mar 2018 15:45:29 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe. References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> <20180304010914.1322-4-dannym@HIDDEN> <20180311212430.707ef0ea@HIDDEN> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 22 =?utf-8?Q?Vent=C3=B4se?= an 226 de la =?utf-8?Q?R?= =?utf-8?Q?=C3=A9volution?= X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Mon, 12 Mar 2018 15:45:29 +0100 In-Reply-To: <20180311212430.707ef0ea@HIDDEN> (Danny Milosavljevic's message of "Sun, 11 Mar 2018 21:24:30 +0100") Message-ID: <878taxnyie.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: >> + (define option-spec >> + '((quiet (single-char #\q) (value #f)))) > > Would make sense to also support "-a" (used when invoking modprobe to loa= d multiple > kernel modules at once). I suppose we can do that later because the kernel doesn=E2=80=99t use it in =E2=80=98call_modprobe=E2=80=99 and this thing is only ever invoked by the = kernel. WDYT? Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:59 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:58 2018 Received: from localhost ([127.0.0.1]:56089 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMkA-0002zb-IU for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:58 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48204) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMk3-0002yV-Vi for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjx-0006HX-4I for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:46 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56602) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMju-0006Bp-2S; Mon, 12 Mar 2018 08:39:42 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMjt-0003VE-Cx; Mon, 12 Mar 2018 08:39:41 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program. Date: Mon, 12 Mar 2018 13:39:17 +0100 Message-Id: <20180312123918.22645-5-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) This allows us to load modules on demand when the kernel asks for them. * gnu/system/linux-initrd.scm (modprobe-program): New variable. (flat-linux-module-directory): Call 'write-module-alias-database'. (raw-initrd): Pass #:modprobe to 'boot-system'. (expression->initrd): Copy "closure" to $out/references. * gnu/build/linux-boot.scm (boot-system): Add #:modprobe and honor it. Call 'load-needed-linux-modules'. * gnu/system/vm.scm (qemu-image): Add #:linux parameter. Define 'modprobe-wrapper' and pass it to 'activate-modprobe'. Pass #:linux to 'expression->derivation-in-linux-vm'. Co-authored-by: Danny Milosavljevic <dannym@HIDDEN> --- gnu/build/linux-boot.scm | 13 +++++-- gnu/system/linux-initrd.scm | 86 +++++++++++++++++++++++++++++++++++++++++---- gnu/system/vm.scm | 21 +++++++++++ 3 files changed, 111 insertions(+), 9 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index df0b2b2d1..eedc4bb9d 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -435,6 +435,7 @@ bailing out.~%root contents: ~s~%" (scandir "/")) (define* (boot-system #:key + modprobe (linux-modules '()) linux-module-directory qemu-guest-networking? @@ -449,6 +450,9 @@ QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems specified in MOUNTS, and finally booting into the new root if any. The initrd supports kernel command-line options '--load', '--root', and '--repl'. +MODPROBE must be #f or a program to install as the modprobe program that the +kernel will invoke when it needs to load modules. + Mount the root file system, specified by the '--root' command-line argument, if any. @@ -482,9 +486,14 @@ upon error." (when (member "--repl" args) (start-repl)) + (when modprobe + ;; Tell the kernel to invoke MODPROBE. + (call-with-output-file "/proc/sys/kernel/modprobe" + (lambda (port) + (display modprobe port)))) + (display "loading kernel modules...\n") - (load-linux-modules-from-directory linux-modules - linux-module-directory) + (load-needed-linux-modules linux-module-directory) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 1eb5f5130..6b7883c2c 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -63,6 +63,75 @@ ;;; ;;; Code: +(define* (modprobe-program linux-module-directory #:key + (guile %guile-static-stripped)) + "Return a minimal implementation of 'modprobe' for our initrd that looks up +modules in LINUX-MODULE-DIRECTORY. This program will be invoked by the kernel +when modules need to be loaded." + (define program + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) + (ice-9 match) + (srfi srfi-1) + (srfi srfi-26) + (srfi srfi-37)) + + (define option-spec + (list (option '(#\q "quiet") #f #f + (lambda (opt name arg result) + (alist-cons 'quiet? #t result))))) + + (define options + ;; Alist of options and non-option arguments. + (args-fold (cdr (program-arguments)) + option-spec + (lambda (opt name arg result) + (error "unrecognized option" name)) + (lambda (arg result) + (alist-cons 'argument arg result)) + '())) + + (define aliases + ;; The list of aliases we are asked to load. + (filter-map (match-lambda + (('argument . alias) alias) + (_ #f)) + options)) + + (define linux-module-directory + ;; The module directory. Note: We expect a flat directory here. + #$linux-module-directory) + + (define %known-aliases + ;; The alias database. + (known-module-aliases + (string-append linux-module-directory "/modules.alias"))) + + (define (device-aliases->module-names aliases) + ;; Return the list of module names for the subset of ALIASES that + ;; appears in %KNOWN-ALIASES. + (append-map (cut matching-modules <> %known-aliases) + aliases)) + + (when (assq-ref options 'quiet?) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + + (let ((modules (device-aliases->module-names aliases))) + (call-with-output-file "/dev/kmsg" + (lambda (port) + (format port "modprobe[~a]: aliases ~s; modules ~s; args ~s~%" + (getpid) aliases modules (program-arguments)))) + + (when (< (length modules) (length aliases)) + (error "alias resolution failed" aliases)) + + (load-linux-modules-from-directory (reverse modules) + linux-module-directory))))) + + (program-file "modprobe" program #:guile guile)) (define* (expression->initrd exp #:key @@ -89,16 +158,16 @@ the derivations referenced by EXP are automatically copied to the initrd." (mkdir #$output) ;; The guile used in the initrd must be present in the store, so - ;; that module loading works once the root is switched. + ;; that module loading works once the root is switched. Similarly, + ;; the 'modprobe' program installed in /proc/sys/kernel/modprobe by + ;; the initrd, if any, must be present after switch root. ;; ;; To ensure that is the case, add an explicit reference to the ;; guile package used in the initrd to the output. ;; - ;; This fixes guix-patches bug #28399, "Fix mysql activation, and + ;; This fixes <https://bugs.gnu.org/28399>, "Fix mysql activation, and ;; add a basic test". - (call-with-output-file (string-append #$ output "/references") - (lambda (port) - (simple-format port "~A\n" #$guile))) + (copy-file "closure" (string-append #$output "/references")) (build-initrd (string-append #$output "/initrd") #:guile #$guile @@ -153,7 +222,9 @@ MODULES and taken from LINUX." (copy-file module (string-append #$output "/" (basename module)))) - (delete-duplicates modules))))) + (delete-duplicates modules)) + + (write-module-alias-database #$output)))) (computed-file "linux-modules" build-exp)) @@ -222,7 +293,8 @@ upon error." (set-path-environment-variable "PATH" '("bin" "sbin") '#$helper-packages))) - (boot-system #:mounts + (boot-system #:modprobe #$(modprobe-program kodir) + #:mounts (map spec->file-system '#$(map file-system->spec file-systems)) #:pre-mount (lambda () diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 4360adf15..ecb7ed506 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -249,6 +249,7 @@ INPUTS is a list of inputs (as for packages)." (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) + (linux linux-libre) (qemu qemu-minimal) (disk-image-size 'guess) (disk-image-format "qcow2") @@ -275,18 +276,37 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (define modprobe-wrapper + ;; Wrapper for the 'modprobe' command that knows where modules live. + (let ((modprobe (file-append kmod "/bin/modprobe"))) + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" + #$(file-append linux "/lib/modules")) + (apply execl #$modprobe + (cons #$modprobe (cdr (command-line)))))))) + + (expression->derivation-in-linux-vm name (with-imported-modules (source-module-closure '((gnu build bootloader) (gnu build vm) + (gnu build activation) (guix build utils))) #~(begin (use-modules (gnu build bootloader) (gnu build vm) + ((gnu build activation) #:select (activate-modprobe)) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) + ;; We may need to lazy-load modules. The initrd installs a + ;; 'modprobe' that can only search through the modules available in + ;; the initrd, but here we want to be able to use all the modules of + ;; LINUX. Thus, install a real 'modprobe'. + (activate-modprobe #$modprobe-wrapper) + (let ((inputs '#$(append (list qemu parted e2fsprogs dosfstools) (map canonical-package @@ -361,6 +381,7 @@ the image." #$(bootloader-installer bootloader)) (reboot))))) #:system system + #:linux linux #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:54 2018 Received: from localhost ([127.0.0.1]:56087 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMk6-0002zI-3O for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:54 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48198) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMk3-0002yT-21 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjx-0006HO-3V for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:46 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56603) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjv-0006Dh-2i; Mon, 12 Mar 2018 08:39:43 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMju-0003VE-Iu; Mon, 12 Mar 2018 08:39:42 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 6/6] linux-modules: Add "modules.devname" writer. Date: Mon, 12 Mar 2018 13:39:18 +0100 Message-Id: <20180312123918.22645-6-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) * gnu/build/linux-modules.scm (aliases->device-tuple) (write-module-device-database): New procedures. Co-authored-by: Danny Milosavljevic <dannym@HIDDEN>. --- gnu/build/linux-modules.scm | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 9aabe6d37..2ed04e5b4 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -47,6 +47,8 @@ known-module-aliases matching-modules write-module-alias-database + write-module-device-database + load-needed-linux-modules)) ;;; Commentary: @@ -418,6 +420,52 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by aliases))) aliases)))) +(define (aliases->device-tuple aliases) + "Traverse ALIASES, a list of module aliases, and search for +\"char-major-M-N\", \"block-major-M-N\", or \"devname:\" aliases. When they +are found, return a tuple (DEVNAME TYPE MAJOR MINOR), otherwise return #f." + (define (char/block-major? alias) + (or (string-prefix? "char-major-" alias) + (string-prefix? "block-major-" alias))) + + (define (char/block-major->tuple alias) + (match (string-tokenize alias %not-dash) + ((type "major" (= string->number major) (= string->number minor)) + (list (match type + ("char" "c") + ("block" "b")) + major minor)))) + + (let* ((devname (any (lambda (alias) + (and (string-prefix? "devname:" alias) + (string-drop alias 8))) + aliases)) + (major/minor (match (find char/block-major? aliases) + (#f #f) + (str (char/block-major->tuple str))))) + (and devname major/minor + (cons devname major/minor)))) + +(define (write-module-device-database directory) + "Traverse the '.ko' files in DIRECTORY and create the corresponding +'modules.devname' file. This file contains information about modules that can +be loaded on-demand, such as file system modules." + (define aliases + (filter-map (lambda (file) + (match (aliases->device-tuple (module-aliases file)) + (#f #f) + (tuple (cons (file-name->module-name file) tuple)))) + (find-files directory "\\.ko$"))) + + (call-with-output-file (string-append "/tmp" "/modules.devname") + (lambda (port) + (display "# Device nodes to trigger on-demand module loading.\n" port) + (for-each (match-lambda + ((module devname type major minor) + (format port "~a ~a ~a~a:~a~%" + module devname type major minor))) + aliases)))) + (define (load-needed-linux-modules module-directory) "Examine /sys/devices to find out which modules are needed and load those we have in MODULE-DIRECTORY. Return the list of modules loaded, not including -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:54 2018 Received: from localhost ([127.0.0.1]:56085 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMk5-0002zG-RK for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:54 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48164) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMk0-0002yC-O3 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMju-0006D8-Op for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:43 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56600) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjs-00069Q-Sj; Mon, 12 Mar 2018 08:39:40 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMjs-0003VE-8p; Mon, 12 Mar 2018 08:39:40 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 4/6] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Mon, 12 Mar 2018 13:39:16 +0100 Message-Id: <20180312123918.22645-4-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN>, =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) From: Danny Milosavljevic <dannym@HIDDEN> * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. Signed-off-by: Ludovic Courtès <ludo@HIDDEN> --- gnu/build/vm.scm | 6 +++++- gnu/system/vm.scm | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..773b738ae 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,11 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + + ;; QEMU seems to have a bug that it doesn't assign PCI + ;; IDs properly, so force the address of our virtio-blk + ;; device. + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 91ff32ce9..4360adf15 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -677,7 +677,12 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + + ;; QEMU seems to have a bug that it doesn't assign PCI IDs properly, so + ;; force the address of our virtio-blk device. + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:50 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:50 2018 Received: from localhost ([127.0.0.1]:56081 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMk2-0002yv-Ie for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:50 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48145) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMjz-0002yA-Ea for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjt-0006As-IG for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:42 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56599) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjr-00066x-JY; Mon, 12 Mar 2018 08:39:39 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMjr-0003VE-1M; Mon, 12 Mar 2018 08:39:39 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'. Date: Mon, 12 Mar 2018 13:39:15 +0100 Message-Id: <20180312123918.22645-3-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) Based on a patch by Danny Milosavljevic <dannym@HIDDEN>. * gnu/build/linux-modules.scm (load-needed-linux-modules): New procedure. --- gnu/build/linux-modules.scm | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 1337b5e88..9aabe6d37 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -30,6 +30,7 @@ #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (ice-9 ftw) #:export (dot-ko ensure-dot-ko module-aliases @@ -45,7 +46,8 @@ device-module-aliases known-module-aliases matching-modules - write-module-alias-database)) + write-module-alias-database + load-needed-linux-modules)) ;;; Commentary: ;;; @@ -416,4 +418,34 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by aliases))) aliases)))) +(define (load-needed-linux-modules module-directory) + "Examine /sys/devices to find out which modules are needed and load those we +have in MODULE-DIRECTORY. Return the list of modules loaded, not including +dependencies. + +Note: loading modules leads to the creation of new entries in /sys/devices, +which is why we need traversal and loading to be interleaved. If we walked +/sys/devices and *then* loaded modules, we'd miss the entries added as a +side-effect and would thus need to traverse /sys/devices again." + (define aliases + (known-module-aliases + (string-append module-directory "/modules.alias"))) + + (define (enter? director stat result) result) + (define (down directory stat result) result) + (define (up directory stat result) result) + (define (skip entry stat result) result) + (define (error name stat errno result) result) + (define (leaf file stat result) + (if (string=? (basename file) "modalias") + (let* ((alias (string-trim-right + (call-with-input-file file get-string-all))) + (modules (matching-modules alias aliases))) + (load-linux-modules-from-directory modules + module-directory) + (append modules result)) + result)) + + (file-system-fold enter? leaf down up skip error #t "/sys/devices")) + ;;; linux-modules.scm ends here -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:47 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:47 2018 Received: from localhost ([127.0.0.1]:56077 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMjz-0002yb-B5 for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48138) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMjy-0002y8-Qj for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjs-00069I-QV for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:41 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56597) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjq-00064l-Gi; Mon, 12 Mar 2018 08:39:38 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMjq-0003VE-0n; Mon, 12 Mar 2018 08:39:38 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 2/6] linux-modules: Add 'load-linux-modules-from-directory'. Date: Mon, 12 Mar 2018 13:39:14 +0100 Message-Id: <20180312123918.22645-2-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) * gnu/build/linux-modules.scm (load-linux-modules-from-directory): New procedure. * gnu/build/linux-boot.scm (boot-system)[lookup-module]: Remove. Use 'load-linux-modules-from-directory' instead. --- gnu/build/linux-boot.scm | 9 ++------- gnu/build/linux-modules.scm | 12 ++++++++++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..df0b2b2d1 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,10 +469,6 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) - (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -487,9 +483,8 @@ upon error." (start-repl)) (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-linux-modules-from-directory linux-modules + linux-module-directory) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 6101b8dc3..1337b5e88 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -38,6 +38,7 @@ modules-loaded module-loaded? load-linux-module* + load-linux-modules-from-directory current-module-debugging-port @@ -232,6 +233,17 @@ appears in BLACK-LIST are not loaded." (or (and recursive? (= EEXIST (system-error-errno args))) (apply throw args))))))) +(define (load-linux-modules-from-directory modules directory) + "Load MODULES and their dependencies from DIRECTORY, a directory containing +the '.ko' files. The '.ko' suffix is automatically added to MODULES if +needed." + (define (lookup-module name) + (string-append directory "/" (ensure-dot-ko name))) + + (for-each (cut load-linux-module* <> + #:lookup-module lookup-module) + (map lookup-module modules))) + ;;; ;;; Device modules. -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:45 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:39:45 2018 Received: from localhost ([127.0.0.1]:56074 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMjx-0002yK-1z for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:45 -0400 Received: from eggs.gnu.org ([208.118.235.92]:48099) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMjv-0002y3-Nc for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjp-000637-K7 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:38 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56596) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>) id 1evMjp-00062u-Fk; Mon, 12 Mar 2018 08:39:37 -0400 Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org) by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from <ludo@HIDDEN>) id 1evMjp-0003VE-0C; Mon, 12 Mar 2018 08:39:37 -0400 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v10 1/6] linux-modules: Add "modules.alias" writer. Date: Mon, 12 Mar 2018 13:39:13 +0100 Message-Id: <20180312123918.22645-1-ludo@HIDDEN> X-Mailer: git-send-email 2.16.2 In-Reply-To: <87ina1qxic.fsf@HIDDEN> References: <87ina1qxic.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) From: Danny Milosavljevic <dannym@HIDDEN> * gnu/build/linux-modules.scm (write-module-alias-database): New procedure. (%not-dash): New variable. Co-authored-by: Ludovic Courtès <ludo@HIDDEN> --- gnu/build/linux-modules.scm | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4fe673cca..6101b8dc3 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -1,6 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2016, 2018 Ludovic Courtès <ludo@HIDDEN> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@HIDDEN> +;;; Copyright © 2018 Danny Milosavljevic <dannym@HIDDEN> ;;; ;;; This file is part of GNU Guix. ;;; @@ -21,6 +22,7 @@ #:use-module (guix elf) #:use-module (guix glob) #:use-module (guix build syscalls) + #:use-module ((guix build utils) #:select (find-files)) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-1) @@ -41,7 +43,8 @@ device-module-aliases known-module-aliases - matching-modules)) + matching-modules + write-module-alias-database)) ;;; Commentary: ;;; @@ -380,4 +383,25 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (write-module-alias-database directory) + "Traverse the '.ko' files in DIRECTORY and create the corresponding +'modules.alias' file." + (define aliases + (map (lambda (file) + (cons (file-name->module-name file) (module-aliases file))) + (find-files directory "\\.ko$"))) + + (call-with-output-file (string-append directory "/modules.alias") + (lambda (port) + (display "# Aliases extracted from modules themselves.\n" port) + (for-each (match-lambda + ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias module)) + aliases))) + aliases)))) + ;;; linux-modules.scm ends here -- 2.16.2
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:38:57 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Mar 12 08:38:56 2018 Received: from localhost ([127.0.0.1]:56069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1evMjA-0002wg-MJ for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:38:56 -0400 Received: from hera.aquilenet.fr ([185.233.100.1]:50622) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1evMj8-0002wV-Et for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:38:55 -0400 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 60BE812382; Mon, 12 Mar 2018 13:38:53 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id g2xEDFGgJYeT; Mon, 12 Mar 2018 13:38:51 +0100 (CET) Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 8A5E211CC1; Mon, 12 Mar 2018 13:38:51 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN> Date: Mon, 12 Mar 2018 13:38:51 +0100 In-Reply-To: <20180309231320.20a02822@HIDDEN> (Danny Milosavljevic's message of "Fri, 9 Mar 2018 23:13:20 +0100") Message-ID: <87ina1qxic.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Heya Danny, Danny Milosavljevic <dannym@HIDDEN> skribis: > As I said, modprobe mutates /sys - you cannot use find-files. I haven't = used > ftw just to be contrarian. There's even a warning comment :-) I did see this comment, and I don=E2=80=99t doubt you=E2=80=99re acting in = good faith! > In order to find that out, try to print how /sys looked before modprobe -= then > in the early guile recovery REPL print how /sys looks again - the alias it > was juuust complaining about will be there just fine. It wasn=E2=80=99t clear to me what =E2=80=9Cmodprobe mutates /sys=E2=80=9D = meant, and I guess I didn=E2=80=99t think it could lead to not seeing relevant =E2=80=9Cmodalias= =E2=80=9D files. Now I=E2=80=99ve experienced first-hand that it does matter. :-) > It took about 30 h to work out the correct minimal combination - just say= ing :-) Yeah I can imagine (and it would have taken me much longer I guess.) While reviewing this series I realized I didn=E2=80=99t understand everythi= ng, as in the example above, some things seemed unnecessary, and I thought we could improve the style of a few things. The patches that follow build upon your work with a few changes: =E2=80=A2 The =E2=80=9Cmodules.alias=E2=80=9D writer style is made more i= diomatic and hopefully simpler. =E2=80=A2 The =E2=80=9Cmodules.devname=E2=80=9D writer is actually unnece= ssary. I changed it to a more functional style and with smaller functions. It=E2=80=99s the last patch of this series; it=E2=80=99s completely optional since we do= n=E2=80=99t use it currently, but we might want to keep it around for later. =E2=80=A2 The pure-Scheme modprobe uses SRFI-37 instead of (ice-9 getopt-long), as in the rest of the code base. =E2=80=A2 /proc/sys/kernel/modprobe is set in =E2=80=98boot-system=E2=80= =99 directly, so that we don=E2=80=99t have to special-case the =E2=80=9Cmodprobe=E2=80=9D cl= osure in =E2=80=98build-initrd=E2=80=99. =E2=80=A2 =E2=80=98module-aliases->module-file-names=E2=80=99 is gone. I= nstead there=E2=80=99s =E2=80=98load-needed-linux-modules=E2=80=99, similar to the =E2=80=98lo= ad-kernel-modules=E2=80=99 you had, but a bit simpler. =E2=80=A2 I added comments here and there, especially about the virtio-blk-pci, which was far from obvious. :-) I didn=E2=80=99t add the =E2=80=98needed-modules=E2=80=99 and =E2=80=98syst= em-device-aliases=E2=80=99 procedures I posted earlier because we don=E2=80=99t need them currently. If you think they could be useful, we can always add them. The following command succeeds: make check-system TESTS=3D"basic installed-os iso-image-installer" WDYT? I realize that makes for a not-so-efficient review process, though I think the result is worth it. I=E2=80=99m open to suggestions though. Overall, these changes are mostly about (1) making self-contained commits, (2) commenting code, and (3) coding style. About #3, I think the guidelines I applied were: 1. Avoid imperative style. When we do need side effects, try hard to move them separately. 2. Keep functions short. 3. Decompose functions in a way that allows them to be combined =E2=80=9Cnicely=E2=80=9D. Some of that is a bit subjective, but overall we should be able to converge. Thanks for the great work, and sorry for the back-and-forth and delays! Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 11 Mar 2018 20:24:42 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 11 16:24:42 2018 Received: from localhost ([127.0.0.1]:55716 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ev7WM-0005n0-KT for submit <at> debbugs.gnu.org; Sun, 11 Mar 2018 16:24:42 -0400 Received: from dd26836.kasserver.com ([85.13.145.193]:35408) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ev7WL-0005mp-0p for 30604 <at> debbugs.gnu.org; Sun, 11 Mar 2018 16:24:41 -0400 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 2F48B3360C78 for <30604 <at> debbugs.gnu.org>; Sun, 11 Mar 2018 21:24:39 +0100 (CET) Date: Sun, 11 Mar 2018 21:24:30 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe. Message-ID: <20180311212430.707ef0ea@HIDDEN> In-Reply-To: <20180304010914.1322-4-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> <20180304010914.1322-4-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/Cey6o_VYT6PJ=veW8WEpofZ"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/Cey6o_VYT6PJ=veW8WEpofZ Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > + (define option-spec > + '((quiet (single-char #\q) (value #f)))) Would make sense to also support "-a" (used when invoking modprobe to load = multiple kernel modules at once). --Sig_/Cey6o_VYT6PJ=veW8WEpofZ Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqlkH4ACgkQ5xo1VCww uqWFsggAiePy7PVn0EvxcvzawT0U/UuWoHTaiMJZDwj5nSBhWHpNLnMGfYe2emd4 q10BZdapDN4FI+4iwRdene+8NbH2y4rsUpM1VMKG12Iq+hNE2v/D1hiBMFgozX1b jPbvb1NIZXZDT+iHwo2no1fvylSySl4SjE+b68RQpeieKyodums5B9Dg1H7aavcU B/qo0pkotTl11ChmZ0wAgj3HyZfGndP1b6BBTsUvz1fKFvcYTaH0tryh9oK2Ug1h lpRdSRtugfCb2BQ9ajzC937gXUTzZ8gNMF8nQm76HPe/WeB+DkXUhMPic1pndz8h JHTXjkmP8NUywJjnGkmi0N0sruquoA== =hAM5 -----END PGP SIGNATURE----- --Sig_/Cey6o_VYT6PJ=veW8WEpofZ--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:44:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:44:41 2018 Received: from localhost ([127.0.0.1]:52918 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQkj-0005rG-5v for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:44:41 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:52212) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1euQkh-0005r8-5N for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:44:39 -0500 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 1329B3360156; Fri, 9 Mar 2018 23:44:37 +0100 (CET) Date: Fri, 9 Mar 2018 23:44:34 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180309234434.2bf5e3ff@HIDDEN> In-Reply-To: <20180309231320.20a02822@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, sorry for the many e-mails - I'm recollecting all the workarounds :) >--8<---------------cut here---------------start------------->8--- >loading '/gnu/store/n2zvdxp25kvg7wy5xr1y5n9r4502fw80-linux-vm-loader'... >environment variable `PATH' set to `/gnu/store/vxl918zb9brnrgaipzsykpy3mzc= afvcr-qemu-minimal-2.11.1/bin:/gnu/store/lvkaf3xlvy57bvap51xlzb209ilbkgcv-p= arted-3.2/sbin:/>gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.= 6/bin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/sbin:/gn= u/>store/0sq2nflm42x0znkv44add0gk82khkcb6-dosfstools-4.1/sbin:/gnu/store/0h= l513mnpkhszm2hjai2w9cxmpxs0vgq-sed-4.4/bin:/gnu/store/1h44pkgdd7n6s3i2vjh54= awsvfmc219j->grep-3.1/bin:/gnu/store/kgzvfby2ggi1xawsh5vjh4s93qk2dp9k-coreu= tils-8.28/bin:/gnu/store/k7r2m2wgj8x8jjhccwjsiimp0dlzxb7i-findutils-4.6.0/b= in:/gnu/store/>ahxc89r6npzf2bbl8yg5vdjicskzzjf3-gawk-4.1.4/bin' >creating partition table with 2 partitions (20.0 MiB, 40.0 MiB)... >Warning: The resulting partition is not properly aligned for best performa= nce. >creating ext4 partition... ... [ 3.235493] FAT-fs (vda2): IO charset iso8859-1 not found ERROR: In procedure mount: In procedure mount: Invalid argument --8<---------------cut here---------------end--------------->8--- >Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn= =E2=80=99t even >invoked, although my understanding is that it should (per =E2=80=98load_nl= s=E2=80=99 in >nls_base.c in the kernel, called from vfat/inode.c). Yeah, that was an evil problem. There are two different ways linux-boot can boot: * Either it loads a full system in which case /run/booted-system will contain kernel module files which can and will be loaded * Or it loads a "--load" file only - in which case there's no system modprobe, but switch-root just switched our pure-Guile modprobe away, so now we are out of modprobes :) --Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjDlIACgkQ5xo1VCww uqWZ7Qf+N2/hBERWip1Lvyq6ZzPc425T5v1Jrkahu3TEoHiSJd6IxXG4A/OzqR0h CehvMgm1sIznAECajIe/4X9UFTi42yOWJZB5aauCVn11kkllTbiEJbbtkhNnScQZ FNCdyFF8Jese+aUXTpWxY0TucI6xvLwgvU6UYrRHOgND5Ug+G5ilWYTca8sFHena InbXiYP4GNOGKcPltMn/i05TMOHcnHHUg67jta8VnqEROxHFWwukWtujGxrPu548 Rgcr/o5Lu9EjKGn1zFi+WR4W1Jh2sExFh9hvdHHeox3gAfq+tivXd7vZBYnQNJ88 6v6YlrVDX9OZ7H6eCrmZmxaK1yc9Iw== =sXjo -----END PGP SIGNATURE----- --Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:36:50 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:36:50 2018 Received: from localhost ([127.0.0.1]:52905 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQd7-0005dm-O1 for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:36:49 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:51540) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1euQd6-0005de-FG for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:36:48 -0500 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 352B933600C4; Fri, 9 Mar 2018 23:36:47 +0100 (CET) Date: Fri, 9 Mar 2018 23:36:44 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180309233644.7dc53f8e@HIDDEN> In-Reply-To: <87muzgykcl.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> <87muzgykcl.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/Qcuacp5x8cg/Xqbkmau+X1e"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/Qcuacp5x8cg/Xqbkmau+X1e Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable > Similarly, it seems that virtio_blk has to be loaded explicitly: is not > reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/= =E2=80=A6/modalias), nor > do we get a modprobe query for it. qemu seems to have a bug that it doesn't assign pci ids properly. Patch v9 6/7 works around it by fixing the virtio-blk-pci address. Nicer fixes welcome. --Sig_/Qcuacp5x8cg/Xqbkmau+X1e Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjDHwACgkQ5xo1VCww uqXulgf+OpolkwmELThupRx/W0t2WQJeFm+Ho+G6OdSRoHPG7pIg+Tcb24jtRVTD 87fYf2IRRJe2Vx+O0ASGZd1NfDjyVX+fXnhnvfPRFg9SB2zGRkoLSMuACEelx3Ir v8qpPnm+CmqUlTBldzTwJ/TSNWHVGB1SH3W/tgGGK0yljFvHIfnPYssrgMT84tDo +G1yVVtSxSU+5Y0DxkCjTeo4ZYkJ5fn/0lsL96iUSb4vJNlUqDJUo3ALJUa2aa5Z dmw1zzum71yBzSH2QjPyqqEoxgo/apAA/rqZt1J0o0Yayd+ZETBtDjg0PdSxXl0n d1cB0c6ejWpFsSxhcDRnjOmXC2Q5ig== =4rsy -----END PGP SIGNATURE----- --Sig_/Qcuacp5x8cg/Xqbkmau+X1e--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:26:57 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:26:57 2018 Received: from localhost ([127.0.0.1]:52901 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQTY-0003R0-PE for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:26:56 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:50772) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1euQTX-0003Qs-AL for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:26:55 -0500 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 26D5D33600C4 for <30604 <at> debbugs.gnu.org>; Fri, 9 Mar 2018 23:26:54 +0100 (CET) Date: Fri, 9 Mar 2018 23:26:50 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v9 7/7] linux-initrd: Use module-aliases->module-file-names, too. Message-ID: <20180309232650.0f37fb89@HIDDEN> In-Reply-To: <20180304010914.1322-8-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> <20180304010914.1322-8-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable On Sun, 4 Mar 2018 02:09:14 +0100 Danny Milosavljevic <dannym@HIDDEN> wrote: > --- a/gnu/system/linux-initrd.scm > +++ b/gnu/system/linux-initrd.scm > @@ -161,17 +161,17 @@ the derivations referenced by EXP are automatically= copied to the initrd." > #:references-graphs `(("init-closure" ,init) > ("modprobe-closure" ,modprobe)= ))) > =20 > -(define (flat-linux-module-directory linux modules) > - "Return a flat directory containing the Linux kernel modules listed in > -MODULES and taken from LINUX." > +(define (flat-linux-module-directory linux aliases) > + "Return a flat directory containing the Linux kernel modules resolved = by > +ALIASES and taken from LINUX." ... > + (define (find-only-entry directory) > + (match (scandir directory) > + (("." ".." basename) > + (string-append directory "/" basename)))) Probably unsafe since the order is not guaranteed. --Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjCioACgkQ5xo1VCww uqXOZQgAkZgLnU86tFzMFoHikvaAZ41DEtYdjK+787F90a0+RSvTIMDMpFXvL40K LjRBRv3k7Im8o/gw4v0h0Jx9DhfwKmL7zXOOFkaK4urXx80Gfp49kozLeAUJWutP LRt3kn4hqw8PQzT/nDW46jH9GnNUyCAk2sANoQQWOdk+LpBc1EHs4Z571y6rQDb8 i6x9Ui3CNvDHYXjWsRDRS1+EIZaKTNpeTbD9/iyZOLltD6CXR37/6vgPyKP/kqE9 RHtHdwyrl6MVfPuomee2iiqC5z1HT+EXWjevXXVkIvP1azIGwM2mWxpJLynDO5Ld 0KYbk0UMDZ3/HFCSbcoODoMwvFeNEA== =PIV0 -----END PGP SIGNATURE----- --Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:19:49 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:19:49 2018 Received: from localhost ([127.0.0.1]:52891 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQMf-0003Eu-1p for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:19:49 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:50178) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1euQMd-0003En-TO for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:19:48 -0500 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8735133600C4; Fri, 9 Mar 2018 23:19:46 +0100 (CET) Date: Fri, 9 Mar 2018 23:19:42 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180309231942.023f6655@HIDDEN> In-Reply-To: <20180309231320.20a02822@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/GgwLbqb0fXVNFjmMJIU7Cyj"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/GgwLbqb0fXVNFjmMJIU7Cyj Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable oops, On Fri, 9 Mar 2018 23:13:20 +0100 Danny Milosavljevic <dannym@HIDDEN> wrote: > As I said, modprobe mutates /sys - you cannot use find-files. =20 I guess technically it's the Linux kernel module that mutates it. >I haven't used > ftw just to be contrarian. There's even a warning comment :-) >=20 > In order to find that out, try to print how /sys looked before modprobe -= then > in the early guile recovery REPL print how /sys looks again - the alias it > was juuust complaining about will be there just fine. >=20 > My patch series works fine lazy-loading the IO charset, virtio_blk, virti= o_net. (v9) --Sig_/GgwLbqb0fXVNFjmMJIU7Cyj Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjCH4ACgkQ5xo1VCww uqWLvwgAp6KezsUDCUjxB5czeSEyKuSBRy6gciJgiTDnedaerVSA4+yHafKUUKe1 1JY9TK5I6qJbSnkaBXFK1ajrYEcz69jODXPRbv7NS0NtK+PrJBpIeXXqpVfYhsll KO2CKDWrZ9A7CXLURtSsRrf8vzhkuccoJs8xQnqqoUPYt6FTRYFm9G6XukWY5Wop 5nXX2it0JYFN2M47Eb99uMy3khSanLUY7iC6Ib9vMxBURVURXXFkteb4FRbYC24c 6P2SxkabRhOkc1SrWOXLaUvLl5FKozFO82elcohJCol4s/osEodG9vS8KNTFD0Ej XkVhv/a5u7/+i/iqoyuXj4KEU9054A== =ixMQ -----END PGP SIGNATURE----- --Sig_/GgwLbqb0fXVNFjmMJIU7Cyj--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:13:46 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:13:46 2018 Received: from localhost ([127.0.0.1]:52876 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQGo-000345-Iu for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:13:46 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:49634) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1euQGm-00033w-QN for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:13:45 -0500 Received: from localhost (178.113.255.63.wireless.dyn.drei.com [178.113.255.63]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 2268033600C4; Fri, 9 Mar 2018 23:13:43 +0100 (CET) Date: Fri, 9 Mar 2018 23:13:20 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180309231320.20a02822@HIDDEN> In-Reply-To: <87muzgykcl.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> <87muzgykcl.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/GnqWfEzZKnoi.SFxFgthD/Z"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/GnqWfEzZKnoi.SFxFgthD/Z Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Fri, 09 Mar 2018 23:06:50 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > When than happens, our modprobe gets called with the =E2=80=9Cnetdev-eth0= =E2=80=9D > alias, which it cannot handle, leading to this error. >=20 > By explicitly loading =E2=80=9Cvirtio_net=E2=80=9D and > sleeping a bit,=20 Uhhhhh no please don't. > point, but fail later on: ... > --8<---------------cut here---------------end--------------->8--- >=20 > Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn= =E2=80=99t even > invoked, although my understanding is that it should (per =E2=80=98load_n= ls=E2=80=99 in > nls_base.c in the kernel, called from vfat/inode.c). >=20 > Similarly, it seems that virtio_blk has to be loaded explicitly: is not > reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/= =E2=80=A6/modalias), nor > do we get a modprobe query for it. >=20 > All in all on-demand loading seems more complicated that it seemed. >=20 > What are we missing here? As I said, modprobe mutates /sys - you cannot use find-files. I haven't us= ed ftw just to be contrarian. There's even a warning comment :-) In order to find that out, try to print how /sys looked before modprobe - t= hen in the early guile recovery REPL print how /sys looks again - the alias it was juuust complaining about will be there just fine. My patch series works fine lazy-loading the IO charset, virtio_blk, virtio_= net. It took about 30 h to work out the correct minimal combination - just sayin= g :-) --Sig_/GnqWfEzZKnoi.SFxFgthD/Z Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjBwAACgkQ5xo1VCww uqV8/Qf+J555Zoy+CZAq38ezF4hHwS5YbLy//BfK3/3lu2RwSu4h53vmvUqcFZrl vk+Y1Q7b7SJUmzUKCj/doQ+VgjJgpWlBia0PM0H0kNdKYrz4qbCH3KMDmyKKxlUS m0uMD7xiSef1evuBRttunzQIwv6zCUJn8kqyalkFQZ01lDXv7Mex0vpG/QkTTVJZ aTregruimbDWlMnNfUfN9aq5tKlvZfBrzysXGVpZDZlbZrUBkGkd4R8Skq4WdAwv OQcLkclyTwJOzEO7+ZCkw1b2uzKilS0K6kdoSAylcaXkc9wqjaV1feE9HrQkUHb3 OTPBJQScuFZ7VApDRwn6xCL/DfTvhg== =uf4c -----END PGP SIGNATURE----- --Sig_/GnqWfEzZKnoi.SFxFgthD/Z--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:06:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 09 17:06:58 2018 Received: from localhost ([127.0.0.1]:52871 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1euQAD-0002tc-Nl for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:06:57 -0500 Received: from hera.aquilenet.fr ([185.233.100.1]:33794) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1euQAA-0002tT-Ed for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:06:56 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 790CD10FBA; Fri, 9 Mar 2018 23:06:53 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id VAI4MblhOCdW; Fri, 9 Mar 2018 23:06:52 +0100 (CET) Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465]) by hera.aquilenet.fr (Postfix) with ESMTPSA id ACD49FFCA; Fri, 9 Mar 2018 23:06:51 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN> Date: Fri, 09 Mar 2018 23:06:50 +0100 In-Reply-To: <20180304133444.4edceecd@HIDDEN> (Danny Milosavljevic's message of "Sun, 4 Mar 2018 13:34:44 +0100") Message-ID: <87muzgykcl.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hello! I=E2=80=99ve reworked this patch series a bit, but now I=E2=80=99m stuck on= this: Danny Milosavljevic <dannym@HIDDEN> skribis: > ERROR: In procedure network-interface-flags: > In procedure network-interface-flags: No such device When than happens, our modprobe gets called with the =E2=80=9Cnetdev-eth0= =E2=80=9D alias, which it cannot handle, leading to this error. By explicitly loading =E2=80=9Cvirtio_net=E2=80=9D and sleeping a bit, we g= et past that point, but fail later on: --8<---------------cut here---------------start------------->8--- loading '/gnu/store/n2zvdxp25kvg7wy5xr1y5n9r4502fw80-linux-vm-loader'... environment variable `PATH' set to `/gnu/store/vxl918zb9brnrgaipzsykpy3mzca= fvcr-qemu-minimal-2.11.1/bin:/gnu/store/lvkaf3xlvy57bvap51xlzb209ilbkgcv-pa= rted-3.2/sbin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/= bin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/sbin:/gnu/= store/0sq2nflm42x0znkv44add0gk82khkcb6-dosfstools-4.1/sbin:/gnu/store/0hl51= 3mnpkhszm2hjai2w9cxmpxs0vgq-sed-4.4/bin:/gnu/store/1h44pkgdd7n6s3i2vjh54aws= vfmc219j-grep-3.1/bin:/gnu/store/kgzvfby2ggi1xawsh5vjh4s93qk2dp9k-coreutils= -8.28/bin:/gnu/store/k7r2m2wgj8x8jjhccwjsiimp0dlzxb7i-findutils-4.6.0/bin:/= gnu/store/ahxc89r6npzf2bbl8yg5vdjicskzzjf3-gawk-4.1.4/bin' creating partition table with 2 partitions (20.0 MiB, 40.0 MiB)... Warning: The resulting partition is not properly aligned for best performan= ce. creating ext4 partition... mke2fs 1.43.6 (29-Aug-2017) ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing = mtab file while determining whether /dev/vda1 is mounted. Creating filesystem with 20480 1k blocks and 5136 inodes Filesystem UUID: 81a538e9-3efe-406b-bf67-fa153fa3c6a6 Superblock backups stored on blocks:=20 8193 Allocating group tables: done=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20 Writing inode tables: done=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20 Creating journal (1024 blocks): done Writing superblocks and filesystem accounting information: done [ 3.190801] EXT4-fs (vda1): mounted filesystem with ordered data mode. O= pts: (null) populating... clearing file timestamps... creating FAT partition... mkfs.fat 4.1 (2017-01-24) [ 3.235493] FAT-fs (vda2): IO charset iso8859-1 not found ERROR: In procedure mount: In procedure mount: Invalid argument --8<---------------cut here---------------end--------------->8--- Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn= =E2=80=99t even invoked, although my understanding is that it should (per =E2=80=98load_nls= =E2=80=99 in nls_base.c in the kernel, called from vfat/inode.c). Similarly, it seems that virtio_blk has to be loaded explicitly: is not reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/=E2= =80=A6/modalias), nor do we get a modprobe query for it. All in all on-demand loading seems more complicated that it seemed. What are we missing here? Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:53:35 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 04 07:53:35 2018 Received: from localhost ([127.0.0.1]:43529 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esT8w-0006FL-RR for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:53:35 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:37396) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esT8v-0006FD-52 for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:53:33 -0500 Received: from localhost (77.118.231.171.wireless.dyn.drei.com [77.118.231.171]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8A0403367616; Sun, 4 Mar 2018 13:53:31 +0100 (CET) Date: Sun, 4 Mar 2018 13:53:27 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules. Message-ID: <20180304135327.0a103e57@HIDDEN> In-Reply-To: <87y3j84xtu.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-3-dannym@HIDDEN> <87y3j84xtu.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Sat, 03 Mar 2018 23:07:57 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > We could reuse modules.alias and modules.devname from the =E2=80=98linux-= libre=E2=80=99 > package (right?), but I guess it doesn=E2=80=99t hurt to generate custom = ones. Yes, but it would be somewhat dirty. Here's why: Linux-libre contains a superset of modules and also their modules.alias and modules.devname contain a superset of modules compared to the initrd. That means (1) modules.alias would contain aliases which map to modules which don't exist. Since we don't for-each it, who cares. (2) modules.devname would contain devnames for modules which don't exist. That means the boot code would create files in /dev which, when someone accesses them, would try to load modules which don't exist - and then the access would fail. Technically both are not bad, but (2) is bad "UX" practise nowadays - and not done in the Linux world any more since udev exists. I can still remember the days of 8540 entries static /dev filesystem (as in, really on the hard disk), 7000 of which didn't work (or even valid for this system type :P). If something goes wrong, good luck finding the needle in the haystack (which /dev file you can use to boot). --Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb7EcACgkQ5xo1VCww uqXPwAf+P1CjrHIU4Ewpz6ucWfrmOOxqL3oR5zvmf1xtQGitXspjCtfP7OQhEok4 NS43aa4Rcurf32znHZvciYwiTIvkziXGJS3aMh7RbbJc2M8VG13gYTLYr9+YRs28 GSGLIFlHKAjozMeyOHOv9zzpMVgTH0zVE0B1dlV+0ttGUxSXu00v9QX4aoWTh97p p7HNT/yHvdhfYFUJDjiEk63eSvSkLyvWMxqChGU2iTOv3EDCRFREzKMYWHGBfjpu 5wQRUW5uivoX116X0iA2ipwJ6mb8C31yqInEVAFxt6GFzP5+AmwIrdVrGfG4N/we NkQd9yJol2LXAPV4qI8pfU6h7aFkPQ== =P/RW -----END PGP SIGNATURE----- --Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:45:13 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 04 07:45:13 2018 Received: from localhost ([127.0.0.1]:43520 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esT0r-00062x-LN for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:45:13 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36744) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esT0q-00062p-8C for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:45:12 -0500 Received: from localhost (77.118.231.171.wireless.dyn.drei.com [77.118.231.171]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 2D4963367616; Sun, 4 Mar 2018 13:45:11 +0100 (CET) Date: Sun, 4 Mar 2018 13:45:04 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules. Message-ID: <20180304134504.0a15b26d@HIDDEN> In-Reply-To: <87y3j84xtu.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-3-dannym@HIDDEN> <87y3j84xtu.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/4j2QMexvE7dYMZ.hPX8mPXg"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/4j2QMexvE7dYMZ.hPX8mPXg Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, > (write-module-alias-database modules port) ;for =E2=80=9Cmodules.alias= =E2=80=9D > (write-module-device-database modules port) ;for =E2=80=9Cmodules.devna= me=E2=80=9D I'd prefer "install-" because their interface is somewhat like install-file (caller provides output directory and callee adds "modules."* automatically= ). But I used the names "write-module-"* in the patchset v9. > I=E2=80=99m not sure we need =E2=80=98install-module-files=E2=80=99 itsel= f. Perhaps we can > inline it at the call site? Sure. Did so now. > For the devname code, please avoid =E2=80=98set!=E2=80=99. I found an even better way to avoid both. > The indentation of =E2=80=98match=E2=80=99 forms is wrong. Would it be O= K for you to > pass it through ./etc/indent-code.el? (It=E2=80=99s non interactive, you= don=E2=80=99t > need to actually use Emacs.) I'm actually trying to switch to emacs but when I press Tab it messes up the stuff more. Is there some kind of configuration for guile indentation? Also, every time I open gnu/build/linux-modules.scm I get "The local variables list .. may not be safe * bug-reference-bug-repexp * eval: (modify-syntax-entry 126 "'") * eval: (modify-syntax-entry 36 "'") * eval: (modify-syntax-entry 43 "'")" ??? --Sig_/4j2QMexvE7dYMZ.hPX8mPXg Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb6lAACgkQ5xo1VCww uqVseAf/VW2PLCgcY8nImiTi4YlI/BODnYJVCkVIzmA5x/hS3+5OxKXh1LnUjECD p50Bhz9u8i6v3P6PFKYa7Om3aowsyKOH9E2nochuk8tGKkbBWTPA6ou2TZcJBE2G SjswuTE7nUBBIjg8vEEzZ9ufF536jDzrzzsyFaVTHlfCHr/eTJ29fg9fR0wMPGgB PVHZKSI5J0zrZycmSlO8+I1m/NQGzvUMDE2V01DGGIhbLQhcOSy/YL8hCYwbBF+G lMznbEgw+ZjvoZCeRJfooZeuRU/myeAbJ1mAVUlTeDLLdZzFKOTqTyRR/e7B9jUT hCsEiOUOX4Pino5+64dzLsfv16jBcg== =wMFl -----END PGP SIGNATURE----- --Sig_/4j2QMexvE7dYMZ.hPX8mPXg--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:34:57 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Mar 04 07:34:57 2018 Received: from localhost ([127.0.0.1]:43516 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esSqv-0005nq-KX for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:34:57 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:35974) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esSqs-0005nh-VM for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:34:55 -0500 Received: from localhost (77.118.231.171.wireless.dyn.drei.com [77.118.231.171]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D0C543367616; Sun, 4 Mar 2018 13:34:52 +0100 (CET) Date: Sun, 4 Mar 2018 13:34:44 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180304133444.4edceecd@HIDDEN> In-Reply-To: <87sh9g4vy1.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/war/2NgU7F4a1M/YUNS3K5e"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/war/2NgU7F4a1M/YUNS3K5e Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Hi Ludo, I've been thinking about it some more - I think it can be made to work "you= r" way. I'm trying to integrate it right now. But! The module-aliases->module-file-names way I've been pursuing (which a= lso returns the recursive dependencies) has the advantage of using exactly the = same procedure for both flat-linux-module-directory (which copies files) and for our modprobe (which loads them later). This means that it's very likely these two will match. But if load-linux-module* recursively loads modules on its own it's easily possible that these will diverge - what flat-linux-module-directory is doing could (accidentially) differ in the future. Maybe that's overly defensive programming. What do you think? My flat-linux-module-directory basically just returns a subset of the direc= tory tree it gets as parameter (and flattens it for no reason). Also, I've been trying to use find-files for /sys before, like you do. It doesn't work correctly - probably because of the mutation that modprobe = does (find-files sorts - not sure whether that's the whole story). Integration tests just finished - even the basic system test fails because = of it now. I tried only this: (define (load-kernel-modules) "Examine /sys/devices to find out which modules to load and load them." - (define enter? - (const #t)) - (define (down! directory stat result) - ;; Note: modprobe mutates the tree starting with DIRECTORY. - (let ((modalias-name (string-append directory "/modalias"))) - (if (file-exists? modalias-name) - (let ((modalias - (string-trim-right (call-with-input-file modalias-name - read-string) - #\newline))) - (system* "/sbin/modprobe" "-q" "--" modalias)))) - #t) - (define up - (const #t)) - (define skip - (const #t)) - (define leaf - (const #t)) - (define (error name stat errno result) - (format (current-error-port) "warning: ~a: ~a~%" - name (strerror errno)) - result) - (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (for-each (lambda (modalias) + (system* "/sbin/modprobe" "-q" "--" modalias)) + (system-device-aliases))) Doesn't work anymore... ERROR: In procedure network-interface-flags: In procedure network-interface-flags: No such device (I've exported system-device-aliases) --Sig_/war/2NgU7F4a1M/YUNS3K5e Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb5+QACgkQ5xo1VCww uqXJ9wf/UFzvHkvHtXvKpynbANSL48kLwGHYSKetR6r353nTtySJZV0kVrRf6aEk eLZnfbjOFX1Y7cQYKPgiC4/lg5JbqxWkWNR0R1zNQvUgXByL8hxfkuZYtwWE7z5G Buw/dZBJNdRcG8ZlaOw6r88bhD3CtnceI+XhcqH6sOGud2Bef3cn8HO2gLeA5vi9 DOmeXM1wlP45eYxZ+FNKRJ7WXQwsnGo3WTwowpttZQdA0p80BKmjy+7Jv2DOW3D9 z8lfZ/yHeOQkW1PE7vi0TsjTKy1ryFSBfI37MMcOfmFgenkMKG4K/+c9rMUPltGi 0rBPw7P1HKqxQAXWYaISS3MpQRrvpQ== =uxOr -----END PGP SIGNATURE----- --Sig_/war/2NgU7F4a1M/YUNS3K5e--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:55:12 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:55:12 2018 Received: from localhost ([127.0.0.1]:43392 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esIrn-0005bM-Vj for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:55:12 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42018) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esIrj-0005bB-Ov for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:55:08 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 5E7C533602D9; Sun, 4 Mar 2018 02:55:06 +0100 (CET) Date: Sun, 4 Mar 2018 02:54:54 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180304025454.791a2b87@HIDDEN> In-Reply-To: <87sh9g4vy1.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/Bu7nXlkPzNj2tBNhO1bISAs"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/Bu7nXlkPzNj2tBNhO1bISAs Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Ah, your attached patch is fine, just the proposed usage=20 (for-each (catch-ENOENT load-linux-module*) ^^^^^^^^^^^^^^^^^^ (needed-modules (known-module-aliases (string-append linux-module-directory "/modules.alias")))) is probably not working. --Sig_/Bu7nXlkPzNj2tBNhO1bISAs Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqbUe8ACgkQ5xo1VCww uqXHyAf/ZSamYfxnytp+YzqCZ3ZmoZ/6vD+5H176T5CuMtS7ZtfrkFe4d/lvjB3R QfAd5rBRzuJ5jO0Or75iGgUleXGO191Rqt/r/AoSeOCur+T3VUAOSrv689F9l/bU bAOdnOJqNarX7oBrrqmySg0MINUdjaCpWW7B+HSCTuG81fSJl2vdJnUZvPjs25Zn A+wLozvtzps+wOOrbiQNFspCvwTecMccsUbG+s022c/Ssr/hHxwE43SdUzApR1YZ F3ugEM1G60KgfXgjTFS9DOKIMLVbfvTZy7J+cbbc9GTrbPhoLFEieUQj+MyjTMb6 oCT+/VZANgBc4YzfoMHEi3Pp1uGg6Q== =54nz -----END PGP SIGNATURE----- --Sig_/Bu7nXlkPzNj2tBNhO1bISAs--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:42 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:42 2018 Received: from localhost ([127.0.0.1]:43365 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9m-0002c7-ES for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:42 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38486) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9k-0002bt-Sr for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:41 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id EDF6D3362AE1; Sun, 4 Mar 2018 02:09:39 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 7/7] linux-initrd: Use module-aliases->module-file-names, too. Date: Sun, 4 Mar 2018 02:09:14 +0100 Message-Id: <20180304010914.1322-8-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (flat-linux-module-directory): Use module-aliases->module-file-names. * gnu/build/linux-modules.scm (file-name->module-name): Export. --- gnu/build/linux-modules.scm | 1 + gnu/system/linux-initrd.scm | 67 ++++++++++++++++++++++++++------------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index f6bb0512b..81a4b15b1 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -35,6 +35,7 @@ ensure-dot-ko module-aliases module-aliases->module-file-names + file-name->module-name module-dependencies recursive-module-dependencies modules-loaded diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 339ecf754..0b976afad 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -161,17 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd." #:references-graphs `(("init-closure" ,init) ("modprobe-closure" ,modprobe)))) -(define (flat-linux-module-directory linux modules) - "Return a flat directory containing the Linux kernel modules listed in -MODULES and taken from LINUX." +(define (flat-linux-module-directory linux aliases) + "Return a flat directory containing the Linux kernel modules resolved by +ALIASES and taken from LINUX." (define build-exp (with-imported-modules (source-module-closure '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 ftw) (srfi srfi-1) - (guix build utils) + (guix build utils) ; mkdir-p (gnu build linux-modules)) (define (string->regexp str) @@ -181,31 +181,42 @@ MODULES and taken from LINUX." (define module-dir (string-append #$linux "/lib/modules")) - (define (lookup module) - (let ((name (ensure-dot-ko module))) - (match (find-files module-dir (string->regexp name)) - ((file) - file) - (() - (error "module not found" name module-dir)) - ((_ ...) - (error "several modules by that name" - name module-dir))))) + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) - (define modules - (let ((modules (map lookup '#$modules))) - (append modules - (recursive-module-dependencies modules - #:lookup-module lookup)))) - - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define linux-release-module-directory + (find-only-entry module-dir)) + (define modules + (module-aliases->module-file-names #$linux '#$aliases)) + + (define version + (basename linux-release-module-directory)) + + (define (install-module-files module-files output) + "Install MODULE-FILES to OUTPUT. +Precondition: OUTPUT is an empty directory except for \"modules.builtin\"." + (let ((aliases + (map (lambda (module-file-name) + (format #t "copying '~a'...~%" module-file-name) + (copy-file module-file-name + (string-append output "/" + (basename module-file-name))) + `(,(file-name->module-name module-file-name) . + ,(module-aliases module-file-name))) + (sort module-files string<)))) + (install-file (string-append linux-release-module-directory + "/modules.builtin") + output) + (write-module-alias-database aliases output) + (write-module-device-database aliases output))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (install-module-files (delete-duplicates modules) output) + #t)))) (computed-file "linux-modules" build-exp)) (define* (raw-initrd file-systems
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:41 2018 Received: from localhost ([127.0.0.1]:43363 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9l-0002bu-6h for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:41 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38478) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9j-0002bm-Na for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:40 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id C5218336224E; Sun, 4 Mar 2018 02:09:35 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 6/7] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Sun, 4 Mar 2018 02:09:13 +0100 Message-Id: <20180304010914.1322-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index cf1ec651a..78cc8cad1 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -700,7 +700,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:36 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:36 2018 Received: from localhost ([127.0.0.1]:43359 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9f-0002bZ-UJ for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:36 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38464) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9d-0002bD-Sj for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:34 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 0ACB03362AE1; Sun, 4 Mar 2018 02:09:32 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 5/7] vm: Allow qemu-image builder to load Linux kernel modules. Date: Sun, 4 Mar 2018 02:09:12 +0100 Message-Id: <20180304010914.1322-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 91ff32ce9..cf1ec651a 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:34 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:34 2018 Received: from localhost ([127.0.0.1]:43357 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9e-0002bQ-Mk for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:34 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38456) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9c-0002b6-W9 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:33 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id DACC533636F2; Sun, 4 Mar 2018 02:09:31 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 4/7] linux-boot: Load kernel modules only when the hardware is present. Date: Sun, 4 Mar 2018 02:09:11 +0100 Message-Id: <20180304010914.1322-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 42 +++++++++++++++++++++++++++++++++++------- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..2236d8971 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,9 +469,31 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! directory stat result) + ;; Note: modprobe mutates the tree starting with DIRECTORY. + (let ((modalias-name (string-append directory "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +508,16 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 6ad6d75f7..339ecf754 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -266,7 +266,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:33 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:33 2018 Received: from localhost ([127.0.0.1]:43354 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9d-0002bC-Bl for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:33 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38446) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9b-0002ar-NV for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:32 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 5BBDC336224E; Sun, 4 Mar 2018 02:09:30 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe. Date: Sun, 4 Mar 2018 02:09:10 +0100 Message-Id: <20180304010914.1322-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (%modprobe): New variable. (expression->initrd): Add modprobe, LINUX-MODULE-DIRECTORY. (raw-initrd): Pass KODIR as LINUX-MODULE-DIRECTORY. * gnu/build/linux-initrd.scm (build-initrd): Add modprobe. --- gnu/build/linux-initrd.scm | 13 ++++++++- gnu/system/linux-initrd.scm | 65 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..d4cb5e2d8 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init modprobe linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,17 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when modprobe + (mkdir-p "sbin") + (symlink modprobe "sbin/modprobe") + (compile-to-cache "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index e0cb59c00..6ad6d75f7 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -46,7 +46,8 @@ %base-initrd-modules raw-initrd file-system-packages - base-initrd)) + base-initrd + %modprobe)) ;;; Commentary: @@ -56,11 +57,61 @@ ;;; ;;; Code: +(define* (%modprobe linux-module-directory #:key + (guile %guile-static-stripped)) + "Minimal implementation of modprobe for our initrd. +LINUX-MODULE-DIRECTORY is the directory that contains \"lib\"." + (program-file "modprobe" + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) (ice-9 getopt-long) + (ice-9 match) (srfi srfi-1)) + (define option-spec + '((quiet (single-char #\q) (value #f)))) + (define options + (getopt-long (command-line) option-spec)) + (when (option-ref options 'quiet #f) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + (let ((exit-status 0)) + (for-each (match-lambda + (('quiet . #t) + #f) + ((() aliases ...) + (catch #t + (lambda () + (let ((module-file-names + (module-aliases->module-file-names + #$linux-module-directory aliases))) + (for-each (lambda (name) + (catch 'system-error + (lambda () + (when (not (load-linux-module* name + #:recursive? + #f)) + (set! exit-status 1))) + (lambda (key . args) + (when (not (= EEXIST + (system-error-errno + (cons key args)))) + (print-exception (current-error-port) + #f key args) + (set! exit-status 1))))) + module-file-names))) + (lambda (key . args) + (print-exception (current-error-port) + #f key args) + (set! exit-status 1))))) + options) + (exit exit-status)))) + #:guile guile)) (define* (expression->initrd exp #:key (guile %guile-static-stripped) (gzip gzip) + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -73,6 +124,9 @@ the derivations referenced by EXP are automatically copied to the initrd." (define init (program-file "init" exp #:guile guile)) + (define modprobe + (%modprobe linux-module-directory #:guile guile)) + (define builder (with-imported-modules (source-module-closure '((gnu build linux-initrd))) @@ -96,12 +150,16 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:modprobe #$modprobe + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. - #:references-graphs '("closure") + #:references-graphs '("init-closure" + "modprobe-closure") #:gzip (string-append #$gzip "/bin/gzip"))))) (gexp->derivation name builder - #:references-graphs `(("closure" ,init)))) + #:references-graphs `(("init-closure" ,init) + ("modprobe-closure" ,modprobe)))) (define (flat-linux-module-directory linux modules) "Return a flat directory containing the Linux kernel modules listed in @@ -225,6 +283,7 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:32 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:32 2018 Received: from localhost ([127.0.0.1]:43350 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9b-0002at-W1 for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:32 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38438) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9a-0002ad-78 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:30 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 483A83362AE1; Sun, 4 Mar 2018 02:09:29 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 2/7] linux-modules: Add module-aliases->module-file-names. Date: Sun, 4 Mar 2018 02:09:09 +0100 Message-Id: <20180304010914.1322-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (module-aliases->module-file-names): New procedure. --- gnu/build/linux-modules.scm | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 0aaf2ff6f..f6bb0512b 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -21,6 +21,7 @@ #:use-module (guix elf) #:use-module (guix glob) #:use-module (guix build syscalls) + #:use-module (guix build utils) ; find-files #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-1) @@ -28,9 +29,12 @@ #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (ice-9 regex) + #:use-module (ice-9 ftw) #:export (dot-ko ensure-dot-ko module-aliases + module-aliases->module-file-names module-dependencies recursive-module-dependencies modules-loaded @@ -438,4 +442,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by (format port "~a ~a ~a~a:~a\n" module devname "b" major minor)))))))) aliases)))) +(define (module-aliases->module-file-names linux aliases) + "Resolve ALIASES to module file names, including their dependencies (which will appear +first). Each alias will map to a list of module file names. +LINUX is the directory containing \"lib\"." + (define (string->regexp str) + ;; Return a regexp that matches STR exactly. + (string-append "^" (regexp-quote str) "$")) + + (define module-dir + (string-append linux "/lib/modules")) + + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + + (define linux-release-module-directory + (find-only-entry module-dir)) + + (define known-module-aliases* + (known-module-aliases + (string-append linux-release-module-directory + "/modules.alias"))) + (define (resolve-alias alias) + "If possible, resolve ALIAS to a list of module names. +Otherwise return just ALIAS as possible module names." + (match (delete-duplicates (matching-modules alias + known-module-aliases*)) + (() + (list alias)) + (items + items))) + + (define (lookup module) + (let ((name (ensure-dot-ko module))) + (match (find-files module-dir (string->regexp name)) + ((file) + file) + (() + (error "module not found" name module-dir)) + ((_ ...) + (error "several modules by that name" + name module-dir))))) + (append-map (lambda (alias) + (let ((modules (map lookup (resolve-alias alias)))) + (append (recursive-module-dependencies modules + #:lookup-module + lookup) + modules))) + aliases)) + ;;; linux-modules.scm ends here
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:31 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:30 2018 Received: from localhost ([127.0.0.1]:43348 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9a-0002ak-Ng for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:30 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38428) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9Z-0002aS-2c for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:29 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 12781336224E; Sun, 4 Mar 2018 02:09:27 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 1/7] linux-modules: Add "modules.devname" and "modules.alias" writer. Date: Sun, 4 Mar 2018 02:09:08 +0100 Message-Id: <20180304010914.1322-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> <20180304010914.1322-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (write-module-alias-database): New procedure. (write-module-device-database): New procedure. (%not-dash): New variable. --- gnu/build/linux-modules.scm | 58 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4fe673cca..0aaf2ff6f 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -36,6 +36,8 @@ modules-loaded module-loaded? load-linux-module* + write-module-alias-database + write-module-device-database current-module-debugging-port @@ -380,4 +382,60 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (write-module-alias-database aliases output) + "Install \"modules.alias\" for ALIASES to directory OUTPUT." + (call-with-output-file (string-append output "/modules.alias") + (lambda (port) + (format port + "# Aliases extracted from modules themselves.\n") + (for-each (match-lambda ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias + module)) + aliases))) + aliases)))) + +(define (write-module-device-database aliases output) + "Install \"modules.devname\" for ALIASES to directory OUTPUT." + (call-with-output-file (string-append output "/modules.devname") + (lambda (port) + (format port + "# Device nodes to trigger on-demand module loading.\n") + (for-each (match-lambda + ((module . aliases) + (let* ((interesting-aliases + ;; Note: there's only one devname and then only one + ;; (char-major|block-major). + (filter-map + (match-lambda + ((? (cut string-prefix? "devname:" <>) alias) + `(devname . ,(string-drop alias (string-length "devname:")))) + ((? (cut string-prefix? "char-major-" <>) alias) + `(char-major . ,(string-drop alias (string-length "char-major-")))) + ((? (cut string-prefix? "block-major-" <>) alias) + `(block-major . ,(string-drop alias (string-length "block-major-")))) + (_ #f)) + aliases)) + (devname (assq-ref interesting-aliases + 'devname)) + (char-major (assq-ref interesting-aliases + 'char-major)) + (block-major (assq-ref interesting-aliases + 'block-major))) + (when (and devname char-major) + (let ((parts (string-tokenize char-major %not-dash))) + (match parts + ((major minor) + (format port "~a ~a ~a~a:~a\n" module devname + "c" major minor))))) + (when (and devname block-major) + (let ((parts (string-tokenize block-major %not-dash))) + (match parts + ((major minor) + (format port "~a ~a ~a~a:~a\n" module devname + "b" major minor)))))))) aliases)))) + ;;; linux-modules.scm ends here
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:28 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:09:28 2018 Received: from localhost ([127.0.0.1]:43344 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI9Y-0002aP-Ft for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:28 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38420) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI9W-0002aH-Iu for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:26 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 93D15336224E; Sun, 4 Mar 2018 02:09:25 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v9 0/7] Load Linux module only when supported hardware is present. Date: Sun, 4 Mar 2018 02:09:07 +0100 Message-Id: <20180304010914.1322-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180303135533.6112-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (7): linux-modules: Add "modules.devname" and "modules.alias" writer. linux-modules: Add module-aliases->module-file-names. linux-initrd: Provide pure-Guile modprobe. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk uniquely identifiable in /sys. linux-initrd: Use module-aliases->module-file-names, too. gnu/build/linux-boot.scm | 42 +++++++++++--- gnu/build/linux-initrd.scm | 13 ++++- gnu/build/linux-modules.scm | 114 +++++++++++++++++++++++++++++++++++++ gnu/build/vm.scm | 2 +- gnu/system/linux-initrd.scm | 136 +++++++++++++++++++++++++++++++++----------- gnu/system/vm.scm | 34 +++++++++-- 6 files changed, 295 insertions(+), 46 deletions(-)
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:07:05 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 20:07:05 2018 Received: from localhost ([127.0.0.1]:43340 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esI7F-0002XB-1r for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:07:05 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38238) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esI7D-0002Wy-96 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:07:03 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 99A22336224E; Sun, 4 Mar 2018 02:07:01 +0100 (CET) Date: Sun, 4 Mar 2018 02:06:43 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: ludo@HIDDEN (Ludovic =?ISO-8859-1?Q?Court=E8s?=) Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180304020643.6773e016@HIDDEN> In-Reply-To: <87sh9g4vy1.fsf@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> <87sh9g4vy1.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/2j+BS72XcrZBeirf3UmbMmD"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/2j+BS72XcrZBeirf3UmbMmD Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Ludo, On Sat, 03 Mar 2018 23:48:38 +0100 ludo@HIDDEN (Ludovic Court=C3=A8s) wrote: > > + (system* "/sbin/modprobe" "-q" "--" modalias)))) =20 >=20 > If we change =E2=80=98flat-linux-module-directory=E2=80=99 to produce a = =E2=80=98modules.alias=E2=80=99 > file, here we could read =E2=80=98modules.aliases=E2=80=99 directly and l= oad the right > thing. >=20 > With the patch below, we get =E2=80=98needed-modules=E2=80=99, and we cou= ld simply do: >=20 > (for-each (catch-ENOENT load-linux-module*) > (needed-modules > (known-module-aliases (string-append linux-module-directory > "/modules.alias")))) >=20 > and we can do away with kmod=E2=80=99s modprobe. It's not kmod's modprobe anymore. It's our pure-Guile implementation. Linux lazy-invokes modprobe (for example when mounting stuff), so /sbin/modprobe is never going away - but it can be our implementation. I doubt it will take the modules from the correct directory with your patch. (Of course otherwise it looks much nicer - but I think it won't pass the te= sts) My newest version (v9) will use the same procedure for both computing the l= ist of modules for flat-linux-module-directory and the list of modules that are= to be modprobed - I think it's nice to be able to keep those in sync so we don= 't get nasty surprises. Let's see how that goes... --Sig_/2j+BS72XcrZBeirf3UmbMmD Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqbRqMACgkQ5xo1VCww uqXDwQgAowI5zaIU+SBYbyZPcBgJoXZC0c5raPEdUouIjGTcIY3A0uIY9hLfuMDX kX+Sg60ZEvxBtoJmsy9eMNKlvuzVduB8jNEouH1MQcUBLu6wSLvHhkQRHjamAHkN oRKpLTj429itvdQ0jNewulqshW3xeeneepYDITKFD/sOAHt/ek0DFthYYxIJUEXY PXLkJ+O2mCyspt4uoc+8L+4dtEO9gv3asmu4mhk8D5+bXZ0DgBVsNqmQrOe3XSkc S0no3CafpSInmq+HuGAbFwnJcQbp1ISd3AoSMXEBAfaSVoaE/ZzKFKLgavNuvbpD SQdW8dstK+ZyUiOP6KiaG3g5tn2AHg== =Qtnk -----END PGP SIGNATURE----- --Sig_/2j+BS72XcrZBeirf3UmbMmD--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 22:48:43 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 17:48:43 2018 Received: from localhost ([127.0.0.1]:43292 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esFxL-0007rb-JY for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:48:43 -0500 Received: from hera.aquilenet.fr ([185.233.100.1]:55216) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1esFxJ-0007rS-9F for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:48:41 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id 72AED11DE2; Sat, 3 Mar 2018 23:48:40 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Siot1ErsUpmx; Sat, 3 Mar 2018 23:48:39 +0100 (CET) Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 3465211D90; Sat, 3 Mar 2018 23:48:39 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-4-dannym@HIDDEN> Date: Sat, 03 Mar 2018 23:48:38 +0100 In-Reply-To: <20180303135533.6112-4-dannym@HIDDEN> (Danny Milosavljevic's message of "Sat, 3 Mar 2018 14:55:29 +0100") Message-ID: <87sh9g4vy1.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Danny Milosavljevic <dannym@HIDDEN> skribis: > * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when > the hardware is present. > (lookup-module): Delete procedure. > * gnu/system/linux-initrd.scm (raw-initrd): Add imports. [...] > + (define (load-kernel-modules) > + "Examine /sys/devices to find out which modules to load and load the= m." > + (define enter? > + (const #t)) > + (define (down! directory stat result) > + ;; Note: modprobe mutates the tree starting with DIRECTORY. > + (let ((modalias-name (string-append directory "/modalias"))) > + (if (file-exists? modalias-name) > + (let ((modalias > + (string-trim-right (call-with-input-file modalias-name > + read-string) > + #\newline))) > + (system* "/sbin/modprobe" "-q" "--" modalias)))) If we change =E2=80=98flat-linux-module-directory=E2=80=99 to produce a =E2= =80=98modules.alias=E2=80=99 file, here we could read =E2=80=98modules.aliases=E2=80=99 directly and loa= d the right thing. With the patch below, we get =E2=80=98needed-modules=E2=80=99, and we could= simply do: (for-each (catch-ENOENT load-linux-module*) (needed-modules (known-module-aliases (string-append linux-module-directory "/modules.alias")))) and we can do away with kmod=E2=80=99s modprobe. Thoughts? Ludo=E2=80=99. --=-=-= Content-Type: text/x-patch Content-Disposition: inline diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4a6d4ff08..251095072 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -20,6 +20,7 @@ (define-module (gnu build linux-modules) #:use-module (guix elf) #:use-module (guix glob) + #:use-module (guix build utils) #:use-module (guix build syscalls) #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) @@ -40,7 +41,8 @@ device-module-aliases known-module-aliases - matching-modules)) + matching-modules + needed-modules)) ;;; Commentary: ;;; @@ -370,4 +372,25 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define (system-device-aliases) + "Browse /sys/devices in search of \"modalias\" files and return the list of +device aliases for the current system." + (let ((files (find-files "/sys/devices" + (lambda (file stat) + (and (eq? 'regular (stat:type stat)) + (string=? "modalias" (basename file))))))) + (filter-map (lambda (file) + (match (string-trim-right + (call-with-input-file file get-string-all)) + ("" #f) + (alias alias))) + files))) + +(define* (needed-modules #:optional (known-aliases (known-module-aliases))) + "Return the list of modules needed by devices on the current system. This +is achieved by browsing /sys/devices and returning the maching modules from +KNOWN-ALIASES." + (append-map (cut matching-modules <> known-aliases) + (system-device-aliases))) + ;;; linux-modules.scm ends here --=-=-=--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 22:08:01 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 17:08:01 2018 Received: from localhost ([127.0.0.1]:43244 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esFJx-0006tn-DJ for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:08:01 -0500 Received: from hera.aquilenet.fr ([185.233.100.1]:54960) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1esFJv-0006tY-Em for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:07:59 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id E8E4011D90; Sat, 3 Mar 2018 23:07:58 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZNbPZTCOq_gq; Sat, 3 Mar 2018 23:07:58 +0100 (CET) Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465]) by hera.aquilenet.fr (Postfix) with ESMTPSA id F3B58111A6; Sat, 3 Mar 2018 23:07:57 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules. References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-3-dannym@HIDDEN> Date: Sat, 03 Mar 2018 23:07:57 +0100 In-Reply-To: <20180303135533.6112-3-dannym@HIDDEN> (Danny Milosavljevic's message of "Sat, 3 Mar 2018 14:55:28 +0100") Message-ID: <87y3j84xtu.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: > * gnu/build/linux-modules.scm (install-modules): New procedure. > (%not-dash): New variable. We could reuse modules.alias and modules.devname from the =E2=80=98linux-li= bre=E2=80=99 package (right?), but I guess it doesn=E2=80=99t hurt to generate custom on= es. > +(define (install-module-files module-files output) > + "Install MODULE-FILES to OUTPUT. > +Precondition: OUTPUT is an empty directory." > + (let ((aliases > + (map (lambda (module-file-name) > + (format #t "copying '~a'...~%" module-file-name) > + (copy-file module-file-name > + (string-append output "/" > + (basename module-file-name))) > + `(,(file-name->module-name module-file-name) . > + ,(module-aliases module-file-name))) > + (sort module-files string<)))) > + (call-with-output-file (string-append output "/modules.alias") > + (lambda (port) > + (format port > + "# Aliases extracted from modules themselves.\n") > + (for-each (match-lambda ((module . aliases) > + (for-each (lambda (alias) > + (format port "alias ~a ~a\n= " alias > + module)) > + aliases))) > + aliases))) > + (call-with-output-file (string-append output "/modules.devname") > + (lambda (port) > + (format port > + "# Device nodes to trigger on-demand module loading.\n") > + (let* ((aliases (append-map (match-lambda > + ((module . aliases) aliases)) > + aliases)) > + (devname #f)) > + ;; Note: there's only one devname and then only one (char-majo= r|block-major). > + (for-each > + (match-lambda > + (((? (cut string-prefix? "devname:" <>) alias) . value) > + (set! devname (string-drop value (string-length "devname:")= ))) > + (((? (cut string-prefix? "char-major-" <>) alias) . value) > + (let ((parts (string-tokenize %not-dash))) > + (match parts > + ((a b major minor) > + (format port "~a ~a ~a:~a\n" devname "c" major mi= nor))))) > + (((? (cut string-prefix? "block-major-" <>) alias) . value) > + (let ((parts (string-tokenize %not-dash))) > + (match parts > + ((a b major minor) > + (format port "~a ~a ~a:~a\n" devname "b" major mi= nor))))) > + (_ #f)) > + aliases)))))) I think we need different procedures here: (write-module-alias-database modules port) ;for =E2=80=9Cmodules.alias= =E2=80=9D (write-module-device-database modules port) ;for =E2=80=9Cmodules.devname= =E2=80=9D with docstrings. I=E2=80=99m not sure we need =E2=80=98install-module-files=E2=80=99 itself.= Perhaps we can inline it at the call site? For the devname code, please avoid =E2=80=98set!=E2=80=99. Instead you can= thread the current devname as the state of a loop: (let loop ((devname #f) (aliases aliases)) (match aliases (() =E2=80=A6) (((? devname-alias? devname) . rest) (loop devname rest)) =E2=80=A6)) =20=20=20=20=20=20=20 The indentation of =E2=80=98match=E2=80=99 forms is wrong. Would it be OK = for you to pass it through ./etc/indent-code.el? (It=E2=80=99s non interactive, you d= on=E2=80=99t need to actually use Emacs.) Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 21:58:40 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 16:58:40 2018 Received: from localhost ([127.0.0.1]:43230 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esFAu-0006ep-4C for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 16:58:40 -0500 Received: from hera.aquilenet.fr ([185.233.100.1]:54924) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1esFAs-0006eh-IA for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 16:58:39 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id EA45611D90; Sat, 3 Mar 2018 22:58:37 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gcfN9Wz-4cDE; Sat, 3 Mar 2018 22:58:37 +0100 (CET) Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 113E8111A6; Sat, 3 Mar 2018 22:58:37 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v8 1/7] linux-modules: Add module-aliases. References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-2-dannym@HIDDEN> Date: Sat, 03 Mar 2018 22:58:36 +0100 In-Reply-To: <20180303135533.6112-2-dannym@HIDDEN> (Danny Milosavljevic's message of "Sat, 3 Mar 2018 14:55:27 +0100") Message-ID: <87371g6ctv.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Danny Milosavljevic <dannym@HIDDEN> skribis: > * gnu/build/linux-modules.scm (module-aliases): New variable. LGTM! > +(define (module-aliases file) > + "Return the list of aliases of module FILE." > + (let ((info (modinfo-section-contents file))) > + (filter-map (match-lambda > + (('alias . value) > + value) > + (_ #f)) (modinfo-section-contents file)))) Nitpick: align like this: (filter-map first second) when the first arg spans several lines.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 18:01:44 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 13:01:44 2018 Received: from localhost ([127.0.0.1]:42985 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1esBTc-0005ez-9z for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 13:01:44 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:33880) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1esBTZ-0005ep-Tx for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 13:01:42 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 4079833602C9 for <30604 <at> debbugs.gnu.org>; Sat, 3 Mar 2018 19:01:40 +0100 (CET) Date: Sat, 3 Mar 2018 19:01:31 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v8 7/7] linux-initrd: Factorize %modprobe and flat-linux-module-directory. Message-ID: <20180303190131.5a400f7d@HIDDEN> In-Reply-To: <20180303135533.6112-8-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-8-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/2RZK+1d+ZEai1B.L8BmqBOA"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/2RZK+1d+ZEai1B.L8BmqBOA Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > + (guix build utils) ; TODO: Remove Required for mkdir-p --Sig_/2RZK+1d+ZEai1B.L8BmqBOA Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqa4vsACgkQ5xo1VCww uqXOsgf/YAhsza+9v+prxTjzBWMjmdnk4mmMOMjJMoKQvMJlUDKzpVGXRBmmiAXc gkDel+oaMwi59dhe9jCmMb6cxDETIrFWk7HTHnjpAW5TwS6giIDu4ka83Qk65hI0 cQYgntsHOLfoOrONKnZ9Aw6TnG19lZAsyga1efmFllvyuU+tXuKAde2YZhrbx9ri vvKJTIVmeAd5tXRxhw44yniPigWS2MRJkEasgYOJPNbaBtoZ4JkfIaWkBIGxsDtF uVw+JxlMqp/SlbnPPEdYasDWSijIv9ypqAFjNoU/oZd9NqjO8ORSdctRutKy///R ANg1nn1m7F3x48yAenSc78etjezWfA== =ILLM -----END PGP SIGNATURE----- --Sig_/2RZK+1d+ZEai1B.L8BmqBOA--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 15:32:28 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 10:32:28 2018 Received: from localhost ([127.0.0.1]:42955 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es999-0000La-Vr for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 10:32:28 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:51092) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es998-0000LS-Eb for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 10:32:26 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id C19CD336173E for <30604 <at> debbugs.gnu.org>; Sat, 3 Mar 2018 16:32:24 +0100 (CET) Date: Sat, 3 Mar 2018 16:32:12 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v8 2/7] linux-modules: Add install-modules. Message-ID: <20180303163212.40f17905@HIDDEN> In-Reply-To: <20180303135533.6112-3-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> <20180303135533.6112-3-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/bCYi916gqBvqPpM=6.JlJQN"; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --Sig_/bCYi916gqBvqPpM=6.JlJQN Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable > + ;; Note: there's only one devname and then only one (char-majo= r|block-major). > + (for-each > + (match-lambda > + (((? (cut string-prefix? "devname:" <>) alias) . value) > + (set! devname (string-drop value (string-length "devname:")= ))) > + (((? (cut string-prefix? "char-major-" <>) alias) . value) > + (let ((parts (string-tokenize %not-dash))) > + (match parts > + ((a b major minor) > + (format port "~a ~a ~a:~a\n" devname "c" major mi= nor))))) > + (((? (cut string-prefix? "block-major-" <>) alias) . value) > + (let ((parts (string-tokenize %not-dash))) > + (match parts > + ((a b major minor) > + (format port "~a ~a ~a:~a\n" devname "b" major mi= nor))))) > + (_ #f)) > + aliases)))))) Probably better to be more careful that devname is set early enough. --Sig_/bCYi916gqBvqPpM=6.JlJQN Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqav/wACgkQ5xo1VCww uqV50wf/VBhDH1xsp4i365g/suHyV27f38/lFep7ohe11uMGlKxolmCCaGoo8/bC lhVuRnGme8dWV3DaKW8Ih+DE82FkZr+EulBxK9MmPxuw3FRCZDqw058PPkjM+pAM a09O8uj3qHTsWhNZzKA+Mf0o442+Pz4MwQE2JnX1eEuFltTzBrVAKjIsgbHgmRfh OAfPnmmBK3lNRTDB/qLvc6U1iuZOP+JduRr05kr7cjOFDZ2Rr0Q1dgB034GXwlj0 3dCw2izbdKc6xhGP5wjDt6Hradg+ReglrDgLzh0mXY0hq9aUIvXxj9ngA3Q05gu1 5n9B45TPg7OOKL7hsHumczfWFXLBLA== =EtMr -----END PGP SIGNATURE----- --Sig_/bCYi916gqBvqPpM=6.JlJQN--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:55 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:55 2018 Received: from localhost ([127.0.0.1]:41979 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7di-0006MV-Kv for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:55 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43814) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7dg-0006Lv-Gh for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:53 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 7EA443362284; Sat, 3 Mar 2018 14:55:51 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 7/7] linux-initrd: Factorize %modprobe and flat-linux-module-directory. Date: Sat, 3 Mar 2018 14:55:33 +0100 Message-Id: <20180303135533.6112-8-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (module-aliases->module-file-names): New procedure. * gnu/system/linux-initrd.scm (%modprobe): Use module-aliases->module-file-names. (flat-linux-module-directory): Use module-aliases->module-file-names. --- gnu/build/linux-modules.scm | 56 +++++++++++++++++++++- gnu/system/linux-initrd.scm | 110 ++++++++++++++++++-------------------------- 2 files changed, 100 insertions(+), 66 deletions(-) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index af217c974..44059ad93 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -21,6 +21,7 @@ #:use-module (guix elf) #:use-module (guix glob) #:use-module (guix build syscalls) + #:use-module (guix build utils) ; find-files #:use-module (rnrs io ports) #:use-module (rnrs bytevectors) #:use-module (srfi srfi-1) @@ -28,9 +29,12 @@ #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (ice-9 regex) + #:use-module (ice-9 ftw) #:export (dot-ko ensure-dot-ko module-aliases + module-aliases->module-file-names module-dependencies recursive-module-dependencies modules-loaded @@ -385,7 +389,7 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by (define (install-module-files module-files output) "Install MODULE-FILES to OUTPUT. -Precondition: OUTPUT is an empty directory." +Precondition: OUTPUT is an empty directory except for \"modules.builtin\"." (let ((aliases (map (lambda (module-file-name) (format #t "copying '~a'...~%" module-file-name) @@ -431,4 +435,54 @@ Precondition: OUTPUT is an empty directory." (_ #f)) aliases)))))) +(define (module-aliases->module-file-names linux aliases) + "Resolve ALIASES to module file names, including their dependencies (which will appear +first). Each alias will map to a list of module file names. +LINUX is the directory containing \"lib\"." + (define (string->regexp str) + ;; Return a regexp that matches STR exactly. + (string-append "^" (regexp-quote str) "$")) + + (define module-dir + (string-append linux "/lib/modules")) + + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + + (define linux-release-module-directory + (find-only-entry module-dir)) + + (define known-module-aliases* + (known-module-aliases + (string-append linux-release-module-directory + "/modules.alias"))) + (define (resolve-alias alias) + "If possible, resolve ALIAS to a list of module names. +Otherwise return just ALIAS as possible module names." + (match (delete-duplicates (matching-modules alias + known-module-aliases*)) + (() + (list alias)) + (items + items))) + + (define (lookup module) + (let ((name (ensure-dot-ko module))) + (match (find-files module-dir (string->regexp name)) + ((file) + file) + (() + (error "module not found" name module-dir)) + ((_ ...) + (error "several modules by that name" + name module-dir))))) + (append-map (lambda (alias) + (let ((modules (map lookup (resolve-alias alias)))) + (append (recursive-module-dependencies modules + #:lookup-module + lookup) modules))) + aliases)) + ;;; linux-modules.scm ends here diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 8050ac47e..dc826c63e 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -58,35 +58,14 @@ (define* (%modprobe linux-module-directory #:key (guile %guile-static-stripped)) + "Minimal implementation of modprobe for our initrd. +LINUX-MODULE-DIRECTORY is the directory that contains \"lib\"." (program-file "modprobe" (with-imported-modules (source-module-closure '((gnu build linux-modules))) #~(begin (use-modules (gnu build linux-modules) (ice-9 getopt-long) - (ice-9 match) (srfi srfi-1) (ice-9 ftw)) - (define (find-only-entry directory) - (match (scandir directory) - (("." ".." basename) - (string-append directory "/" basename)))) - (define (resolve-alias alias) - (let* ((linux-release-module-directory - (find-only-entry (string-append "/lib/modules")))) - (match (delete-duplicates (matching-modules alias - (known-module-aliases - (string-append linux-release-module-directory - "/modules.alias")))) - (() - (error "no alias by that name" alias)) - (items - items)))) - (define (lookup-module module) - (let* ((linux-release-module-directory - (find-only-entry (string-append "/lib/modules"))) - (file-name (string-append linux-release-module-directory - "/" (ensure-dot-ko module)))) - (if (file-exists? file-name) - file-name - (error "no module file found for module" module)))) + (ice-9 match) (srfi srfi-1)) (define option-spec '((quiet (single-char #\q) (value #f)))) (define options @@ -98,22 +77,31 @@ (for-each (match-lambda (('quiet . #t) #f) - ((() modules ...) - (for-each (lambda (alias) - (catch #t - (lambda () - (let ((modules (resolve-alias alias))) (for-each (lambda (module) - (load-linux-module* - (lookup-module module) - #:lookup-module - lookup-module)) - modules))) - (lambda (key . args) - (display (cons* key args) - (current-error-port)) - (newline (current-error-port)) - (set! exit-status 1)))) - modules))) + ((() aliases ...) + (catch #t + (lambda () + (let ((module-file-names + (module-aliases->module-file-names + #$linux-module-directory aliases))) + (for-each (lambda (name) + (catch 'system-error + (lambda () + (when (not (load-linux-module* name + #:recursive? + #f)) + (set! exit-status 1))) + (lambda (key . args) + (when (not (= EEXIST + (system-error-errno + (cons key args)))) + (print-exception (current-error-port) + #f key args) + (set! exit-status 1))))) + module-file-names))) + (lambda (key . args) + (print-exception (current-error-port) + #f key args) + (set! exit-status 1))))) options) (exit exit-status)))) #:guile guile)) @@ -173,17 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd." #:references-graphs `(("init-closure" ,init) ("modprobe-closure" ,modprobe)))) -(define (flat-linux-module-directory linux modules) - "Return a flat directory containing the Linux kernel modules listed in -MODULES and taken from LINUX." +(define (flat-linux-module-directory linux aliases) + "Return a flat directory containing the Linux kernel modules resolved by +ALIASES and taken from LINUX." (define build-exp (with-imported-modules (source-module-closure '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) + (use-modules (ice-9 match) (ice-9 ftw) (srfi srfi-1) - (guix build utils) + (guix build utils) ; TODO: Remove (gnu build linux-modules)) (define (string->regexp str) @@ -193,33 +181,25 @@ MODULES and taken from LINUX." (define module-dir (string-append #$linux "/lib/modules")) - (define (lookup module) - (let ((name (ensure-dot-ko module))) - (match (find-files module-dir (string->regexp name)) - ((file) - file) - (() - (error "module not found" name module-dir)) - ((_ ...) - (error "several modules by that name" - name module-dir))))) + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + + (define linux-release-module-directory + (find-only-entry module-dir)) (define modules - (let ((modules (map lookup '#$modules))) - (append modules - (recursive-module-dependencies modules - #:lookup-module lookup)))) + (module-aliases->module-file-names #$linux '#$aliases)) (define version - (match - (filter - (lambda (name) - (not (string-prefix? "." name))) - (scandir module-dir)) - ((item) item))) + (basename linux-release-module-directory)) (let ((output (string-append #$output "/lib/modules/" version))) (mkdir-p output) + (install-file + (string-append linux-release-module-directory "/modules.builtin") + output) (install-module-files (delete-duplicates modules) output)) #t))) (computed-file "linux-modules" build-exp))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:54 2018 Received: from localhost ([127.0.0.1]:41977 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7di-0006MO-5h for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:54 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43806) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7df-0006Lm-K8 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 79D25336188F; Sat, 3 Mar 2018 14:55:50 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 6/7] linux-initrd: Provide modprobe to the initrd. Date: Sat, 3 Mar 2018 14:55:32 +0100 Message-Id: <20180303135533.6112-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the linux modules to the initrd. * gnu/system/linux-initrd.scm (%modprobe): New procedure. (expression->initrd): Use it. Add linux-module-directory. (raw-initrd): Pass linux-module-directory. --- gnu/build/linux-initrd.scm | 13 +++++- gnu/system/linux-initrd.scm | 99 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 99 insertions(+), 13 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..d4cb5e2d8 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init modprobe linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,17 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when modprobe + (mkdir-p "sbin") + (symlink modprobe "sbin/modprobe") + (compile-to-cache "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index b50d3ff80..8050ac47e 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -56,11 +56,73 @@ ;;; ;;; Code: +(define* (%modprobe linux-module-directory #:key + (guile %guile-static-stripped)) + (program-file "modprobe" + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) (ice-9 getopt-long) + (ice-9 match) (srfi srfi-1) (ice-9 ftw)) + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + (define (resolve-alias alias) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules")))) + (match (delete-duplicates (matching-modules alias + (known-module-aliases + (string-append linux-release-module-directory + "/modules.alias")))) + (() + (error "no alias by that name" alias)) + (items + items)))) + (define (lookup-module module) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules"))) + (file-name (string-append linux-release-module-directory + "/" (ensure-dot-ko module)))) + (if (file-exists? file-name) + file-name + (error "no module file found for module" module)))) + (define option-spec + '((quiet (single-char #\q) (value #f)))) + (define options + (getopt-long (command-line) option-spec)) + (when (option-ref options 'quiet #f) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + (let ((exit-status 0)) + (for-each (match-lambda + (('quiet . #t) + #f) + ((() modules ...) + (for-each (lambda (alias) + (catch #t + (lambda () + (let ((modules (resolve-alias alias))) (for-each (lambda (module) + (load-linux-module* + (lookup-module module) + #:lookup-module + lookup-module)) + modules))) + (lambda (key . args) + (display (cons* key args) + (current-error-port)) + (newline (current-error-port)) + (set! exit-status 1)))) + modules))) + options) + (exit exit-status)))) + #:guile guile)) (define* (expression->initrd exp #:key (guile %guile-static-stripped) (gzip gzip) + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd." (define init (program-file "init" exp #:guile guile)) + (define modprobe + (%modprobe linux-module-directory #:guile guile)) + (define builder (with-imported-modules (source-module-closure '((gnu build linux-initrd))) @@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init - ;; Copy everything INIT refers to into the initrd. - #:references-graphs '("closure") + #:modprobe #$modprobe + #:linux-module-directory #$linux-module-directory + ;; Copy everything INIT and MODPROBE refer to into the + ;; initrd. + #:references-graphs '("init-closure" + "modprobe-closure") #:gzip (string-append #$gzip "/bin/gzip"))))) (gexp->derivation name builder - #:references-graphs `(("closure" ,init)))) + #:references-graphs `(("init-closure" ,init) + ("modprobe-closure" ,modprobe)))) (define (flat-linux-module-directory linux modules) "Return a flat directory containing the Linux kernel modules listed in @@ -111,7 +181,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -140,14 +210,18 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) - + (define version + (match + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)) + ((item) item))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (install-module-files (delete-duplicates modules) output)) + #t))) (computed-file "linux-modules" build-exp)) (define* (raw-initrd file-systems @@ -227,6 +301,7 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:54 2018 Received: from localhost ([127.0.0.1]:41975 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7dh-0006MM-VM for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:54 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43798) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7de-0006Lf-K4 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:50 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8B90D3362284; Sat, 3 Mar 2018 14:55:49 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 5/7] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Sat, 3 Mar 2018 14:55:31 +0100 Message-Id: <20180303135533.6112-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:53 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:53 2018 Received: from localhost ([127.0.0.1]:41972 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7dg-0006Ly-DD for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43788) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7dd-0006LY-L6 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:50 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 9EF85336287E; Sat, 3 Mar 2018 14:55:48 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 4/7] vm: Allow qemu-image builder to load Linux kernel modules. Date: Sat, 3 Mar 2018 14:55:30 +0100 Message-Id: <20180303135533.6112-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:52 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:52 2018 Received: from localhost ([127.0.0.1]:41970 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7df-0006Lq-Vk for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43780) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7dc-0006LI-Nr for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:49 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id B1D9F3362284; Sat, 3 Mar 2018 14:55:47 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present. Date: Sat, 3 Mar 2018 14:55:29 +0100 Message-Id: <20180303135533.6112-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. (lookup-module): Delete procedure. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 42 +++++++++++++++++++++++++++++++++++------- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..1b16f267a 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,9 +469,31 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! directory stat result) + ;; Note: modprobe mutates the tree starting with DIRECTORY. + (let ((modalias-name (string-append directory "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +508,16 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index e7f97bb88..b50d3ff80 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -208,7 +208,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:52 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:52 2018 Received: from localhost ([127.0.0.1]:41967 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7df-0006Ln-LI for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:51 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43772) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7db-0006L5-Mz for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id A8307336188F; Sat, 3 Mar 2018 14:55:46 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 2/7] linux-modules: Add install-modules. Date: Sat, 3 Mar 2018 14:55:28 +0100 Message-Id: <20180303135533.6112-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (install-modules): New procedure. (%not-dash): New variable. --- gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 364339df9..af217c974 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -36,6 +36,7 @@ modules-loaded module-loaded? load-linux-module* + install-module-files current-module-debugging-port @@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (install-module-files module-files output) + "Install MODULE-FILES to OUTPUT. +Precondition: OUTPUT is an empty directory." + (let ((aliases + (map (lambda (module-file-name) + (format #t "copying '~a'...~%" module-file-name) + (copy-file module-file-name + (string-append output "/" + (basename module-file-name))) + `(,(file-name->module-name module-file-name) . + ,(module-aliases module-file-name))) + (sort module-files string<)))) + (call-with-output-file (string-append output "/modules.alias") + (lambda (port) + (format port + "# Aliases extracted from modules themselves.\n") + (for-each (match-lambda ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias + module)) + aliases))) + aliases))) + (call-with-output-file (string-append output "/modules.devname") + (lambda (port) + (format port + "# Device nodes to trigger on-demand module loading.\n") + (let* ((aliases (append-map (match-lambda + ((module . aliases) aliases)) + aliases)) + (devname #f)) + ;; Note: there's only one devname and then only one (char-major|block-major). + (for-each + (match-lambda + (((? (cut string-prefix? "devname:" <>) alias) . value) + (set! devname (string-drop value (string-length "devname:")))) + (((? (cut string-prefix? "char-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "c" major minor))))) + (((? (cut string-prefix? "block-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "b" major minor))))) + (_ #f)) + aliases)))))) + ;;; linux-modules.scm ends here
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:48 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:48 2018 Received: from localhost ([127.0.0.1]:41962 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7dc-0006LD-Bj for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43764) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7da-0006Kt-Kb for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:46 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 819593362284; Sat, 3 Mar 2018 14:55:45 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 1/7] linux-modules: Add module-aliases. Date: Sat, 3 Mar 2018 14:55:27 +0100 Message-Id: <20180303135533.6112-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> <20180303135533.6112-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (module-aliases): New variable. --- gnu/build/linux-modules.scm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4a6d4ff08..364339df9 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -30,6 +30,7 @@ #:use-module (ice-9 rdelim) #:export (dot-ko ensure-dot-ko + module-aliases module-dependencies recursive-module-dependencies modules-loaded @@ -95,6 +96,14 @@ contains module names, not actual file names." (('depends . what) (string-tokenize what %not-comma))))) +(define (module-aliases file) + "Return the list of aliases of module FILE." + (let ((info (modinfo-section-contents file))) + (filter-map (match-lambda + (('alias . value) + value) + (_ #f)) (modinfo-section-contents file)))) + (define dot-ko (cut string-append <> ".ko"))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:48 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat Mar 03 08:55:48 2018 Received: from localhost ([127.0.0.1]:41960 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1es7dc-0006L6-12 for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43760) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1es7da-0006Kq-18 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:46 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id C58B4336188F; Sat, 3 Mar 2018 14:55:43 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v8 0/7] Load Linux module only when supported hardware is present. Date: Sat, 3 Mar 2018 14:55:26 +0100 Message-Id: <20180303135533.6112-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302153408.14091-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (7): linux-modules: Add module-aliases. linux-modules: Add install-modules. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk uniquely identifiable in /sys. linux-initrd: Provide modprobe to the initrd. linux-initrd: Factorize %modprobe and flat-linux-module-directory. gnu/build/linux-boot.scm | 42 ++++++++++++--- gnu/build/linux-initrd.scm | 13 ++++- gnu/build/linux-modules.scm | 115 +++++++++++++++++++++++++++++++++++++++++ gnu/build/vm.scm | 2 +- gnu/system/linux-initrd.scm | 121 ++++++++++++++++++++++++++++++++------------ gnu/system/vm.scm | 34 +++++++++++-- 6 files changed, 281 insertions(+), 46 deletions(-)
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 16:47:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 11:47:58 2018 Received: from localhost ([127.0.0.1]:41476 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ernqg-0005LY-Bp for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:58 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38338) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ernqe-0005LQ-G2 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:56 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 893513360099 for <30604 <at> debbugs.gnu.org>; Fri, 2 Mar 2018 17:47:55 +0100 (CET) Date: Fri, 2 Mar 2018 17:47:51 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v7 1/6] linux-modules: Add module-aliases. Message-ID: <20180302174751.741d5dd3@HIDDEN> In-Reply-To: <20180302153408.14091-2-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> <20180302153408.14091-2-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) > + "Return the list of aliases for FILE." ^^^ replace by "in"
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 16:47:21 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 11:47:21 2018 Received: from localhost ([127.0.0.1]:41473 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ernq5-0005Kk-38 for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:21 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:38282) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ernq3-0005Kc-CO for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:20 -0500 Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D5B2533602EB for <30604 <at> debbugs.gnu.org>; Fri, 2 Mar 2018 17:47:17 +0100 (CET) Date: Fri, 2 Mar 2018 17:47:11 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: Re: [PATCH v7 3/6] linux-boot: Load kernel modules only when the hardware is present. Message-ID: <20180302174711.4018dc49@HIDDEN> In-Reply-To: <20180302153408.14091-4-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> <20180302153408.14091-4-dannym@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) > + (define (load-kernel-modules) > + "Examine /sys/devices to find out which modules to load and load them." > + (define enter? > + (const #t)) > + (define (down! path stat result) > + ;; Note: modprobe mutates the tree starting with path. > + (let ((modalias-name (string-append path "/modalias"))) I should rename "path" to "directory".
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:26 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:26 2018 Received: from localhost ([127.0.0.1]:41422 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhW-0003cp-H4 for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:26 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32932) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhT-0003cL-UY for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:24 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id C8A0233601D1; Fri, 2 Mar 2018 16:34:22 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 6/6] linux-initrd: Provide modprobe to the initrd. Date: Fri, 2 Mar 2018 16:34:08 +0100 Message-Id: <20180302153408.14091-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the linux modules to the initrd. * gnu/system/linux-initrd.scm (%modprobe): New procedure. (expression->initrd): Use it. Add linux-module-directory. (raw-initrd): Pass linux-module-directory. --- gnu/build/linux-initrd.scm | 13 +++++- gnu/system/linux-initrd.scm | 99 +++++++++++++++++++++++++++++++++++++++------ 2 files changed, 99 insertions(+), 13 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..d4cb5e2d8 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init modprobe linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,17 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when modprobe + (mkdir-p "sbin") + (symlink modprobe "sbin/modprobe") + (compile-to-cache "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index b50d3ff80..8050ac47e 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -56,11 +56,73 @@ ;;; ;;; Code: +(define* (%modprobe linux-module-directory #:key + (guile %guile-static-stripped)) + (program-file "modprobe" + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) (ice-9 getopt-long) + (ice-9 match) (srfi srfi-1) (ice-9 ftw)) + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + (define (resolve-alias alias) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules")))) + (match (delete-duplicates (matching-modules alias + (known-module-aliases + (string-append linux-release-module-directory + "/modules.alias")))) + (() + (error "no alias by that name" alias)) + (items + items)))) + (define (lookup-module module) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules"))) + (file-name (string-append linux-release-module-directory + "/" (ensure-dot-ko module)))) + (if (file-exists? file-name) + file-name + (error "no module file found for module" module)))) + (define option-spec + '((quiet (single-char #\q) (value #f)))) + (define options + (getopt-long (command-line) option-spec)) + (when (option-ref options 'quiet #f) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + (let ((exit-status 0)) + (for-each (match-lambda + (('quiet . #t) + #f) + ((() modules ...) + (for-each (lambda (alias) + (catch #t + (lambda () + (let ((modules (resolve-alias alias))) (for-each (lambda (module) + (load-linux-module* + (lookup-module module) + #:lookup-module + lookup-module)) + modules))) + (lambda (key . args) + (display (cons* key args) + (current-error-port)) + (newline (current-error-port)) + (set! exit-status 1)))) + modules))) + options) + (exit exit-status)))) + #:guile guile)) (define* (expression->initrd exp #:key (guile %guile-static-stripped) (gzip gzip) + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd." (define init (program-file "init" exp #:guile guile)) + (define modprobe + (%modprobe linux-module-directory #:guile guile)) + (define builder (with-imported-modules (source-module-closure '((gnu build linux-initrd))) @@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init - ;; Copy everything INIT refers to into the initrd. - #:references-graphs '("closure") + #:modprobe #$modprobe + #:linux-module-directory #$linux-module-directory + ;; Copy everything INIT and MODPROBE refer to into the + ;; initrd. + #:references-graphs '("init-closure" + "modprobe-closure") #:gzip (string-append #$gzip "/bin/gzip"))))) (gexp->derivation name builder - #:references-graphs `(("closure" ,init)))) + #:references-graphs `(("init-closure" ,init) + ("modprobe-closure" ,modprobe)))) (define (flat-linux-module-directory linux modules) "Return a flat directory containing the Linux kernel modules listed in @@ -111,7 +181,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -140,14 +210,18 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) - + (define version + (match + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)) + ((item) item))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (install-module-files (delete-duplicates modules) output)) + #t))) (computed-file "linux-modules" build-exp)) (define* (raw-initrd file-systems @@ -227,6 +301,7 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:25 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:25 2018 Received: from localhost ([127.0.0.1]:41420 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhV-0003ch-AW for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:25 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32924) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhS-0003cE-RQ for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:23 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D764F33602EB; Fri, 2 Mar 2018 16:34:21 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 5/6] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Fri, 2 Mar 2018 16:34:07 +0100 Message-Id: <20180302153408.14091-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:24 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:24 2018 Received: from localhost ([127.0.0.1]:41417 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhU-0003cO-1Q for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:24 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32916) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhR-0003c1-SW for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:22 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E139933601D1; Fri, 2 Mar 2018 16:34:20 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 4/6] vm: Allow qemu-image builder to load Linux kernel modules. Date: Fri, 2 Mar 2018 16:34:06 +0100 Message-Id: <20180302153408.14091-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:24 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:24 2018 Received: from localhost ([127.0.0.1]:41415 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhT-0003cM-Pq for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:23 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32906) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhQ-0003br-SR for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:21 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E11E133602EB; Fri, 2 Mar 2018 16:34:19 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 3/6] linux-boot: Load kernel modules only when the hardware is present. Date: Fri, 2 Mar 2018 16:34:05 +0100 Message-Id: <20180302153408.14091-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. (lookup-module): Delete procedure. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 42 +++++++++++++++++++++++++++++++++++------- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..1b16f267a 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,9 +469,31 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +508,16 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index e7f97bb88..b50d3ff80 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -208,7 +208,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:21 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:21 2018 Received: from localhost ([127.0.0.1]:41411 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhR-0003c0-GJ for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:21 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32898) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhP-0003bd-Qp for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:20 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 5AE1333601D1; Fri, 2 Mar 2018 16:34:18 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 2/6] linux-modules: Add install-modules. Date: Fri, 2 Mar 2018 16:34:04 +0100 Message-Id: <20180302153408.14091-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (install-modules): New procedure. (%not-dash): New variable. --- gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 364339df9..af217c974 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -36,6 +36,7 @@ modules-loaded module-loaded? load-linux-module* + install-module-files current-module-debugging-port @@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (install-module-files module-files output) + "Install MODULE-FILES to OUTPUT. +Precondition: OUTPUT is an empty directory." + (let ((aliases + (map (lambda (module-file-name) + (format #t "copying '~a'...~%" module-file-name) + (copy-file module-file-name + (string-append output "/" + (basename module-file-name))) + `(,(file-name->module-name module-file-name) . + ,(module-aliases module-file-name))) + (sort module-files string<)))) + (call-with-output-file (string-append output "/modules.alias") + (lambda (port) + (format port + "# Aliases extracted from modules themselves.\n") + (for-each (match-lambda ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias + module)) + aliases))) + aliases))) + (call-with-output-file (string-append output "/modules.devname") + (lambda (port) + (format port + "# Device nodes to trigger on-demand module loading.\n") + (let* ((aliases (append-map (match-lambda + ((module . aliases) aliases)) + aliases)) + (devname #f)) + ;; Note: there's only one devname and then only one (char-major|block-major). + (for-each + (match-lambda + (((? (cut string-prefix? "devname:" <>) alias) . value) + (set! devname (string-drop value (string-length "devname:")))) + (((? (cut string-prefix? "char-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "c" major minor))))) + (((? (cut string-prefix? "block-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "b" major minor))))) + (_ #f)) + aliases)))))) + ;;; linux-modules.scm ends here
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:20 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:20 2018 Received: from localhost ([127.0.0.1]:41408 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhQ-0003bk-9y for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:20 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32890) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhO-0003bJ-72 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:18 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 362D733602EB; Fri, 2 Mar 2018 16:34:17 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 1/6] linux-modules: Add module-aliases. Date: Fri, 2 Mar 2018 16:34:03 +0100 Message-Id: <20180302153408.14091-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302153408.14091-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (module-aliases): New variable. --- gnu/build/linux-modules.scm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4a6d4ff08..364339df9 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -30,6 +30,7 @@ #:use-module (ice-9 rdelim) #:export (dot-ko ensure-dot-ko + module-aliases module-dependencies recursive-module-dependencies modules-loaded @@ -95,6 +96,14 @@ contains module names, not actual file names." (('depends . what) (string-tokenize what %not-comma))))) +(define (module-aliases file) + "Return the list of aliases for FILE." + (let ((info (modinfo-section-contents file))) + (filter-map (match-lambda + (('alias . value) + value) + (_ #f)) (modinfo-section-contents file)))) + (define dot-ko (cut string-append <> ".ko"))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:19 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 10:34:19 2018 Received: from localhost ([127.0.0.1]:41405 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1ermhP-0003bW-2u for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:19 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:32886) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1ermhN-0003bI-Hf for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:18 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 9E65733601D1; Fri, 2 Mar 2018 16:34:15 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v7 0/6] Load Linux module only when supported hardware is present. Date: Fri, 2 Mar 2018 16:34:02 +0100 Message-Id: <20180302153408.14091-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141606.10669-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (6): linux-modules: Add module-aliases. linux-modules: Add install-modules. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk uniquely identifiable in /sys. linux-initrd: Provide modprobe to the initrd. gnu/build/linux-boot.scm | 42 +++++++++++++++--- gnu/build/linux-initrd.scm | 13 +++++- gnu/build/linux-modules.scm | 61 ++++++++++++++++++++++++++ gnu/build/vm.scm | 2 +- gnu/system/linux-initrd.scm | 103 ++++++++++++++++++++++++++++++++++++++------ gnu/system/vm.scm | 34 ++++++++++++--- 6 files changed, 228 insertions(+), 27 deletions(-)
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:40 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:40 2018 Received: from localhost ([127.0.0.1]:40338 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlVC-0001Yr-C2 for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:40 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55104) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlVA-0001Yc-Jc for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:37 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 6E7BB33601D1; Fri, 2 Mar 2018 15:17:35 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 6/6] linux-initrd: Provide modprobe to the initrd. Date: Fri, 2 Mar 2018 15:17:20 +0100 Message-Id: <20180302141720.10720-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302141720.10720-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the linux modules to the initrd. * gnu/system/linux-initrd.scm (%modprobe): New procedure. (expression->initrd): Use it. Add linux-module-directory. (raw-initrd): Pass linux-module-directory. --- gnu/build/linux-initrd.scm | 13 ++++++- gnu/system/linux-initrd.scm | 84 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 87 insertions(+), 10 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..d4cb5e2d8 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init modprobe linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,17 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when modprobe + (mkdir-p "sbin") + (symlink modprobe "sbin/modprobe") + (compile-to-cache "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index b50d3ff80..a69497ff8 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -56,11 +56,73 @@ ;;; ;;; Code: +(define* (%modprobe linux-module-directory #:key + (guile %guile-static-stripped)) + (program-file "modprobe" + (with-imported-modules (source-module-closure + '((gnu build linux-modules))) + #~(begin + (use-modules (gnu build linux-modules) (ice-9 getopt-long) + (ice-9 match) (srfi srfi-1) (ice-9 ftw)) + (define (find-only-entry directory) + (match (scandir directory) + (("." ".." basename) + (string-append directory "/" basename)))) + (define (resolve-alias alias) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules")))) + (match (delete-duplicates (matching-modules alias + (known-module-aliases + (string-append linux-release-module-directory + "/modules.alias")))) + (() + (error "no alias by that name" alias)) + (items + items)))) + (define (lookup-module module) + (let* ((linux-release-module-directory + (find-only-entry (string-append "/lib/modules"))) + (file-name (string-append linux-release-module-directory + "/" (ensure-dot-ko module)))) + (if (file-exists? file-name) + file-name + (error "no module file found for module" module)))) + (define option-spec + '((quiet (single-char #\q) (value #f)))) + (define options + (getopt-long (command-line) option-spec)) + (when (option-ref options 'quiet #f) + (current-error-port (%make-void-port "w")) + (current-output-port (%make-void-port "w"))) + (let ((exit-status 0)) + (for-each (match-lambda + (('quiet . #t) + #f) + ((() modules ...) + (for-each (lambda (alias) + (catch #t + (lambda () + (let ((modules (resolve-alias alias))) (for-each (lambda (module) + (load-linux-module* + (lookup-module module) + #:lookup-module + lookup-module)) + modules))) + (lambda (key . args) + (display (cons* key args) + (current-error-port)) + (newline (current-error-port)) + (set! exit-status 1)))) + modules))) + options) + (exit exit-status)))) + #:guile guile)) (define* (expression->initrd exp #:key (guile %guile-static-stripped) (gzip gzip) + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd." (define init (program-file "init" exp #:guile guile)) + (define modprobe + (%modprobe linux-module-directory #:guile guile)) + (define builder (with-imported-modules (source-module-closure '((gnu build linux-initrd))) @@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init - ;; Copy everything INIT refers to into the initrd. - #:references-graphs '("closure") + #:modprobe #$modprobe + #:linux-module-directory #$linux-module-directory + ;; Copy everything INIT and MODPROBE refer to into the + ;; initrd. + #:references-graphs '("init-closure" + "modprobe-closure") #:gzip (string-append #$gzip "/bin/gzip"))))) (gexp->derivation name builder - #:references-graphs `(("closure" ,init)))) + #:references-graphs `(("init-closure" ,init) + ("modprobe-closure" ,modprobe)))) (define (flat-linux-module-directory linux modules) "Return a flat directory containing the Linux kernel modules listed in @@ -141,12 +211,7 @@ MODULES and taken from LINUX." #:lookup-module lookup)))) (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (install-module-files (delete-duplicates modules) #$output)))) (computed-file "linux-modules" build-exp)) @@ -227,6 +292,7 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:37 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:37 2018 Received: from localhost ([127.0.0.1]:40335 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlVA-0001Yd-OI for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:36 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55096) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlV9-0001YN-4g for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:35 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 7CE5533602EB; Fri, 2 Mar 2018 15:17:33 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 5/6] vm: Make the virtio-blk uniquely identifiable in /sys. Date: Fri, 2 Mar 2018 15:17:19 +0100 Message-Id: <20180302141720.10720-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302141720.10720-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:35 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:35 2018 Received: from localhost ([127.0.0.1]:40333 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlV9-0001YP-C8 for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:35 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55092) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlV7-0001Y9-7T for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:33 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id CFE7F33601D1; Fri, 2 Mar 2018 15:17:31 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 4/6] vm: Allow qemu-image builder to load Linux kernel modules. Date: Fri, 2 Mar 2018 15:17:18 +0100 Message-Id: <20180302141720.10720-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302141720.10720-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:33 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:33 2018 Received: from localhost ([127.0.0.1]:40329 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlV7-0001YA-3k for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:33 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55084) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlV5-0001Xv-E6 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:31 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id E351233602EB; Fri, 2 Mar 2018 15:17:29 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 3/6] linux-boot: Load kernel modules only when the hardware is present. Date: Fri, 2 Mar 2018 15:17:17 +0100 Message-Id: <20180302141720.10720-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302141720.10720-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. (lookup-module): Delete procedure. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 42 +++++++++++++++++++++++++++++++++++------- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..1b16f267a 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,9 +469,31 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +508,16 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index e7f97bb88..b50d3ff80 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -208,7 +208,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:31 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:31 2018 Received: from localhost ([127.0.0.1]:40326 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlV4-0001Xu-Rg for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:31 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55068) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlV3-0001Xe-Jl for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:29 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 2743F33601D1; Fri, 2 Mar 2018 15:17:27 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 2/6] linux-modules: Add install-modules. Date: Fri, 2 Mar 2018 15:17:16 +0100 Message-Id: <20180302141720.10720-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> <20180302141720.10720-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (install-modules): New procedure. (%not-dash): New variable. --- gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 364339df9..af217c974 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -36,6 +36,7 @@ modules-loaded module-loaded? load-linux-module* + install-module-files current-module-debugging-port @@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) +(define %not-dash + (char-set-complement (char-set #\-))) + +(define (install-module-files module-files output) + "Install MODULE-FILES to OUTPUT. +Precondition: OUTPUT is an empty directory." + (let ((aliases + (map (lambda (module-file-name) + (format #t "copying '~a'...~%" module-file-name) + (copy-file module-file-name + (string-append output "/" + (basename module-file-name))) + `(,(file-name->module-name module-file-name) . + ,(module-aliases module-file-name))) + (sort module-files string<)))) + (call-with-output-file (string-append output "/modules.alias") + (lambda (port) + (format port + "# Aliases extracted from modules themselves.\n") + (for-each (match-lambda ((module . aliases) + (for-each (lambda (alias) + (format port "alias ~a ~a\n" alias + module)) + aliases))) + aliases))) + (call-with-output-file (string-append output "/modules.devname") + (lambda (port) + (format port + "# Device nodes to trigger on-demand module loading.\n") + (let* ((aliases (append-map (match-lambda + ((module . aliases) aliases)) + aliases)) + (devname #f)) + ;; Note: there's only one devname and then only one (char-major|block-major). + (for-each + (match-lambda + (((? (cut string-prefix? "devname:" <>) alias) . value) + (set! devname (string-drop value (string-length "devname:")))) + (((? (cut string-prefix? "char-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "c" major minor))))) + (((? (cut string-prefix? "block-major-" <>) alias) . value) + (let ((parts (string-tokenize %not-dash))) + (match parts + ((a b major minor) + (format port "~a ~a ~a:~a\n" devname "b" major minor))))) + (_ #f)) + aliases)))))) + ;;; linux-modules.scm ends here
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:30 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:17:29 2018 Received: from localhost ([127.0.0.1]:40323 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlV3-0001Xh-JG for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:29 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:55060) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlV1-0001XX-Mp for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:27 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 13F6733601D1; Fri, 2 Mar 2018 15:17:25 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 1/6] linux-modules: Add module-aliases. Date: Fri, 2 Mar 2018 15:17:15 +0100 Message-Id: <20180302141720.10720-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180302141606.10669-1-dannym@HIDDEN> References: <20180302141606.10669-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-modules.scm (module-aliases): New variable. --- gnu/build/linux-modules.scm | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 4a6d4ff08..364339df9 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -30,6 +30,7 @@ #:use-module (ice-9 rdelim) #:export (dot-ko ensure-dot-ko + module-aliases module-dependencies recursive-module-dependencies modules-loaded @@ -95,6 +96,14 @@ contains module names, not actual file names." (('depends . what) (string-tokenize what %not-comma))))) +(define (module-aliases file) + "Return the list of aliases for FILE." + (let ((info (modinfo-section-contents file))) + (filter-map (match-lambda + (('alias . value) + value) + (_ #f)) (modinfo-section-contents file)))) + (define dot-ko (cut string-append <> ".ko"))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:16:15 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri Mar 02 09:16:15 2018 Received: from localhost ([127.0.0.1]:40319 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1erlTr-0001Vk-9b for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:16:15 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:54846) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1erlTq-0001Vc-0o for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:16:14 -0500 Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com [77.118.252.91]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 0FC8E33601D1; Fri, 2 Mar 2018 15:16:10 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v6 0/6] Load Linux module only when supported hardware is present. Date: Fri, 2 Mar 2018 15:16:06 +0100 Message-Id: <20180302141606.10669-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227155051.1141-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (6): linux-modules: Add module-aliases. linux-modules: Add install-modules. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk uniquely identifiable in /sys. linux-initrd: Provide modprobe to the initrd. gnu/build/linux-boot.scm | 42 ++++++++++++++++++---- gnu/build/linux-initrd.scm | 13 ++++++- gnu/build/linux-modules.scm | 61 +++++++++++++++++++++++++++++++ gnu/build/vm.scm | 2 +- gnu/system/linux-initrd.scm | 88 +++++++++++++++++++++++++++++++++++++++------ gnu/system/vm.scm | 34 +++++++++++++++--- 6 files changed, 216 insertions(+), 24 deletions(-)
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:51:07 2018 Received: from localhost ([127.0.0.1]:34631 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgax-00049Z-4B for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:07 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36062) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgat-00048n-Bl for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:03 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id BC7A533601CF; Tue, 27 Feb 2018 15:51:01 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 7/7] linux-boot: Call make-static-device-nodes much earlier. Date: Tue, 27 Feb 2018 16:50:51 +0100 Message-Id: <20180227155051.1141-8-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (expression->initrd): Store data files for make-static-device-nodes. * gnu/build/linux-boot.scm (boot-system): Call make-static-device-nodes. Delete lookup-module. --- gnu/build/linux-boot.scm | 13 +++++++++---- gnu/system/linux-initrd.scm | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 6d00ea9be..1b16f267a 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -469,10 +469,6 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) - (define (load-kernel-modules) "Examine /sys/devices to find out which modules to load and load them." (define enter? @@ -512,6 +508,15 @@ upon error." (when (member "--repl" args) (start-repl)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + (load-kernel-modules) (when qemu-guest-networking?
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:51:07 2018 Received: from localhost ([127.0.0.1]:34629 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgaw-00049R-Sq for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:07 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36048) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgaq-00048E-UK for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:01 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 951C03360129; Tue, 27 Feb 2018 15:50:59 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 6/7] vm: Make the virtio-blk is uniquely identifyable in /sys. Date: Tue, 27 Feb 2018 16:50:50 +0100 Message-Id: <20180227155051.1141-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:51:06 2018 Received: from localhost ([127.0.0.1]:34627 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgaw-00049P-KF for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:06 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36040) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgao-00047e-Oj for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id B4E8E3360129; Tue, 27 Feb 2018 15:50:57 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 5/7] vm: Allow qemu-image builder to load Linux kernel modules. Date: Tue, 27 Feb 2018 16:50:49 +0100 Message-Id: <20180227155051.1141-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:50:59 2018 Received: from localhost ([127.0.0.1]:34618 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgap-000481-AZ for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36030) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgan-00047X-JD for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:57 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 86D683361202; Tue, 27 Feb 2018 15:50:56 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 4/7] linux-boot: Load kernel modules only when the hardware is present. Date: Tue, 27 Feb 2018 16:50:48 +0100 Message-Id: <20180227155051.1141-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 31 +++++++++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..6d00ea9be 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,32 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +512,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 46ef055f0..c8a9e4950 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -225,7 +225,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:50:59 2018 Received: from localhost ([127.0.0.1]:34615 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgao-00047o-VY for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36020) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgam-00047P-F0 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:56 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id ED3CC33601CF; Tue, 27 Feb 2018 15:50:54 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 3/7] linux-initrd: Add kmod. Date: Tue, 27 Feb 2018 16:50:47 +0100 Message-Id: <20180227155051.1141-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (raw-initrd): Add kmod. (base-initrd): Add kmod. (expression->initrd): Add kmod, linux-module-directory. (flat-linux-module-directory): Add kmod; invoke depmod. * gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory. --- gnu/build/linux-initrd.scm | 12 +++++++++++- gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..6356007df 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init kmod linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,16 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when kmod + (mkdir-p "sbin") + (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7170d1c0e..46ef055f0 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -59,6 +59,8 @@ #:key (guile %guile-static-stripped) (gzip gzip) + kmod + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:kmod #$kmod + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd." (gexp->derivation name builder #:references-graphs `(("closure" ,init)))) -(define (flat-linux-module-directory linux modules) +(define (flat-linux-module-directory linux modules kmod) "Return a flat directory containing the Linux kernel modules listed in MODULES and taken from LINUX." (define build-exp @@ -109,7 +113,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -138,13 +142,27 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define version + (match + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)) + ((item) item))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (for-each (lambda (module) + (format #t "copying '~a'...~%" module) + (copy-file module + (string-append output "/" + (basename module)))) + (delete-duplicates modules))) + (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output + "-e" + "-F" (string-append #$linux "/System.map") + version) + #t))) (computed-file "linux-modules" build-exp)) @@ -152,6 +170,7 @@ MODULES and taken from LINUX." #:key (linux linux-libre) (linux-modules '()) + (kmod kmod-minimal/static) (mapped-devices '()) (helper-packages '()) qemu-networking? @@ -185,7 +204,7 @@ upon error." mapped-devices)) (define kodir - (flat-linux-module-directory linux linux-modules)) + (flat-linux-module-directory linux linux-modules kmod)) (expression->initrd (with-imported-modules (source-module-closure @@ -223,6 +242,8 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:kmod kmod + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) @@ -245,6 +266,7 @@ FILE-SYSTEMS." (define* (base-initrd file-systems #:key (linux linux-libre) + (kmod kmod-minimal/static) (mapped-devices '()) qemu-networking? volatile-root? @@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear." (raw-initrd file-systems #:linux linux #:linux-modules linux-modules + #:kmod kmod #:mapped-devices mapped-devices - #:helper-packages helper-packages + #:helper-packages (cons kmod helper-packages) #:qemu-networking? qemu-networking? #:volatile-root? volatile-root? #:on-error on-error))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:50:59 2018 Received: from localhost ([127.0.0.1]:34613 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgao-00047h-Mm for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:58 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:36008) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgak-000476-Oq for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:55 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D24623361202; Tue, 27 Feb 2018 15:50:52 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 2/7] gnu: Add kmod-minimal-static. Date: Tue, 27 Feb 2018 16:50:46 +0100 Message-Id: <20180227155051.1141-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal/static): New variable. * gnu/packages/patches/kmod-13-module-directory.patch: New file. * gnu/local.mk: Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 44 ++++++++++++++++++++++ .../patches/kmod-13-module-directory.patch | 33 ++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch diff --git a/gnu/local.mk b/gnu/local.mk index 21195f8c1..b1e3c878d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -795,6 +795,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-makefile.patch \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch \ + %D%/packages/patches/kmod-13-module-directory.patch \ %D%/packages/patches/kmod-module-directory.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 1f8bf3050..b2e47f79a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1994,6 +1994,50 @@ from the module-init-tools project.") #t)) %standard-phases))))) +(define-public kmod-minimal/static + (static-package + (package (inherit kmod-minimal) + (name "kmod-minimal-static") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (arguments + (substitute-keyword-arguments + (package-arguments (static-package kmod-minimal)) + ((#:configure-flags flags ''()) + `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags)) + ((#:make-flags flags ''()) + `(cons* "LDFLAGS=-all-static" ,flags)) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'install-license-files) + (add-after 'unpack 'patch-kmod + (lambda _ + ;; Reduce size by 200 kiB. + (substitute* "tools/kmod.c" + (("[&]kmod_cmd_compat_lsmod,") "") + (("[&]kmod_cmd_compat_rmmod,") "") + (("[&]kmod_cmd_compat_insmod,") "") + (("[&]kmod_cmd_compat_modinfo,") "")) + #t)) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "tools/kmod" bin) + (for-each + (lambda (tool) + (symlink "kmod" (string-append bin "/" tool))) + '("modprobe" "depmod")) + #t)))))))))) + (define-public eudev ;; The post-systemd fork, maintained by Gentoo. (package diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch new file mode 100644 index 000000000..5ff2f8a60 --- /dev/null +++ b/gnu/packages/patches/kmod-13-module-directory.patch @@ -0,0 +1,33 @@ +This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY' +environment variable, rather than looking for modules exclusively in +/lib/modules. + +Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to +use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable +name. + + +--- kmod-7/libkmod/libkmod.c 2012-03-15 08:19:16.750010226 -0400 ++++ kmod-7/libkmod/libkmod.c 2012-04-04 15:21:29.532074313 -0400 +@@ -200,7 +200,7 @@ + static char *get_kernel_release(const char *dirname) + { + struct utsname u; +- char *p; ++ char *p, *dirname_prefix; + + if (dirname != NULL) + return path_make_absolute_cwd(dirname); +@@ -208,7 +208,10 @@ + if (uname(&u) < 0) + return NULL; + +- if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) ++ if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL) ++ dirname_prefix = dirname_default_prefix; ++ ++ if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0) + return NULL; + + return p; +
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:50:58 2018 Received: from localhost ([127.0.0.1]:34611 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgao-00047f-G7 for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:58 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:35994) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgah-00046r-8w for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:55 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 5F1073360129; Tue, 27 Feb 2018 15:50:49 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 0/7] Load Linux module only when supported hardware is present. Date: Tue, 27 Feb 2018 16:50:44 +0100 Message-Id: <20180227155051.1141-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (7): gnu: kmod: Split off kmod-minimal. gnu: Add kmod-minimal-static. linux-initrd: Add kmod. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk is uniquely identifyable in /sys. linux-boot: Call make-static-device-nodes much earlier. gnu/build/linux-boot.scm | 42 ++++++++-- gnu/build/linux-initrd.scm | 12 ++- gnu/build/vm.scm | 2 +- gnu/local.mk | 1 + gnu/packages/linux.scm | 91 ++++++++++++++++++---- .../patches/kmod-13-module-directory.patch | 33 ++++++++ gnu/system/linux-initrd.scm | 50 +++++++++--- gnu/system/vm.scm | 34 ++++++-- 8 files changed, 224 insertions(+), 41 deletions(-) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:54 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:50:54 2018 Received: from localhost ([127.0.0.1]:34606 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgak-000475-7U for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:54 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:35998) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqgai-00046u-Ii for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:53 -0500 Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com [77.118.157.234]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 4278533601CF; Tue, 27 Feb 2018 15:50:51 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v5 1/7] gnu: kmod: Split off kmod-minimal. Date: Tue, 27 Feb 2018 16:50:45 +0100 Message-Id: <20180227155051.1141-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN> References: <20180227112619.5071-1-dannym@HIDDEN> <20180227155051.1141-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal): New variable. (kmod): Modify. --- gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 238398e84..1f8bf3050 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes commands such as to use Linux' inotify mechanism, which allows file accesses to be monitored.") (license license:gpl2+))) -(define-public kmod +(define kmod-minimal (package + (name "kmod-minimal") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f)) ; FIXME: Investigate test failures + (home-page "https://www.kernel.org/") + (synopsis "Kernel module tools") + (description "Kmod is a set of tools to handle common tasks with Linux +kernel modules like insert, remove, list, check properties, resolve +dependencies and aliases. + +These tools are designed on top of libkmod, a library that is shipped with +kmod. The aim is to be compatible with tools, configurations and indices +from the module-init-tools project.") + (license license:gpl2+))) ; library under lgpl2.1+ + +(define-public kmod + (package (inherit kmod-minimal) (name "kmod") (version "24") (source (origin @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (base32 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) (patches (search-patches "kmod-module-directory.patch")))) - (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xz" ,xz) ("zlib" ,zlib))) (arguments - `(#:tests? #f ; FIXME: Investigate test failures - #:configure-flags '("--with-xz" "--with-zlib") + `(#:configure-flags '("--with-xz" "--with-zlib") + #:tests? #f ; FIXME: Investigate test failures #:phases (alist-cons-after 'install 'install-modprobe&co (lambda* (#:key outputs #:allow-other-keys) @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (symlink "kmod" (string-append bin "/" tool))) '("insmod" "rmmod" "lsmod" "modprobe" - "modinfo" "depmod")))) - %standard-phases))) - (home-page "https://www.kernel.org/") - (synopsis "Kernel module tools") - (description "Kmod is a set of tools to handle common tasks with Linux -kernel modules like insert, remove, list, check properties, resolve -dependencies and aliases. - -These tools are designed on top of libkmod, a library that is shipped with -kmod. The aim is to be compatible with tools, configurations and indices -from the module-init-tools project.") - (license license:gpl2+))) ; library under lgpl2.1+ + "modinfo" "depmod")) + #t)) + %standard-phases))))) (define-public eudev ;; The post-systemd fork, maintained by Gentoo.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:26:10 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 09:26:10 2018 Received: from localhost ([127.0.0.1]:34594 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqgCn-0003T9-Vw for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:26:10 -0500 Received: from hera.aquilenet.fr ([185.233.100.1]:52424) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1eqgCm-0003Sz-Bb for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:26:08 -0500 Received: from localhost (localhost [127.0.0.1]) by hera.aquilenet.fr (Postfix) with ESMTP id D2C2D11FDE; Tue, 27 Feb 2018 15:26:07 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at aquilenet.fr Received: from hera.aquilenet.fr ([127.0.0.1]) by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id c7om1nzrY475; Tue, 27 Feb 2018 15:26:06 +0100 (CET) Received: from ribbon (unknown [193.50.110.216]) by hera.aquilenet.fr (Postfix) with ESMTPSA id 6E96B11CC3; Tue, 27 Feb 2018 15:26:06 +0100 (CET) From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=) To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH v3 4/6] linux-boot: Load kernel modules only when the hardware is present. References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> <20180226040609.3066-5-dannym@HIDDEN> Date: Tue, 27 Feb 2018 15:26:06 +0100 In-Reply-To: <20180226040609.3066-5-dannym@HIDDEN> (Danny Milosavljevic's message of "Mon, 26 Feb 2018 05:06:07 +0100") Message-ID: <87muzu33wh.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 1.0 (+) Hello, Nice patch series! Danny Milosavljevic <dannym@HIDDEN> skribis: > * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when > the hardware is present. > * gnu/system/linux-initrd.scm (raw-initrd): Add imports. [...] > + (define (load-kernel-modules) > + "Examine /sys/devices to find out which modules to load and load the= m." > + (define enter? > + (const #t)) > + (define (down! path stat result) > + ;; Note: modprobe mutates the tree starting with path. > + (let ((modalias-name (string-append path "/modalias"))) > + (if (file-exists? modalias-name) > + (let ((modalias > + (string-trim-right (call-with-input-file modalias-name > + read-string) > + #\newline))) > + (system* "/sbin/modprobe" "-q" "--" modalias)))) Can we build upon (gnu build linux-modules) to achieve this? Hopefully the tools at <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D30629#14> can help a bit. Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:32 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:32 2018 Received: from localhost ([127.0.0.1]:34383 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSt-0003tz-SH for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:32 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42494) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSs-0003tR-6v for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:30 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 3B36533615C9; Tue, 27 Feb 2018 11:26:29 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 7/7] linux-boot: Call make-static-device-nodes much earlier. Date: Tue, 27 Feb 2018 12:26:19 +0100 Message-Id: <20180227112619.5071-8-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (expression->initrd): Store data files for make-static-device-nodes. * gnu/build/linux-boot.scm (make-static-device-nodes): Unexport. (boot-system): Call make-static-device-nodes. Delete lookup-module. * gnu/services/base.scm (udev-shepherd-service): Delete make-static-device-nodes call. --- gnu/build/linux-boot.scm | 14 +++++++++----- gnu/services/base.scm | 11 ----------- gnu/system/linux-initrd.scm | 3 ++- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 6d00ea9be..f0ac755f8 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -39,7 +39,6 @@ find-long-option find-long-options make-essential-device-nodes - make-static-device-nodes configure-qemu-networking device-number @@ -469,10 +468,6 @@ upon error." mounts) "ext4")) - (define (lookup-module name) - (string-append linux-module-directory "/" - (ensure-dot-ko name))) - (define (load-kernel-modules) "Examine /sys/devices to find out which modules to load and load them." (define enter? @@ -512,6 +507,15 @@ upon error." (when (member "--repl" args) (start-repl)) + (let* ((kernel-release + (utsname:release (uname))) + (directory + (string-append linux-module-directory "/lib/modules/" + kernel-release)) + (old-umask (umask #o022))) + (make-static-device-nodes directory) + (umask old-umask)) + (load-kernel-modules) (when qemu-guest-networking? diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 69e211ffa..0cba1c66f 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -1857,17 +1857,6 @@ item of @var{packages}." (setenv "EUDEV_RULES_DIRECTORY" #$(file-append rules "/lib/udev/rules.d")) - (let* ((kernel-release - (utsname:release (uname))) - (linux-module-directory - (getenv "LINUX_MODULE_DIRECTORY")) - (directory - (string-append linux-module-directory "/" - kernel-release)) - (old-umask (umask #o022))) - (make-static-device-nodes directory) - (umask old-umask)) - (let ((pid (primitive-fork))) (case pid ((0)
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:32 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:31 2018 Received: from localhost ([127.0.0.1]:34381 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSt-0003tq-If for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42486) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSr-0003tK-1Y for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:29 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 287F7336287E; Tue, 27 Feb 2018 11:26:28 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 6/7] vm: Make the virtio-blk uniquely identifyable in /sys. Date: Tue, 27 Feb 2018 12:26:18 +0100 Message-Id: <20180227112619.5071-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:31 2018 Received: from localhost ([127.0.0.1]:34379 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSt-0003ti-A0 for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42476) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSq-0003tD-37 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:28 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 38CEC33615C9; Tue, 27 Feb 2018 11:26:27 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 5/7] vm: Allow qemu-image builder to load Linux kernel modules. Date: Tue, 27 Feb 2018 12:26:17 +0100 Message-Id: <20180227112619.5071-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:31 2018 Received: from localhost ([127.0.0.1]:34377 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSt-0003ta-0V for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42452) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSo-0003sT-NX for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 3860E3362AB9; Tue, 27 Feb 2018 11:26:26 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 4/7] linux-boot: Load kernel modules only when the hardware is present. Date: Tue, 27 Feb 2018 12:26:16 +0100 Message-Id: <20180227112619.5071-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 31 +++++++++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..6d00ea9be 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,32 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +512,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 46ef055f0..c8a9e4950 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -225,7 +225,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:31 2018 Received: from localhost ([127.0.0.1]:34375 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSs-0003tY-MT for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:30 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42462) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSo-0003sY-4j for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:26 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id D778333615C9; Tue, 27 Feb 2018 11:26:24 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 3/7] linux-initrd: Add kmod. Date: Tue, 27 Feb 2018 12:26:15 +0100 Message-Id: <20180227112619.5071-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (raw-initrd): Add kmod. (base-initrd): Add kmod. (expression->initrd): Add kmod, linux-module-directory. (flat-linux-module-directory): Add kmod; invoke depmod. * gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory. --- gnu/build/linux-initrd.scm | 12 +++++++++++- gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..6356007df 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init kmod linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,16 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when kmod + (mkdir-p "sbin") + (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7170d1c0e..46ef055f0 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -59,6 +59,8 @@ #:key (guile %guile-static-stripped) (gzip gzip) + kmod + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:kmod #$kmod + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd." (gexp->derivation name builder #:references-graphs `(("closure" ,init)))) -(define (flat-linux-module-directory linux modules) +(define (flat-linux-module-directory linux modules kmod) "Return a flat directory containing the Linux kernel modules listed in MODULES and taken from LINUX." (define build-exp @@ -109,7 +113,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -138,13 +142,27 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define version + (match + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)) + ((item) item))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (for-each (lambda (module) + (format #t "copying '~a'...~%" module) + (copy-file module + (string-append output "/" + (basename module)))) + (delete-duplicates modules))) + (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output + "-e" + "-F" (string-append #$linux "/System.map") + version) + #t))) (computed-file "linux-modules" build-exp)) @@ -152,6 +170,7 @@ MODULES and taken from LINUX." #:key (linux linux-libre) (linux-modules '()) + (kmod kmod-minimal/static) (mapped-devices '()) (helper-packages '()) qemu-networking? @@ -185,7 +204,7 @@ upon error." mapped-devices)) (define kodir - (flat-linux-module-directory linux linux-modules)) + (flat-linux-module-directory linux linux-modules kmod)) (expression->initrd (with-imported-modules (source-module-closure @@ -223,6 +242,8 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:kmod kmod + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) @@ -245,6 +266,7 @@ FILE-SYSTEMS." (define* (base-initrd file-systems #:key (linux linux-libre) + (kmod kmod-minimal/static) (mapped-devices '()) qemu-networking? volatile-root? @@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear." (raw-initrd file-systems #:linux linux #:linux-modules linux-modules + #:kmod kmod #:mapped-devices mapped-devices - #:helper-packages helper-packages + #:helper-packages (cons kmod helper-packages) #:qemu-networking? qemu-networking? #:volatile-root? volatile-root? #:on-error on-error))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:27 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:27 2018 Received: from localhost ([127.0.0.1]:34370 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSp-0003t1-Dk for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42440) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSk-0003sJ-8p for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:25 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 4FB8F336287E; Tue, 27 Feb 2018 11:26:20 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 0/7] Load Linux module only when supported hardware is present. Date: Tue, 27 Feb 2018 12:26:12 +0100 Message-Id: <20180227112619.5071-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (7): gnu: kmod: Split off kmod-minimal. gnu: Add kmod-minimal-static. linux-initrd: Add kmod. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk uniquely identifyable in /sys. linux-boot: Call make-static-device-nodes much earlier. gnu/build/linux-boot.scm | 43 ++++++++-- gnu/build/linux-initrd.scm | 12 ++- gnu/build/vm.scm | 2 +- gnu/local.mk | 1 + gnu/packages/linux.scm | 91 ++++++++++++++++++---- .../patches/kmod-13-module-directory.patch | 33 ++++++++ gnu/services/base.scm | 11 --- gnu/system/linux-initrd.scm | 50 +++++++++--- gnu/system/vm.scm | 34 ++++++-- 9 files changed, 224 insertions(+), 53 deletions(-) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:27 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:27 2018 Received: from localhost ([127.0.0.1]:34368 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSp-0003sz-3v for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42452) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSm-0003sT-Pp for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:25 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id C6A0B3362DFC; Tue, 27 Feb 2018 11:26:23 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 2/7] gnu: Add kmod-minimal-static. Date: Tue, 27 Feb 2018 12:26:14 +0100 Message-Id: <20180227112619.5071-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal/static): New variable. * gnu/packages/patches/kmod-13-module-directory.patch: New file. * gnu/local.mk: Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 44 ++++++++++++++++++++++ .../patches/kmod-13-module-directory.patch | 33 ++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch diff --git a/gnu/local.mk b/gnu/local.mk index 21195f8c1..b1e3c878d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -795,6 +795,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-makefile.patch \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch \ + %D%/packages/patches/kmod-13-module-directory.patch \ %D%/packages/patches/kmod-module-directory.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 1f8bf3050..b2e47f79a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1994,6 +1994,50 @@ from the module-init-tools project.") #t)) %standard-phases))))) +(define-public kmod-minimal/static + (static-package + (package (inherit kmod-minimal) + (name "kmod-minimal-static") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (arguments + (substitute-keyword-arguments + (package-arguments (static-package kmod-minimal)) + ((#:configure-flags flags ''()) + `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags)) + ((#:make-flags flags ''()) + `(cons* "LDFLAGS=-all-static" ,flags)) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'install-license-files) + (add-after 'unpack 'patch-kmod + (lambda _ + ;; Reduce size by 200 kiB. + (substitute* "tools/kmod.c" + (("[&]kmod_cmd_compat_lsmod,") "") + (("[&]kmod_cmd_compat_rmmod,") "") + (("[&]kmod_cmd_compat_insmod,") "") + (("[&]kmod_cmd_compat_modinfo,") "")) + #t)) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "tools/kmod" bin) + (for-each + (lambda (tool) + (symlink "kmod" (string-append bin "/" tool))) + '("modprobe" "depmod")) + #t)))))))))) + (define-public eudev ;; The post-systemd fork, maintained by Gentoo. (package diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch new file mode 100644 index 000000000..5ff2f8a60 --- /dev/null +++ b/gnu/packages/patches/kmod-13-module-directory.patch @@ -0,0 +1,33 @@ +This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY' +environment variable, rather than looking for modules exclusively in +/lib/modules. + +Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to +use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable +name. + + +--- kmod-7/libkmod/libkmod.c 2012-03-15 08:19:16.750010226 -0400 ++++ kmod-7/libkmod/libkmod.c 2012-04-04 15:21:29.532074313 -0400 +@@ -200,7 +200,7 @@ + static char *get_kernel_release(const char *dirname) + { + struct utsname u; +- char *p; ++ char *p, *dirname_prefix; + + if (dirname != NULL) + return path_make_absolute_cwd(dirname); +@@ -208,7 +208,10 @@ + if (uname(&u) < 0) + return NULL; + +- if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) ++ if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL) ++ dirname_prefix = dirname_default_prefix; ++ ++ if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0) + return NULL; + + return p; +
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:26 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue Feb 27 05:26:26 2018 Received: from localhost ([127.0.0.1]:34364 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqcSn-0003sU-32 for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:26 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:42444) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqcSl-0003sM-LI for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:24 -0500 Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com [77.118.239.24]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 982AA33615C9; Tue, 27 Feb 2018 11:26:22 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v4 1/7] gnu: kmod: Split off kmod-minimal. Date: Tue, 27 Feb 2018 12:26:13 +0100 Message-Id: <20180227112619.5071-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN> References: <20180226040609.3066-1-dannym@HIDDEN> <20180227112619.5071-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal): New variable. (kmod): Modify. --- gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 238398e84..1f8bf3050 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes commands such as to use Linux' inotify mechanism, which allows file accesses to be monitored.") (license license:gpl2+))) -(define-public kmod +(define kmod-minimal (package + (name "kmod-minimal") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f)) ; FIXME: Investigate test failures + (home-page "https://www.kernel.org/") + (synopsis "Kernel module tools") + (description "Kmod is a set of tools to handle common tasks with Linux +kernel modules like insert, remove, list, check properties, resolve +dependencies and aliases. + +These tools are designed on top of libkmod, a library that is shipped with +kmod. The aim is to be compatible with tools, configurations and indices +from the module-init-tools project.") + (license license:gpl2+))) ; library under lgpl2.1+ + +(define-public kmod + (package (inherit kmod-minimal) (name "kmod") (version "24") (source (origin @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (base32 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) (patches (search-patches "kmod-module-directory.patch")))) - (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xz" ,xz) ("zlib" ,zlib))) (arguments - `(#:tests? #f ; FIXME: Investigate test failures - #:configure-flags '("--with-xz" "--with-zlib") + `(#:configure-flags '("--with-xz" "--with-zlib") + #:tests? #f ; FIXME: Investigate test failures #:phases (alist-cons-after 'install 'install-modprobe&co (lambda* (#:key outputs #:allow-other-keys) @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (symlink "kmod" (string-append bin "/" tool))) '("insmod" "rmmod" "lsmod" "modprobe" - "modinfo" "depmod")))) - %standard-phases))) - (home-page "https://www.kernel.org/") - (synopsis "Kernel module tools") - (description "Kmod is a set of tools to handle common tasks with Linux -kernel modules like insert, remove, list, check properties, resolve -dependencies and aliases. - -These tools are designed on top of libkmod, a library that is shipped with -kmod. The aim is to be compatible with tools, configurations and indices -from the module-init-tools project.") - (license license:gpl2+))) ; library under lgpl2.1+ + "modinfo" "depmod")) + #t)) + %standard-phases))))) (define-public eudev ;; The post-systemd fork, maintained by Gentoo.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 11:52:01 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon Feb 26 06:52:01 2018 Received: from localhost ([127.0.0.1]:32826 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqHK5-00075N-ES for submit <at> debbugs.gnu.org; Mon, 26 Feb 2018 06:52:01 -0500 Received: from mail-wm0-f45.google.com ([74.125.82.45]:37279) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <m.othacehe@HIDDEN>) id 1eqHK3-00075A-F7 for 30604 <at> debbugs.gnu.org; Mon, 26 Feb 2018 06:51:59 -0500 Received: by mail-wm0-f45.google.com with SMTP id 139so3519697wmn.2 for <30604 <at> debbugs.gnu.org>; Mon, 26 Feb 2018 03:51:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=references:user-agent:from:to:cc:subject:in-reply-to:date :message-id:mime-version; bh=5i6T3rxqP8CWJWRxiWNh6xDnQ5Hvl15DMRbhDNWQMdI=; b=Wse6k8247do6aHihrvX3dKSu+y/PWmohVtP8kSh9pVkHJ7oU6kSMiWoqZCfjhwd2FB 9XL9HKEvheHn4BPrP7Ubqw3zEmltu1Fts3gDRKX6toHc3IqCcuYxAE4gi98Jtn23pXtn duh82szm94cqaarjfTkRKUEJmz+XsDsrWBnFBX1JANNKVps+vQCdBU1ThpCRx+sRrUVM 862dzqlGNVvdsinV/txl1+Iljv/857iyWYJQPs9qY2gYsf/oUcyoBLHYXmiVMvDyCoTf WCpUq+6G5/wH3ymmhpeHSIrONq7tJoWIzY4BF4ZQK55WQzPgajiSe7Ckce6N5XbR5Y12 Bb9g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:references:user-agent:from:to:cc:subject :in-reply-to:date:message-id:mime-version; bh=5i6T3rxqP8CWJWRxiWNh6xDnQ5Hvl15DMRbhDNWQMdI=; b=LKi8ltl1CByVwAog/ENeeNHHGqTGbecP2OjgojHkjsq5cVY/uRnVGfjHErm8XmbkpG UV7akTall3Hl/56sASqU6I2lTQSGrq0BsMBT+ONnyYC6iRCsCZvkPl6J7ApDfu3p7Mes PSYHCKHUD9JjowIBCQplhqQTtz0uRStAMjTu/VPE/T/g9G8/Cp+sJaUAoTY74iDVzFIn rGHU3tXf30cvsH6EPyXWDuu7lDJy1INSj1ONtsQm9kvcdvMJt5G5iqcqLtyfDkAz/woy uHirvhq52wLddIu1ystJxgJWWwfK/9q213mIVvYLgYvWwUnLpEWXPTpUct9BZnOI3uXl SgOA== X-Gm-Message-State: APf1xPD9yeL0GxO7UgL29XYX5f0Urst2Y5yVo58jcHcAr4mfBWWFH3Am 5IDXVoCuFFcgCOjq4n3wpOQ92w== X-Google-Smtp-Source: AG47ELugXm3kREm1j/NY1qEAXEvwcJDzkGcHEr4LKGGF0FAVmDWCLHjAr4rwmDZ/K0WcsVJTaltBWg== X-Received: by 10.28.133.129 with SMTP id h123mr8763571wmd.146.1519645913390; Mon, 26 Feb 2018 03:51:53 -0800 (PST) Received: from denali ([46.218.109.88]) by smtp.gmail.com with ESMTPSA id x78sm19032749wmd.2.2018.02.26.03.51.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 26 Feb 2018 03:51:52 -0800 (PST) References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> <20180225114816.869-3-dannym@HIDDEN> <87vaelf9ln.fsf@HIDDEN> <20180225160750.46bf5b50@HIDDEN> User-agent: mu4e 0.9.18; emacs 25.3.1 From: Mathieu Othacehe <m.othacehe@HIDDEN> To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod. In-reply-to: <20180225160750.46bf5b50@HIDDEN> Date: Mon, 26 Feb 2018 12:51:51 +0100 Message-ID: <87h8q4j7e0.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.0 (/) Hey Danny, > Because it's an option for specifying the location of "Module.symvers" - and > I don't know whether guix uses it (probably not). If one doesn't specify an > option, depmod will default to the running kernel - which is not what we want. > > I should elaborate in the comment that, if we start using Module.symvers, we > MUST pass "-E" there. Maybe better to even just check for the file existence > and add it right now, otherwise we might forget later. What do you think? Reading 'depmod' manpage, I understand that -E and -F are mutually exclusive. Both options seem to have an interest only if -e is supplied to "reports any symbols which a module needs which are not supplied by other modules or the kernel". So maybe something like "-F (string-append #$linux "/System.map") -e" would make more sense ? Mathieu
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:25 2018 Received: from localhost ([127.0.0.1]:60938 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3V-0004fc-Hk for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45184) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3S-0004f7-2K for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:22 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 409C433628BE; Mon, 26 Feb 2018 05:06:21 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 6/6] vm: Make the virtio-blk is uniquely identifyable in /sys. Date: Mon, 26 Feb 2018 05:06:09 +0100 Message-Id: <20180226040609.3066-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index b5a559012..fdff64ed9 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:25 2018 Received: from localhost ([127.0.0.1]:60936 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3V-0004fU-AH for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45176) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3R-0004er-5R for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 546F33361FF7; Mon, 26 Feb 2018 05:06:20 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 5/6] vm: Allow qemu-image builder to load Linux kernel modules. Date: Mon, 26 Feb 2018 05:06:08 +0100 Message-Id: <20180226040609.3066-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..b5a559012 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name - (with-imported-modules (source-module-closure '((gnu build bootloader) + (with-imported-modules (source-module-closure '((gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils))) #~(begin - (use-modules (gnu build bootloader) + (use-modules (gnu build activation) + (gnu build bootloader) (gnu build vm) (guix build utils) (srfi srfi-26) (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +317,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +387,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:25 2018 Received: from localhost ([127.0.0.1]:60934 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3V-0004fS-37 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45168) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3Q-0004el-7r for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:20 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 67A5E33628BE; Mon, 26 Feb 2018 05:06:19 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 4/6] linux-boot: Load kernel modules only when the hardware is present. Date: Mon, 26 Feb 2018 05:06:07 +0100 Message-Id: <20180226040609.3066-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 31 +++++++++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..6d00ea9be 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,32 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +512,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 46ef055f0..c8a9e4950 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -225,7 +225,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:22 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:22 2018 Received: from localhost ([127.0.0.1]:60931 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3R-0004f2-LI for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:22 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45160) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3P-0004eX-AV for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:19 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 2D84E3361FF7; Mon, 26 Feb 2018 05:06:18 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 3/6] linux-initrd: Add kmod. Date: Mon, 26 Feb 2018 05:06:06 +0100 Message-Id: <20180226040609.3066-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (raw-initrd): Add kmod. (base-initrd): Add kmod. (expression->initrd): Add kmod, linux-module-directory. (flat-linux-module-directory): Add kmod; invoke depmod. * gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory. --- gnu/build/linux-initrd.scm | 12 +++++++++++- gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..6356007df 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init kmod linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,16 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when kmod + (mkdir-p "sbin") + (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7170d1c0e..46ef055f0 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -59,6 +59,8 @@ #:key (guile %guile-static-stripped) (gzip gzip) + kmod + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:kmod #$kmod + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd." (gexp->derivation name builder #:references-graphs `(("closure" ,init)))) -(define (flat-linux-module-directory linux modules) +(define (flat-linux-module-directory linux modules kmod) "Return a flat directory containing the Linux kernel modules listed in MODULES and taken from LINUX." (define build-exp @@ -109,7 +113,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -138,13 +142,27 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define version + (match + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)) + ((item) item))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (for-each (lambda (module) + (format #t "copying '~a'...~%" module) + (copy-file module + (string-append output "/" + (basename module)))) + (delete-duplicates modules))) + (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output + ; -E + "-F" (string-append #$linux "/System.map") + version) + #t))) (computed-file "linux-modules" build-exp)) @@ -152,6 +170,7 @@ MODULES and taken from LINUX." #:key (linux linux-libre) (linux-modules '()) + (kmod kmod-minimal/static) (mapped-devices '()) (helper-packages '()) qemu-networking? @@ -185,7 +204,7 @@ upon error." mapped-devices)) (define kodir - (flat-linux-module-directory linux linux-modules)) + (flat-linux-module-directory linux linux-modules kmod)) (expression->initrd (with-imported-modules (source-module-closure @@ -223,6 +242,8 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:kmod kmod + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) @@ -245,6 +266,7 @@ FILE-SYSTEMS." (define* (base-initrd file-systems #:key (linux linux-libre) + (kmod kmod-minimal/static) (mapped-devices '()) qemu-networking? volatile-root? @@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear." (raw-initrd file-systems #:linux linux #:linux-modules linux-modules + #:kmod kmod #:mapped-devices mapped-devices - #:helper-packages helper-packages + #:helper-packages (cons kmod helper-packages) #:qemu-networking? qemu-networking? #:volatile-root? volatile-root? #:on-error on-error))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:21 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:21 2018 Received: from localhost ([127.0.0.1]:60928 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3R-0004ev-9k for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45150) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3O-0004eK-26 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:18 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 23D6833628BE; Mon, 26 Feb 2018 05:06:17 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 2/6] gnu: Add kmod-minimal-static. Date: Mon, 26 Feb 2018 05:06:05 +0100 Message-Id: <20180226040609.3066-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal/static): New variable. * gnu/packages/patches/kmod-13-module-directory.patch: New file. * gnu/local.mk: Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 44 ++++++++++++++++++++++ .../patches/kmod-13-module-directory.patch | 33 ++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch diff --git a/gnu/local.mk b/gnu/local.mk index 21195f8c1..b1e3c878d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -795,6 +795,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-makefile.patch \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch \ + %D%/packages/patches/kmod-13-module-directory.patch \ %D%/packages/patches/kmod-module-directory.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 1f8bf3050..b2e47f79a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1994,6 +1994,50 @@ from the module-init-tools project.") #t)) %standard-phases))))) +(define-public kmod-minimal/static + (static-package + (package (inherit kmod-minimal) + (name "kmod-minimal-static") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (arguments + (substitute-keyword-arguments + (package-arguments (static-package kmod-minimal)) + ((#:configure-flags flags ''()) + `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags)) + ((#:make-flags flags ''()) + `(cons* "LDFLAGS=-all-static" ,flags)) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'install-license-files) + (add-after 'unpack 'patch-kmod + (lambda _ + ;; Reduce size by 200 kiB. + (substitute* "tools/kmod.c" + (("[&]kmod_cmd_compat_lsmod,") "") + (("[&]kmod_cmd_compat_rmmod,") "") + (("[&]kmod_cmd_compat_insmod,") "") + (("[&]kmod_cmd_compat_modinfo,") "")) + #t)) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "tools/kmod" bin) + (for-each + (lambda (tool) + (symlink "kmod" (string-append bin "/" tool))) + '("modprobe" "depmod")) + #t)))))))))) + (define-public eudev ;; The post-systemd fork, maintained by Gentoo. (package diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch new file mode 100644 index 000000000..5ff2f8a60 --- /dev/null +++ b/gnu/packages/patches/kmod-13-module-directory.patch @@ -0,0 +1,33 @@ +This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY' +environment variable, rather than looking for modules exclusively in +/lib/modules. + +Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to +use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable +name. + + +--- kmod-7/libkmod/libkmod.c 2012-03-15 08:19:16.750010226 -0400 ++++ kmod-7/libkmod/libkmod.c 2012-04-04 15:21:29.532074313 -0400 +@@ -200,7 +200,7 @@ + static char *get_kernel_release(const char *dirname) + { + struct utsname u; +- char *p; ++ char *p, *dirname_prefix; + + if (dirname != NULL) + return path_make_absolute_cwd(dirname); +@@ -208,7 +208,10 @@ + if (uname(&u) < 0) + return NULL; + +- if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) ++ if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL) ++ dirname_prefix = dirname_default_prefix; ++ ++ if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0) + return NULL; + + return p; +
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:21 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:21 2018 Received: from localhost ([127.0.0.1]:60926 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3R-0004et-2K for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45138) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3L-0004eA-MF for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:18 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8377B3361672; Mon, 26 Feb 2018 05:06:14 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 0/6] Load Linux module only when supported hardware is present. Date: Mon, 26 Feb 2018 05:06:03 +0100 Message-Id: <20180226040609.3066-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (6): gnu: kmod: Split off kmod-minimal. gnu: Add kmod-minimal-static. linux-initrd: Add kmod. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk is uniquely identifyable in /sys. gnu/build/linux-boot.scm | 31 +++++++- gnu/build/linux-initrd.scm | 12 ++- gnu/build/vm.scm | 2 +- gnu/local.mk | 1 + gnu/packages/linux.scm | 91 ++++++++++++++++++---- .../patches/kmod-13-module-directory.patch | 33 ++++++++ gnu/system/linux-initrd.scm | 49 +++++++++--- gnu/system/vm.scm | 34 ++++++-- 8 files changed, 215 insertions(+), 38 deletions(-) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:19 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 23:06:19 2018 Received: from localhost ([127.0.0.1]:60922 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eqA3O-0004eW-QR for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:19 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:45142) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eqA3M-0004eC-Kq for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:17 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id A05E63361FF7; Mon, 26 Feb 2018 05:06:15 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v3 1/6] gnu: kmod: Split off kmod-minimal. Date: Mon, 26 Feb 2018 05:06:04 +0100 Message-Id: <20180226040609.3066-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN> References: <20180226035025.1698-1-dannym@HIDDEN> <20180226040609.3066-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal): New variable. (kmod): Modify. --- gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 238398e84..1f8bf3050 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes commands such as to use Linux' inotify mechanism, which allows file accesses to be monitored.") (license license:gpl2+))) -(define-public kmod +(define kmod-minimal (package + (name "kmod-minimal") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f)) ; FIXME: Investigate test failures + (home-page "https://www.kernel.org/") + (synopsis "Kernel module tools") + (description "Kmod is a set of tools to handle common tasks with Linux +kernel modules like insert, remove, list, check properties, resolve +dependencies and aliases. + +These tools are designed on top of libkmod, a library that is shipped with +kmod. The aim is to be compatible with tools, configurations and indices +from the module-init-tools project.") + (license license:gpl2+))) ; library under lgpl2.1+ + +(define-public kmod + (package (inherit kmod-minimal) (name "kmod") (version "24") (source (origin @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (base32 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) (patches (search-patches "kmod-module-directory.patch")))) - (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xz" ,xz) ("zlib" ,zlib))) (arguments - `(#:tests? #f ; FIXME: Investigate test failures - #:configure-flags '("--with-xz" "--with-zlib") + `(#:configure-flags '("--with-xz" "--with-zlib") + #:tests? #f ; FIXME: Investigate test failures #:phases (alist-cons-after 'install 'install-modprobe&co (lambda* (#:key outputs #:allow-other-keys) @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (symlink "kmod" (string-append bin "/" tool))) '("insmod" "rmmod" "lsmod" "modprobe" - "modinfo" "depmod")))) - %standard-phases))) - (home-page "https://www.kernel.org/") - (synopsis "Kernel module tools") - (description "Kmod is a set of tools to handle common tasks with Linux -kernel modules like insert, remove, list, check properties, resolve -dependencies and aliases. - -These tools are designed on top of libkmod, a library that is shipped with -kmod. The aim is to be compatible with tools, configurations and indices -from the module-init-tools project.") - (license license:gpl2+))) ; library under lgpl2.1+ + "modinfo" "depmod")) + #t)) + %standard-phases))))) (define-public eudev ;; The post-systemd fork, maintained by Gentoo.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:41 2018 Received: from localhost ([127.0.0.1]:60900 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oH-0004Hm-72 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:41 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43594) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9oF-0004HP-Jh for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:39 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id A90643361672; Mon, 26 Feb 2018 04:50:38 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 6/6] vm: Make the virtio-blk is uniquely identifyable in /sys. Date: Mon, 26 Feb 2018 04:50:25 +0100 Message-Id: <20180226035025.1698-7-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10. * gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10. --- gnu/build/vm.scm | 2 +- gnu/system/vm.scm | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index fe003ea45..ebf9e9f6e 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'." builder) (append (if make-disk-image? - `("-device" "virtio-blk,drive=myhd" + `("-device" "virtio-blk-pci,addr=0x10,drive=myhd" "-drive" ,(string-append "if=none,file=" output ",format=" disk-image-format ",id=myhd")) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index c64c9678f..ad48999ee 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -704,7 +704,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS." #$@(map virtfs-option shared-fs) "-vga std" - (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly" + "-device" "virtio-blk-pci,addr=0x10,drive=myhd" + (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly" #$image))) (define* (system-qemu-image/shared-store-script os
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:41 2018 Received: from localhost ([127.0.0.1]:60898 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oG-0004Hf-Ux for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:41 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43584) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9oE-0004HH-K5 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:38 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id AD8A13361FF7; Mon, 26 Feb 2018 04:50:37 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 5/6] vm: Allow qemu-image builder to load Linux kernel modules. Date: Mon, 26 Feb 2018 04:50:24 +0100 Message-Id: <20180226035025.1698-6-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/vm.scm (%modprobe-wrapper): New variable. (qemu-image): Modify. --- gnu/system/vm.scm | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm index 345cecedd..c64c9678f 100644 --- a/gnu/system/vm.scm +++ b/gnu/system/vm.scm @@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)." #:single-file-output? #t #:references-graphs inputs)) +(define (%modprobe-wrapper modprobe linux-module-directory) + ;; Wrapper for the 'modprobe' command that knows where modules live. + ;; + ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe', + ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' + ;; environment variable is not set---hence the need for this wrapper. + (program-file "modprobe" + #~(begin + (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory) + (apply execl #$modprobe (cons #$modprobe (cdr (command-line))))))) + (define* (qemu-image #:key (name "qemu-image") (system (%current-system)) @@ -275,6 +286,8 @@ INPUTS is a list of inputs (as for packages). When COPY-INPUTS? is true, copy all of INPUTS into the image being built. When REGISTER-CLOSURES? is true, register INPUTS in the store database of the image so that Guix can be used in the image." + (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe")) + (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules")))) (expression->derivation-in-linux-vm name (with-imported-modules (source-module-closure '((gnu build bootloader) @@ -288,7 +301,7 @@ the image." (ice-9 binary-ports)) (let ((inputs - '#$(append (list qemu parted e2fsprogs dosfstools) + '#$(append (list qemu parted e2fsprogs dosfstools kmod) (map canonical-package (list sed grep coreutils findutils gawk)) (if register-closures? (list guix) '()))) @@ -302,6 +315,14 @@ the image." inputs))) (set-path-environment-variable "PATH" '("bin" "sbin") inputs) + ;; It's possible that we need to load nls modules in order to + ;; mount the new partition. + (if (file-exists? #$modprobe-name) + (activate-modprobe #$(%modprobe-wrapper modprobe-name + linux-module-directory)) + (format (current-error-port) + "WARNING: No modprobe found in ~s. \ +Loading kernel modules will be impossible.\n" #$modprobe-name)) (let* ((graphs '#$(match inputs (((names . _) ...) @@ -364,7 +385,7 @@ the image." #:make-disk-image? #t #:disk-image-size disk-image-size #:disk-image-format disk-image-format - #:references-graphs inputs)) + #:references-graphs inputs))) ;;;
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:40 2018 Received: from localhost ([127.0.0.1]:60896 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oG-0004HY-Nn for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:40 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43576) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9oD-0004Gz-IK for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 9F2FC3361672; Mon, 26 Feb 2018 04:50:36 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 4/6] linux-boot: Load kernel modules only when the hardware is present. Date: Mon, 26 Feb 2018 04:50:23 +0100 Message-Id: <20180226035025.1698-5-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 31 +++++++++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..6d00ea9be 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,32 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +512,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 91e498787..6d130ccac 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -224,7 +224,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:40 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:40 2018 Received: from localhost ([127.0.0.1]:60894 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oG-0004HW-Dw for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:40 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43568) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9oC-0004Gp-M2 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 753EF33628BE; Mon, 26 Feb 2018 04:50:35 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 3/6] linux-initrd: Add kmod. Date: Mon, 26 Feb 2018 04:50:22 +0100 Message-Id: <20180226035025.1698-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (raw-initrd): Add kmod. (base-initrd): Add kmod. (expression->initrd): Add kmod, linux-module-directory. (flat-linux-module-directory): Add kmod; invoke depmod. * gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory. --- gnu/build/linux-initrd.scm | 12 +++++++++++- gnu/system/linux-initrd.scm | 44 +++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..6356007df 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init kmod linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,16 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (when kmod + (mkdir-p "sbin") + (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe")) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7170d1c0e..91e498787 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -59,6 +59,8 @@ #:key (guile %guile-static-stripped) (gzip gzip) + kmod + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:kmod #$kmod + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd." (gexp->derivation name builder #:references-graphs `(("closure" ,init)))) -(define (flat-linux-module-directory linux modules) +(define (flat-linux-module-directory linux modules kmod) "Return a flat directory containing the Linux kernel modules listed in MODULES and taken from LINUX." (define build-exp @@ -109,7 +113,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -138,13 +142,26 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define version + (car + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)))) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (for-each (lambda (module) + (format #t "copying '~a'...~%" module) + (copy-file module + (string-append output "/" + (basename module)))) + (delete-duplicates modules))) + (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output + ; -E + "-F" (string-append #$linux "/System.map") + version) + #t))) (computed-file "linux-modules" build-exp)) @@ -152,6 +169,7 @@ MODULES and taken from LINUX." #:key (linux linux-libre) (linux-modules '()) + (kmod kmod-minimal/static) (mapped-devices '()) (helper-packages '()) qemu-networking? @@ -185,7 +203,7 @@ upon error." mapped-devices)) (define kodir - (flat-linux-module-directory linux linux-modules)) + (flat-linux-module-directory linux linux-modules kmod)) (expression->initrd (with-imported-modules (source-module-closure @@ -223,6 +241,8 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:kmod kmod + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) @@ -245,6 +265,7 @@ FILE-SYSTEMS." (define* (base-initrd file-systems #:key (linux linux-libre) + (kmod kmod-minimal/static) (mapped-devices '()) qemu-networking? volatile-root? @@ -322,8 +343,9 @@ loaded at boot time in the order in which they appear." (raw-initrd file-systems #:linux linux #:linux-modules linux-modules + #:kmod kmod #:mapped-devices mapped-devices - #:helper-packages helper-packages + #:helper-packages (cons kmod helper-packages) #:qemu-networking? qemu-networking? #:volatile-root? volatile-root? #:on-error on-error))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:37 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:37 2018 Received: from localhost ([127.0.0.1]:60889 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oD-0004Gt-2S for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43534) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9o8-0004GM-ED for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:35 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 884E63361672; Mon, 26 Feb 2018 04:50:30 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 0/6] Load Linux module only when supported hardware is present. Date: Mon, 26 Feb 2018 04:50:19 +0100 Message-Id: <20180226035025.1698-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180225114557.816-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Danny Milosavljevic (6): gnu: kmod: Split off kmod-minimal. gnu: Add kmod-minimal-static. linux-initrd: Add kmod. linux-boot: Load kernel modules only when the hardware is present. vm: Allow qemu-image builder to load Linux kernel modules. vm: Make the virtio-blk is uniquely identifyable in /sys. gnu/build/linux-boot.scm | 31 +++++++- gnu/build/linux-initrd.scm | 12 ++- gnu/build/vm.scm | 2 +- gnu/local.mk | 1 + gnu/packages/linux.scm | 91 ++++++++++++++++++---- .../patches/kmod-13-module-directory.patch | 33 ++++++++ gnu/system/linux-initrd.scm | 48 +++++++++--- gnu/system/vm.scm | 28 ++++++- 8 files changed, 210 insertions(+), 36 deletions(-) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:37 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:37 2018 Received: from localhost ([127.0.0.1]:60886 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oC-0004Gq-OA for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43558) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9oB-0004GY-2W for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:35 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 0668A3361FF7; Mon, 26 Feb 2018 04:50:33 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 2/6] gnu: Add kmod-minimal-static. Date: Mon, 26 Feb 2018 04:50:21 +0100 Message-Id: <20180226035025.1698-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal/static): New variable. * gnu/packages/patches/kmod-13-module-directory.patch: New file. * gnu/local.mk: Add it. --- gnu/local.mk | 1 + gnu/packages/linux.scm | 44 ++++++++++++++++++++++ .../patches/kmod-13-module-directory.patch | 33 ++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch diff --git a/gnu/local.mk b/gnu/local.mk index 21195f8c1..b1e3c878d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -795,6 +795,7 @@ dist_patch_DATA = \ %D%/packages/patches/kiki-makefile.patch \ %D%/packages/patches/kiki-missing-includes.patch \ %D%/packages/patches/kiki-portability-64bit.patch \ + %D%/packages/patches/kmod-13-module-directory.patch \ %D%/packages/patches/kmod-module-directory.patch \ %D%/packages/patches/kobodeluxe-paths.patch \ %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch \ diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 1f8bf3050..b2e47f79a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1994,6 +1994,50 @@ from the module-init-tools project.") #t)) %standard-phases))))) +(define-public kmod-minimal/static + (static-package + (package (inherit kmod-minimal) + (name "kmod-minimal-static") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (arguments + (substitute-keyword-arguments + (package-arguments (static-package kmod-minimal)) + ((#:configure-flags flags ''()) + `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags)) + ((#:make-flags flags ''()) + `(cons* "LDFLAGS=-all-static" ,flags)) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'install-license-files) + (add-after 'unpack 'patch-kmod + (lambda _ + ;; Reduce size by 200 kiB. + (substitute* "tools/kmod.c" + (("[&]kmod_cmd_compat_lsmod,") "") + (("[&]kmod_cmd_compat_rmmod,") "") + (("[&]kmod_cmd_compat_insmod,") "") + (("[&]kmod_cmd_compat_modinfo,") "")) + #t)) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "tools/kmod" bin) + (for-each + (lambda (tool) + (symlink "kmod" (string-append bin "/" tool))) + '("modprobe" "depmod")) + #t)))))))))) + (define-public eudev ;; The post-systemd fork, maintained by Gentoo. (package diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch new file mode 100644 index 000000000..5ff2f8a60 --- /dev/null +++ b/gnu/packages/patches/kmod-13-module-directory.patch @@ -0,0 +1,33 @@ +This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY' +environment variable, rather than looking for modules exclusively in +/lib/modules. + +Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to +use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable +name. + + +--- kmod-7/libkmod/libkmod.c 2012-03-15 08:19:16.750010226 -0400 ++++ kmod-7/libkmod/libkmod.c 2012-04-04 15:21:29.532074313 -0400 +@@ -200,7 +200,7 @@ + static char *get_kernel_release(const char *dirname) + { + struct utsname u; +- char *p; ++ char *p, *dirname_prefix; + + if (dirname != NULL) + return path_make_absolute_cwd(dirname); +@@ -208,7 +208,10 @@ + if (uname(&u) < 0) + return NULL; + +- if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0) ++ if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL) ++ dirname_prefix = dirname_default_prefix; ++ ++ if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0) + return NULL; + + return p; +
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:34 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 22:50:34 2018 Received: from localhost ([127.0.0.1]:60883 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq9oA-0004GV-G3 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:34 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:43548) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1eq9o8-0004GO-Qr for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:33 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id BD84D3362AB9; Mon, 26 Feb 2018 04:50:31 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH v2 1/6] gnu: kmod: Split off kmod-minimal. Date: Mon, 26 Feb 2018 04:50:20 +0100 Message-Id: <20180226035025.1698-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180226035025.1698-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal): New variable. (kmod): Modify. --- gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 238398e84..1f8bf3050 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes commands such as to use Linux' inotify mechanism, which allows file accesses to be monitored.") (license license:gpl2+))) -(define-public kmod +(define kmod-minimal (package + (name "kmod-minimal") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f)) ; FIXME: Investigate test failures + (home-page "https://www.kernel.org/") + (synopsis "Kernel module tools") + (description "Kmod is a set of tools to handle common tasks with Linux +kernel modules like insert, remove, list, check properties, resolve +dependencies and aliases. + +These tools are designed on top of libkmod, a library that is shipped with +kmod. The aim is to be compatible with tools, configurations and indices +from the module-init-tools project.") + (license license:gpl2+))) ; library under lgpl2.1+ + +(define-public kmod + (package (inherit kmod-minimal) (name "kmod") (version "24") (source (origin @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (base32 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) (patches (search-patches "kmod-module-directory.patch")))) - (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xz" ,xz) ("zlib" ,zlib))) (arguments - `(#:tests? #f ; FIXME: Investigate test failures - #:configure-flags '("--with-xz" "--with-zlib") + `(#:configure-flags '("--with-xz" "--with-zlib") + #:tests? #f ; FIXME: Investigate test failures #:phases (alist-cons-after 'install 'install-modprobe&co (lambda* (#:key outputs #:allow-other-keys) @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (symlink "kmod" (string-append bin "/" tool))) '("insmod" "rmmod" "lsmod" "modprobe" - "modinfo" "depmod")))) - %standard-phases))) - (home-page "https://www.kernel.org/") - (synopsis "Kernel module tools") - (description "Kmod is a set of tools to handle common tasks with Linux -kernel modules like insert, remove, list, check properties, resolve -dependencies and aliases. - -These tools are designed on top of libkmod, a library that is shipped with -kmod. The aim is to be compatible with tools, configurations and indices -from the module-init-tools project.") - (license license:gpl2+))) ; library under lgpl2.1+ + "modinfo" "depmod")) + #t)) + %standard-phases))))) (define-public eudev ;; The post-systemd fork, maintained by Gentoo.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 01:10:18 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 20:10:18 2018 Received: from localhost ([127.0.0.1]:60798 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1eq7J4-0000e5-3C for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 20:10:18 -0500 Received: from out5-smtp.messagingengine.com ([66.111.4.29]:49367) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <mbakke@HIDDEN>) id 1eq7J2-0000dw-Ox for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 20:10:17 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id 8399320D79; Sun, 25 Feb 2018 20:10:16 -0500 (EST) Received: from frontend2 ([10.202.2.161]) by compute5.internal (MEProxy); Sun, 25 Feb 2018 20:10:16 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.com; h= content-type:date:from:in-reply-to:message-id:mime-version :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; bh=JZnlXr5pUawNBgTEQ2/mTtgNUVAwVHJFENtQyLoYgrE=; b=i24S8jEQ 8t/58HRl8Sg4E73MdjrKlyiaBmmZtQZ10ffChwRBgEPaYHeqor+SDLGQ9hGyLF9p 10g5jc/DIq8d8AznHPJjhF5CQc8jT71b7ZOiiWfe+lZuMgxGGt//MNPPOP8G0xnI Gbr9l0YBhbpVx3RgdtsJlvgL4wq80i7JHCrjhFyTOYiOjOyQECGq7y+M8VNlfqEV T/jBxQkll1ctVcxnvSxqEqiEb+ZnUcpBu3pcD3kRfYERwqrfqHs3PBq6YW3UvZGj S3AixT0nw4M/VNOtG4BesE8F9lDSeFiGLzpgBypNXXN40IpoQCjzt7HnTp6qS7gX lZ6tt/MSq1GXnQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; bh=JZnlXr5pUawNBgTEQ2/mTtgNUVAwV HJFENtQyLoYgrE=; b=hE+tmTMQ4oM4lt/HggTg5+xlrASestzl4v+KKST5T8I3K U0SZR4qIbq1zieQAW+NUSWedXdgelUoBA/Cn+5bLXUo9wWOqAmkEyOGMwRxUYeSj FC3ESVjlR68wKHT/WvK3expOxG9aVLa9afFdX54ZlUlIEp4DphAfI6KES/QhYvZ4 S33CRad8CgKXYFmgaEEUqCR3udlG7rZr5koD8px2pqcD6+yNgpTW3AqpDSHwilBl MbRmLzYyEyHGiwUTQfffi65yK/I0szOBdid2Qjsfw1glc5CmORlU49fr3SCxyrwn Zeom4ALkwhuSe06vlnl/91BjopxZWdVB3ISP+ynSA== X-ME-Sender: <xms:eF6TWkTkeXX7inJXfJgqYRFnx9XtimvgYJ484TIkgQh7ctwDt0EZBg> Received: from localhost (cm-84.214.173.174.getinternet.no [84.214.173.174]) by mail.messagingengine.com (Postfix) with ESMTPA id 23BDD24651; Sun, 25 Feb 2018 20:10:16 -0500 (EST) From: Marius Bakke <mbakke@HIDDEN> To: Danny Milosavljevic <dannym@HIDDEN>, 30604 <at> debbugs.gnu.org Subject: Re: [bug#30604] [PATCH 1/4] gnu: kmod: Split off kmod-minimal. In-Reply-To: <20180225114816.869-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> User-Agent: Notmuch/0.26 (https://notmuchmail.org) Emacs/25.3.1 (x86_64-pc-linux-gnu) Date: Mon, 26 Feb 2018 02:10:14 +0100 Message-ID: <87h8q4wo7d.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Danny Milosavljevic <dannym@HIDDEN> writes: > * gnu/packages/linux.scm (kmod-minimal): New variable. > (kmod): Modify. > --- > gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++-----------= ----- > 1 file changed, 33 insertions(+), 16 deletions(-) > > diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm > index 238398e84..1f8bf3050 100644 > --- a/gnu/packages/linux.scm > +++ b/gnu/packages/linux.scm > @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes= commands such as > to use Linux' inotify mechanism, which allows file accesses to be monito= red.") > (license license:gpl2+))) >=20=20 > -(define-public kmod > +(define kmod-minimal > (package > + (name "kmod-minimal") > + (version "13") Why this old version? > + (source (origin > + (method url-fetch) > + (uri > + (string-append "mirror://kernel.org/linux/utils/kernel/km= od/" > + "kmod-" version ".tar.xz")) > + (sha256 > + (base32 > + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) > + (patches (search-patches "kmod-13-module-directory.patch")= ))) This patch seems to be missing. > + (build-system gnu-build-system) > + (arguments > + `(#:tests? #f)) ; FIXME: Investigate test failures > + (home-page "https://www.kernel.org/") > + (synopsis "Kernel module tools") > + (description "Kmod is a set of tools to handle common tasks with Lin= ux > +kernel modules like insert, remove, list, check properties, resolve > +dependencies and aliases. > + > +These tools are designed on top of libkmod, a library that is shipped wi= th > +kmod. The aim is to be compatible with tools, configurations and indices > +from the module-init-tools project.") > + (license license:gpl2+))) ; library under lgpl2.1+ > + > +(define-public kmod > + (package (inherit kmod-minimal) > (name "kmod") > (version "24") > (source (origin > @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows fil= e accesses to be monitored.") > (base32 > "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) > (patches (search-patches "kmod-module-directory.patch")))) > - (build-system gnu-build-system) > (native-inputs > `(("pkg-config" ,pkg-config))) > (inputs > `(("xz" ,xz) > ("zlib" ,zlib))) > (arguments > - `(#:tests? #f ; FIXME: Investigate test failures > - #:configure-flags '("--with-xz" "--with-zlib") > + `(#:configure-flags '("--with-xz" "--with-zlib") > + #:tests? #f ; FIXME: Investigate test failures > #:phases (alist-cons-after > 'install 'install-modprobe&co > (lambda* (#:key outputs #:allow-other-keys) > @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file= accesses to be monitored.") > (symlink "kmod" > (string-append bin "/" tool))) > '("insmod" "rmmod" "lsmod" "modprobe" > - "modinfo" "depmod")))) > - %standard-phases))) > - (home-page "https://www.kernel.org/") > - (synopsis "Kernel module tools") > - (description "Kmod is a set of tools to handle common tasks with Lin= ux > -kernel modules like insert, remove, list, check properties, resolve > -dependencies and aliases. > - > -These tools are designed on top of libkmod, a library that is shipped wi= th > -kmod. The aim is to be compatible with tools, configurations and indices > -from the module-init-tools project.") > - (license license:gpl2+))) ; library under lgpl2.1+ > + "modinfo" "depmod")) > + #t)) > + %standard-phases))))) >=20=20 > (define-public eudev > ;; The post-systemd fork, maintained by Gentoo. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAlqTXnYACgkQoqBt8qM6 VPpGtAf9HdKJjuRHFJxIT76qB3Yjub3mj5c3LRNhSA1vPnaPEMOXVDDTlq4t8XcR K0oaixbKYcSvSmHJ+Sp17jy+SYpeA1WGGpCxKVsBl8FCKhEYh2ztbgRUtMwjXZyF ZjO15dLd2SU40hWXVabKDeDTZyD9whMZMrbKAmu1OelG9lSPJw7fWfSU8UnZeXJg TflXbAN+9Ikm5ey4kxY/v+IjE60aWd5CRlUqcWVzKzZ7bSmU81r+paUWSe+11V7n 7LoBFm/MwQM3JFkglmSkWsDv/9eQwfm6CI6yV15qChL+MXuSFKzuJNKeETd7TvV9 P8zks8IDY7CA9I3PwJXPEZRuwA7QYw== =YgmH -----END PGP SIGNATURE----- --=-=-=--
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 15:07:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 10:07:58 2018 Received: from localhost ([127.0.0.1]:60535 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epxu9-0001yP-WD for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 10:07:58 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:46008) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epxu8-0001yH-8G for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 10:07:56 -0500 Received: from localhost (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 9A68E33606CB; Sun, 25 Feb 2018 16:07:54 +0100 (CET) Date: Sun, 25 Feb 2018 16:07:50 +0100 From: Danny Milosavljevic <dannym@HIDDEN> To: Mathieu Othacehe <m.othacehe@HIDDEN> Subject: Re: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod. Message-ID: <20180225160750.46bf5b50@HIDDEN> In-Reply-To: <87vaelf9ln.fsf@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> <20180225114816.869-3-dannym@HIDDEN> <87vaelf9ln.fsf@HIDDEN> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) Hi Mathieu, thanks for the review. On Sun, 25 Feb 2018 15:05:24 +0100 Mathieu Othacehe <m.othacehe@HIDDEN> wrote: > > + ; -E > > Why is this commented ? Because it's an option for specifying the location of "Module.symvers" - and I don't know whether guix uses it (probably not). If one doesn't specify an option, depmod will default to the running kernel - which is not what we want. I should elaborate in the comment that, if we start using Module.symvers, we MUST pass "-E" there. Maybe better to even just check for the file existence and add it right now, otherwise we might forget later. What do you think?
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 14:05:35 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 09:05:35 2018 Received: from localhost ([127.0.0.1]:59541 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epwvm-0000LL-S9 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 09:05:35 -0500 Received: from mail-wm0-f41.google.com ([74.125.82.41]:33180) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <m.othacehe@HIDDEN>) id 1epwvk-0000Ky-6R for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 09:05:32 -0500 Received: by mail-wm0-f41.google.com with SMTP id s206so13397552wme.0 for <30604 <at> debbugs.gnu.org>; Sun, 25 Feb 2018 06:05:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=references:user-agent:from:to:cc:subject:in-reply-to:date :message-id:mime-version; bh=eE8g9rlXxJtiMzrcCfh8ctgXBw/SVaPMsMpJ+nRtbAw=; b=pW0SFX+4WL/WOab00IB+iC5SmuJ3IWWDpKAr4jdLVEFwBZ0kzb+HCLj69WgWfC2r+O 7dJ+o92bNkPE3BOiNXrpbCBdfYzetyqLOojlp4k1VWEwzIwwVhwHtxC01FYdRDbdWPGo jy5qyG+ivvEtz1bF+oP2QrVmP5xN29sCf6qJW6FqEBoicruE9KsbhMMqYrCIuuXq9CdX noGUsddPISy/7HHwpclsCAXE5SUw5vmBdS1sZiAkD1FhAPtF9ed38AE9L2hbajEA+7fT 48KyGtiw2X2l6hsFjyvAi82hMbt/3mmFjRfS22+AJjCTV6Gz79RLnuY+1f9cbgkJNpYK Sijw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:references:user-agent:from:to:cc:subject :in-reply-to:date:message-id:mime-version; bh=eE8g9rlXxJtiMzrcCfh8ctgXBw/SVaPMsMpJ+nRtbAw=; b=eMNNxTuWCUEo1TGlmUyXeYC0tRAXDqWQ7829f8fs7E7kufWE0whSDS7OeGSuu/QqP2 24OKs2y9LSueGmkHtYfzc+7xpwS2cuVxNpwXtVcD81hfTbAGvjG+0+ymKAusKAzmNTqj HPAZLTwFlvOLquTSikuYu0spcbxT7LIyKXKzBQsN5jCC7ZXgKI5P4pUVRiDkP6RnJEBd RVxy3ssKyb6sKr/ULoUp/9ELpEjf996ozxE2R2XWkIeSmZnjtTPyzO9d1b7g/x69nSCe 0taFK9l2iZW6qwCSxYzQR2un59L16BJbQ3IsyQCDvGcYrWbOyFncC8OaivrmWDzPIblc n+eA== X-Gm-Message-State: APf1xPDA42j8JyOM/J1GKYWtfAeYR206BILzN/ElFm9qXlYhkd3vtbRk g2KLWotBqJ2TgVnCu5sBiBbkHA== X-Google-Smtp-Source: AH8x22688oTEM6HfMRXyaFrBcgT82T3TW6DAOBqgcl6IWN3em2LeJNc47qcDMYQ67dAaWI15l8JxXA== X-Received: by 10.28.0.88 with SMTP id 85mr5817354wma.63.1519567526003; Sun, 25 Feb 2018 06:05:26 -0800 (PST) Received: from cervin ([78.192.96.126]) by smtp.gmail.com with ESMTPSA id q14sm5316150wre.83.2018.02.25.06.05.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 25 Feb 2018 06:05:25 -0800 (PST) References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> <20180225114816.869-3-dannym@HIDDEN> User-agent: mu4e 0.9.18; emacs 25.3.1 From: Mathieu Othacehe <m.othacehe@HIDDEN> To: Danny Milosavljevic <dannym@HIDDEN> Subject: Re: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod. In-reply-to: <20180225114816.869-3-dannym@HIDDEN> Date: Sun, 25 Feb 2018 15:05:24 +0100 Message-ID: <87vaelf9ln.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 30604 Cc: 30604 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.0 (/) Hi Danny, Here are some small remarks, > + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. > + (if kmod > + (begin You can use "when" to avoid "begin". > + (define version > + (car Prefer match to car/cdr use. > + (filter > + (lambda (name) > + (not (string-prefix? "." name))) > + (scandir module-dir)))) > + > + (display "VERSION") > + (display version) > + (newline) (format #t "VERSION" ~a~%" version) would be shorter. > + ; -E Why is this commented ? > + "-F" (string-append #$linux "/System.map") > + version) > + #t))) > Thanks, Mathieu
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:40 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 06:48:40 2018 Received: from localhost ([127.0.0.1]:59486 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epunI-0003g2-2v for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:40 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:58702) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epunE-0003fj-Bl for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:36 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 286F2336028A; Sun, 25 Feb 2018 12:48:35 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH 4/4] linux-boot: Load kernel modules only when the hardware is present. Date: Sun, 25 Feb 2018 12:48:16 +0100 Message-Id: <20180225114816.869-4-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180225114816.869-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 24 ++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..65c91c50f 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,25 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + (define enter? + (const #t)) + (file-system-fold + enter? + ;; This is the Leaf handler. It tries to modprobe all the modaliases. + (lambda (path stat result) ; leaf + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias (call-with-input-file modalias-name read-string))) + (if (not (string=? modalias "")) + (system* "/sbin/modprobe" "-q" "--" modalias)))))) + (const #t) ; down + (const #t) ; up + (const #f) ; skip + (const #f) ; error + #f ; init + "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +505,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 93089a869..573f4a324 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -228,7 +228,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:40 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 06:48:40 2018 Received: from localhost ([127.0.0.1]:59484 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epunH-0003fz-Ol for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:40 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:58694) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epunD-0003fc-34 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:35 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 03F9D3360249; Sun, 25 Feb 2018 12:48:33 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH 3/4] linux-initrd: Add kmod. Date: Sun, 25 Feb 2018 12:48:15 +0100 Message-Id: <20180225114816.869-3-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180225114816.869-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/system/linux-initrd.scm (raw-initrd): Add kmod. (base-initrd): Add kmod. (expression->initrd): Add kmod, linux-module-directory. (flat-linux-module-directory): Add kmod; invoke depmod. * gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory. --- gnu/build/linux-initrd.scm | 13 +++++++++++- gnu/system/linux-initrd.scm | 48 ++++++++++++++++++++++++++++++++++----------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm index c65b5aacf..52cc180b4 100644 --- a/gnu/build/linux-initrd.scm +++ b/gnu/build/linux-initrd.scm @@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does." (define* (build-initrd output #:key - guile init + guile init kmod linux-module-directory (references-graphs '()) (gzip "gzip")) "Write an initial RAM disk (initrd) to OUTPUT. The initrd starts the script @@ -131,6 +131,17 @@ REFERENCES-GRAPHS." (symlink (string-append guile "/bin/guile") "proc/self/exe") (readlink "proc/self/exe") + ;; Make modprobe available as /sbin/modprobe so the kernel finds it. + (if kmod + (begin + (mkdir-p "sbin") + (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe"))) + + ;; Make modules available as /lib/modules so modprobe finds them. + (mkdir-p "lib") + (symlink (string-append linux-module-directory "/lib/modules") + "lib/modules") + ;; Reset the timestamps of all the files that will make it in the initrd. (for-each (lambda (file) (unless (eq? 'symlink (stat:type (lstat file))) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 7170d1c0e..93089a869 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -59,6 +59,8 @@ #:key (guile %guile-static-stripped) (gzip gzip) + kmod + linux-module-directory (name "guile-initrd") (system (%current-system))) "Return a derivation that builds a Linux initrd (a gzipped cpio archive) @@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd." (build-initrd (string-append #$output "/initrd") #:guile #$guile #:init #$init + #:kmod #$kmod + #:linux-module-directory #$linux-module-directory ;; Copy everything INIT refers to into the initrd. #:references-graphs '("closure") #:gzip (string-append #$gzip "/bin/gzip"))))) @@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd." (gexp->derivation name builder #:references-graphs `(("closure" ,init)))) -(define (flat-linux-module-directory linux modules) +(define (flat-linux-module-directory linux modules kmod) "Return a flat directory containing the Linux kernel modules listed in MODULES and taken from LINUX." (define build-exp @@ -109,7 +113,7 @@ MODULES and taken from LINUX." '((guix build utils) (gnu build linux-modules))) #~(begin - (use-modules (ice-9 match) (ice-9 regex) + (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw) (srfi srfi-1) (guix build utils) (gnu build linux-modules)) @@ -138,13 +142,30 @@ MODULES and taken from LINUX." (recursive-module-dependencies modules #:lookup-module lookup)))) - (mkdir #$output) - (for-each (lambda (module) - (format #t "copying '~a'...~%" module) - (copy-file module - (string-append #$output "/" - (basename module)))) - (delete-duplicates modules))))) + (define version + (car + (filter + (lambda (name) + (not (string-prefix? "." name))) + (scandir module-dir)))) + + (display "VERSION") + (display version) + (newline) + + (let ((output (string-append #$output "/lib/modules/" version))) + (mkdir-p output) + (for-each (lambda (module) + (format #t "copying '~a'...~%" module) + (copy-file module + (string-append output "/" + (basename module)))) + (delete-duplicates modules))) + (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output + ; -E + "-F" (string-append #$linux "/System.map") + version) + #t))) (computed-file "linux-modules" build-exp)) @@ -152,6 +173,7 @@ MODULES and taken from LINUX." #:key (linux linux-libre) (linux-modules '()) + (kmod kmod-minimal/static) (mapped-devices '()) (helper-packages '()) qemu-networking? @@ -185,7 +207,7 @@ upon error." mapped-devices)) (define kodir - (flat-linux-module-directory linux linux-modules)) + (flat-linux-module-directory linux linux-modules kmod)) (expression->initrd (with-imported-modules (source-module-closure @@ -223,6 +245,8 @@ upon error." #:qemu-guest-networking? #$qemu-networking? #:volatile-root? '#$volatile-root? #:on-error '#$on-error))) + #:kmod kmod + #:linux-module-directory kodir #:name "raw-initrd")) (define* (file-system-packages file-systems #:key (volatile-root? #f)) @@ -245,6 +269,7 @@ FILE-SYSTEMS." (define* (base-initrd file-systems #:key (linux linux-libre) + (kmod kmod-minimal/static) (mapped-devices '()) qemu-networking? volatile-root? @@ -322,8 +347,9 @@ loaded at boot time in the order in which they appear." (raw-initrd file-systems #:linux linux #:linux-modules linux-modules + #:kmod kmod #:mapped-devices mapped-devices - #:helper-packages helper-packages + #:helper-packages (cons kmod helper-packages) #:qemu-networking? qemu-networking? #:volatile-root? volatile-root? #:on-error on-error))
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:36 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 06:48:36 2018 Received: from localhost ([127.0.0.1]:59481 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epunE-0003fk-Fu for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:36 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:58684) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epunB-0003fN-9G for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:33 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 39A63336028A; Sun, 25 Feb 2018 12:48:32 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH 2/4] gnu: Add kmod-minimal-static. Date: Sun, 25 Feb 2018 12:48:14 +0100 Message-Id: <20180225114816.869-2-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180225114816.869-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> <20180225114816.869-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal/static): New variable. --- gnu/packages/linux.scm | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 1f8bf3050..b2e47f79a 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1994,6 +1994,50 @@ from the module-init-tools project.") #t)) %standard-phases))))) +(define-public kmod-minimal/static + (static-package + (package (inherit kmod-minimal) + (name "kmod-minimal-static") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (arguments + (substitute-keyword-arguments + (package-arguments (static-package kmod-minimal)) + ((#:configure-flags flags ''()) + `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags)) + ((#:make-flags flags ''()) + `(cons* "LDFLAGS=-all-static" ,flags)) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (delete 'install-license-files) + (add-after 'unpack 'patch-kmod + (lambda _ + ;; Reduce size by 200 kiB. + (substitute* "tools/kmod.c" + (("[&]kmod_cmd_compat_lsmod,") "") + (("[&]kmod_cmd_compat_rmmod,") "") + (("[&]kmod_cmd_compat_insmod,") "") + (("[&]kmod_cmd_compat_modinfo,") "")) + #t)) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin"))) + (install-file "tools/kmod" bin) + (for-each + (lambda (tool) + (symlink "kmod" (string-append bin "/" tool))) + '("modprobe" "depmod")) + #t)))))))))) + (define-public eudev ;; The post-systemd fork, maintained by Gentoo. (package
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:34 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 06:48:34 2018 Received: from localhost ([127.0.0.1]:59478 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epunC-0003fU-6s for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:34 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:58676) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epunA-0003fG-5q for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:32 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 809413360249; Sun, 25 Feb 2018 12:48:30 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: 30604 <at> debbugs.gnu.org Subject: [PATCH 1/4] gnu: kmod: Split off kmod-minimal. Date: Sun, 25 Feb 2018 12:48:13 +0100 Message-Id: <20180225114816.869-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180225114557.816-1-dannym@HIDDEN> References: <20180225114557.816-1-dannym@HIDDEN> Tags: patch X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 30604 Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -0.7 (/) * gnu/packages/linux.scm (kmod-minimal): New variable. (kmod): Modify. --- gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 238398e84..1f8bf3050 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -1933,8 +1933,35 @@ for systems using the Linux kernel. This includes commands such as to use Linux' inotify mechanism, which allows file accesses to be monitored.") (license license:gpl2+))) -(define-public kmod +(define kmod-minimal (package + (name "kmod-minimal") + (version "13") + (source (origin + (method url-fetch) + (uri + (string-append "mirror://kernel.org/linux/utils/kernel/kmod/" + "kmod-" version ".tar.xz")) + (sha256 + (base32 + "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc")) + (patches (search-patches "kmod-13-module-directory.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f)) ; FIXME: Investigate test failures + (home-page "https://www.kernel.org/") + (synopsis "Kernel module tools") + (description "Kmod is a set of tools to handle common tasks with Linux +kernel modules like insert, remove, list, check properties, resolve +dependencies and aliases. + +These tools are designed on top of libkmod, a library that is shipped with +kmod. The aim is to be compatible with tools, configurations and indices +from the module-init-tools project.") + (license license:gpl2+))) ; library under lgpl2.1+ + +(define-public kmod + (package (inherit kmod-minimal) (name "kmod") (version "24") (source (origin @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (base32 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1")) (patches (search-patches "kmod-module-directory.patch")))) - (build-system gnu-build-system) (native-inputs `(("pkg-config" ,pkg-config))) (inputs `(("xz" ,xz) ("zlib" ,zlib))) (arguments - `(#:tests? #f ; FIXME: Investigate test failures - #:configure-flags '("--with-xz" "--with-zlib") + `(#:configure-flags '("--with-xz" "--with-zlib") + #:tests? #f ; FIXME: Investigate test failures #:phases (alist-cons-after 'install 'install-modprobe&co (lambda* (#:key outputs #:allow-other-keys) @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.") (symlink "kmod" (string-append bin "/" tool))) '("insmod" "rmmod" "lsmod" "modprobe" - "modinfo" "depmod")))) - %standard-phases))) - (home-page "https://www.kernel.org/") - (synopsis "Kernel module tools") - (description "Kmod is a set of tools to handle common tasks with Linux -kernel modules like insert, remove, list, check properties, resolve -dependencies and aliases. - -These tools are designed on top of libkmod, a library that is shipped with -kmod. The aim is to be compatible with tools, configurations and indices -from the module-init-tools project.") - (license license:gpl2+))) ; library under lgpl2.1+ + "modinfo" "depmod")) + #t)) + %standard-phases))))) (define-public eudev ;; The post-systemd fork, maintained by Gentoo.
guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.Received: (at submit) by debbugs.gnu.org; 25 Feb 2018 11:46:19 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun Feb 25 06:46:19 2018 Received: from localhost ([127.0.0.1]:59472 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1epul0-0003bY-Pu for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:18 -0500 Received: from eggs.gnu.org ([208.118.235.92]:34572) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <dannym@HIDDEN>) id 1epuky-0003bL-N7 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <dannym@HIDDEN>) id 1epuks-0005mv-Ge for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:11 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:44986) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <dannym@HIDDEN>) id 1epuks-0005mo-D4 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53771) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <dannym@HIDDEN>) id 1epukr-0000g8-A7 for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <dannym@HIDDEN>) id 1epuko-0005kt-6v for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:09 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:39928) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <dannym@HIDDEN>) id 1epukn-0005kZ-VY for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:06 -0500 Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com [77.118.165.54]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 5BFF33360249; Sun, 25 Feb 2018 12:46:04 +0100 (CET) From: Danny Milosavljevic <dannym@HIDDEN> To: guix-patches@HIDDEN Subject: [PATCH 0/4] Load Linux module only when supported hardware is present. Date: Sun, 25 Feb 2018 12:45:57 +0100 Message-Id: <20180225114557.816-1-dannym@HIDDEN> X-Mailer: git-send-email 2.15.1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit Cc: Danny Milosavljevic <dannym@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -5.0 (-----) Danny Milosavljevic (4): gnu: kmod: Split off kmod-minimal. gnu: Add kmod-minimal-static. linux-initrd: Add kmod. linux-boot: Load kernel modules only when the hardware is present. gnu/build/linux-boot.scm | 24 ++++++++++-- gnu/build/linux-initrd.scm | 13 ++++++- gnu/packages/linux.scm | 91 +++++++++++++++++++++++++++++++++++++-------- gnu/system/linux-initrd.scm | 52 ++++++++++++++++++++------ 4 files changed, 148 insertions(+), 32 deletions(-)
Danny Milosavljevic <dannym@HIDDEN>
:guix-patches@HIDDEN
.
Full text available.guix-patches@HIDDEN
:bug#30604
; Package guix-patches
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.