[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GuixSD bootable ISO-9669 image
From: |
Ludovic Courtès |
Subject: |
Re: GuixSD bootable ISO-9669 image |
Date: |
Tue, 02 May 2017 14:37:04 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) |
Hi!
I just tested your patch, Danny (last version attached): I took the
image at
<http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-8.7.1-amd64-netinst.iso>
and then did:
--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> ,m (gnu build file-systems)
scheme@(gnu build file-systems)> (define sb (read-iso9660-superblock
"/tmp/debian-8.7.1-amd64-netinst.iso.part"))
scheme@(gnu build file-systems)> (iso9660-superblock-volume-name sb)
$2 = "Debian 8.7.1 amd64 1"
scheme@(gnu build file-systems)> (iso9660-superblock-uuid sb)
$3 = #vu8(50 48 49 55 48 49 49 54 49 49 48 49 48 49 48 48 0)
scheme@(gnu build file-systems)> (bytevector-length $3)
$4 = 17
scheme@(gnu build file-systems)> (uuid->string $3)
$5 = "32303137-3031-3136-3131-303130313030"
--8<---------------cut here---------------end--------------->8---
Seems to work!
Could you clarify the two “See grub” in here:
--8<---------------cut here---------------start------------->8---
(define (iso9660-superblock-uuid sblock)
"Return the Volume ID of a iso9660 superblock SBLOCK as a 4-byte bytevector."
;; Note: The field is the volume creation time.
;; FIXME Use only certain parts (See grub).
;; FIXME treat "all 0" as invalid.
(sub-bytevector sblock 813 17))
;; FIXME make result human-readable (See grub).
;(define (iso9660-uuid->string uuid)
--8<---------------cut here---------------end--------------->8---
Should ‘iso9660-uuid->string’ be different from ‘uuid->string’?
Anyway, I think we should polish and commit real soon. :-) Perhaps we
can add a note about endianness and assume little endian for now.
Thank you Danny!
Ludo’.
diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm
index 0cb84b8aa..4c826830d 100644
--- a/gnu/build/file-systems.scm
+++ b/gnu/build/file-systems.scm
@@ -230,6 +230,55 @@ Trailing spaces are trimmed."
;;;
+;;; ISO9660 file systems.
+;;;
+
+;; <http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-119.pdf>.
+
+;(define-syntax %iso9660-endianness
+; ;; Endianness of iso9660 file systems that we use.
+; ;; Actually, iso9660 has redundant data (i.e. data for both endiannesses).
+; (identifier-syntax (endianness little)))
+
+(define (iso9660-superblock? sblock)
+ "Return #t when SBLOCK is a iso9660 superblock."
+ (bytevector=? (sub-bytevector sblock 1 6)
+ ;; Note: "\x01" is the volume descriptor format version
+ (string->utf8 "CD001\x01")))
+
+(define (read-iso9660-primary-volume-descriptor device offset)
+ "Find and read the first primary volume descriptor, starting at OFFSET.
+ Return #f if not found."
+ (let* ((sblock (read-superblock device offset 2048 iso9660-superblock?))
+ (type-code (if sblock (array-ref sblock 0) 255)))
+ (match type-code
+ (255 #f) ; Volume Descriptor Set Terminator.
+ (1 sblock) ; Primary Volume Descriptor
+ (_ (read-iso9660-primary-volume-descriptor device (+ offset 2048))))))
+
+(define (read-iso9660-superblock device)
+ "Return the raw contents of DEVICE's iso9660 superblock as a bytevector, or
+#f if DEVICE does not contain a iso9660 file system."
+ ;; Start reading at sector 16.
+ (read-iso9660-primary-volume-descriptor device (* 2048 16)))
+
+(define (iso9660-superblock-uuid sblock)
+ "Return the Volume ID of a iso9660 superblock SBLOCK as a 4-byte bytevector."
+ ;; Note: The field is the volume creation time.
+ ;; FIXME Use only certain parts (See grub).
+ ;; FIXME treat "all 0" as invalid.
+ (sub-bytevector sblock 813 17))
+
+;; FIXME make result human-readable (See grub).
+;(define (iso9660-uuid->string uuid)
+
+(define (iso9660-superblock-volume-name sblock)
+ "Return the volume name of SBLOCK as a string. The volume name is an ASCII
+string. Trailing spaces are trimmed."
+ (string-trim-right (latin1->string (sub-bytevector sblock 40 32) (lambda (c)
#f)) #\space))
+
+
+;;;
;;; LUKS encrypted devices.
;;;
@@ -340,7 +389,9 @@ partition field reader that returned a value."
(_ #f)))
(define %partition-label-readers
- (list (partition-field-reader read-ext2-superblock
+ (list (partition-field-reader read-iso9660-superblock
+ iso9660-superblock-volume-name)
+ (partition-field-reader read-ext2-superblock
ext2-superblock-volume-name)
(partition-field-reader read-btrfs-superblock
btrfs-superblock-volume-name)
@@ -348,7 +399,9 @@ partition field reader that returned a value."
fat32-superblock-volume-name)))
(define %partition-uuid-readers
- (list (partition-field-reader read-ext2-superblock
+ (list (partition-field-reader read-iso9660-superblock
+ iso9660-superblock-uuid)
+ (partition-field-reader read-ext2-superblock
ext2-superblock-uuid)
(partition-field-reader read-btrfs-superblock
btrfs-superblock-uuid)
- Re: GuixSD bootable ISO-9669 image,
Ludovic Courtès <=
- Re: GuixSD bootable ISO-9669 image, ng0, 2017/05/02
- Re: GuixSD bootable ISO-9669 image, Danny Milosavljevic, 2017/05/02
- Re: GuixSD bootable ISO-9669 image, Ludovic Courtès, 2017/05/02
- Re: GuixSD bootable ISO-9669 image, Danny Milosavljevic, 2017/05/07
- Re: GuixSD bootable ISO-9669 image, Ludovic Courtès, 2017/05/08
- Re: GuixSD bootable ISO-9669 image, Danny Milosavljevic, 2017/05/11
- Re: GuixSD bootable ISO-9669 image, Ludovic Courtès, 2017/05/12
- Re: GuixSD bootable ISO-9669 image, Danny Milosavljevic, 2017/05/14
- Re: GuixSD bootable ISO-9669 image, Ludovic Courtès, 2017/05/16