unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Tomáš Čech" <sleep_walker@gnu.org>
To: guix-devel@gnu.org
Subject: Re: LVM support
Date: Thu, 16 Apr 2015 08:24:01 +0200	[thread overview]
Message-ID: <20150416062401.GD6648@venom> (raw)
In-Reply-To: <878udt1sj5.fsf@gnu.org>

On Wed, Apr 15, 2015 at 02:32:14PM +0200, Ludovic Courtès wrote:
>Tomáš Čech <sleep_walker@gnu.org> skribis:
>
>> as project for my Hackweek in SUSE I decided to spend my time on LVM
>> support in GuixSD - something I miss greatly. This also means that
>> I'll have much less time for that after this week :(
>
>Well this is nice already!
>
>> So far I spent time on reviving my GuixSD installation and preparing
>> staticly linked binaries for initrd. I have now lvm2 package with
>> extra output "static".
>
>Don’t worry about static linking or anything: you can use any package,
>including dynamically-linked, and it will be magically added to the
>initrd if needed.
>
>Then as a second step, since that’ll probably be very big, you can work
>on statically-linked variants of the relevant packages (as done for
>‘e2fsck/static’.)

I did this already :)

>
>> Now the simplest way would be to simply call
>>
>> vgchange --activate y
>>
>> Matching configuration could be one configuration option:
>> (use-lvm?)
>>
>>
>> That would scan all block devices and look for LVM signature.
>>
>> Pros:
>> - it's super simple!
>> Cons:
>> - if LVM with filesystem required at boot-time is not found, error
>>  is not detected or returned by LVM itself
>>
>>
>>
>> Slightly bit more complicated way could be
>>
>> vgchange --activate y <volume_group_name>
>>
>> for every volume group defined in system configuration. Matching configuration could be
>> (logical-volume-groups '("system" "data"))
>>
>> e.g. specify list of volume group names used by system.
>>
>> Pros:
>> - still simple
>> - if group activation fails, I can detect it and report it to user
>>
>> Cons:
>> - some block devices with LVM may not be available at boot-time (like
>>  iSCSI devices accessible through network only or Luks devices
>>  available after entering password)
>>
>> That is my current approach.
>>
>>
>>
>> I could also specify whether it should be made available at boot time or not
>> (logical-volume-groups '('("system" #t)
>>                         '("data"   #f)))
>>
>> (sorry for my poor Scheme taste here :)
>>
>> Pros:
>> - with this I could say that volume group "system" should be activated
>>  at boot time, but "data" should be activated later.
>>
>> Cons:
>> - starting to be more complicated - I need both initrd stage LVM
>>  activation and root filesystem stage LVM activation (implemented as
>>  service? which dependencies it has?)
>
>Sorry I’m not really familiar with LVM.

It's implemented using device mapper but instead of mapping one block
device to another you map one block device to whole group (like
playground where you can do anything).


>
>Technically, if LVM volumes are mapped devices, the best would be to
>define a <mapped-device-kind> structure for them, as discussed on IRC
>(like ‘luks-device-mapping’ in (gnu system).)

I didn't like the idea first because it felt confusing and
unatural. Words like `mapping' and `source' and `target' are
misleading. But from programming POV it seems to be the easisest
approach in the end.

(define-record-type* <mapped-device> mapped-device
  make-mapped-device
  mapped-device?
  (source    mapped-device-source)                ;string
  (target    mapped-device-target)                ;string
  (type      mapped-device-type))                 ;<mapped-device-kind>
	  
`source' will be ignored (I not only don't need it but I don't even
know how to pass it or what it should do). `target' will be used for
volume group name. mapped-device-kind structure is easily applicable.


On the other hand problem starts with need-for-boot?. Device mapped
device will be activated during the boot (which is desirable for LVM)
only if there is filesystem which uses such device and has
`need-for-boot?' set to #t.

I needed to tweak operating-system-boot-mapped-devices to not filter
mappings of the new type at all. Now it seems to generate initrd
capable of booting root filesystem from LVM :)

The thing is that this design is not nice. I always admired Scheme's
power in expressing things naturally. mapped-device interface is for
mapping 1 block device to 1 block device which will contain 1
filesystem.


Design I'm thinking about would follow file-system structure. For
device property (I'm not sure if this is proper word in Scheme for
item of record type) to define functions like `partition' (disk,
number), `mapped-device' (source, target, type), `logical-volume' (group,
volume) and whatever would be needed further. You could then express
your mount in more powerful way like:

(partition "sda" 1)

(mapped-device
  (partition "sda" 2)
  "encrypted_swap"
  luks-mapping-type)

(logical-volume
  "system_group"
  "root")


(mapped-device
  (logical-volume "some_group" "some_volume")
  "encrypted data"
  luks-mapping-type)

etc.


Of course, it would lead to more complicated code to handle such
configuration, but it would definitely feel more natural.

When other block device type (like iSCSI) would be required, just
another function (or whatever it is) would be implemented.

Please don't tell me 'this is not how Guix works' :)

Best regards,

S_W

  reply	other threads:[~2015-04-16  6:24 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-15  5:07 LVM support Tomáš Čech
2015-04-15 12:32 ` Ludovic Courtès
2015-04-16  6:24   ` Tomáš Čech [this message]
2015-04-16 12:47     ` Ludovic Courtès
2015-04-17  1:09       ` Tomáš Čech
2015-04-21 15:52         ` Ludovic Courtès
2015-05-01 11:32           ` Tomáš Čech
2015-05-03 19:59             ` Ludovic Courtès
2015-05-07  8:02               ` Tomáš Čech
2015-05-19 10:32                 ` Ludovic Courtès
  -- strict thread matches above, loose matches on Subject: below --
2018-07-29 15:18 Roadmap for Guix 1.0 Ludovic Courtès
2018-07-30  1:23 ` Pjotr Prins
2018-07-30  9:02   ` Nils Gillmann
2018-07-30 12:47     ` Pierre Neidhardt
2018-08-19 11:06       ` LVM support Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150416062401.GD6648@venom \
    --to=sleep_walker@gnu.org \
    --cc=guix-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).