ஒத்துழையா HPC மேலாண்மையுடனும் Guix பயன்படுத்துவது—இறுதித் தீர்வு

ஒத்துழையா HPC மேலாண்மையுடனும் Guix பயன்படுத்துவது—இறுதித் தீர்வு

Published by Arun Isaac on

In other languages: English

Tags: guix, மென்பொருள்

சற்றும் ஒத்துழையா HPC மேலாண்மையுடனும் Guix பயன்படுத்த இறுதிக் கட்டத் தீர்வு.

HPC கொத்துக்கணினிகளில் Guix பெரும் பயனுடையது. ஆயினும் பல வேளை அவற்றில் Guix நிறுவ HPC மேலாண்மை ஒத்துழைப்பதில்லை. guix pack பெட்டகங்கள் /gnu/store தவிர்த்து வேறு பாதைகளில் செயல்படா. அதற்கே -R, -RR மூலம் அவற்றை வேலை செய்விக்க வெவ்வேறு நுட்பங்கள் இருக்கின்றன. அன்னுட்பங்கள் வேலை செய்யாவிடின் இறுதித் தீர்வொன்றிருக்கிறது—/gnu/store அல்லாது நமக்கு வேண்டிய பாதையில் செயல்படும் இரும நிரல்களை நாமே முதற்கண் உருவாக்கலாம்.

புதிய கிடங்கடைவும் நிலையடைவும் (store and state directories) உடைய guix-daemon

முதலில் HPC கொத்துக்கணினியில் நமக்கு வேண்டிய பாதையை (எடுத்துக்காட்டிற்கு /home/hpcuser) நமது சொந்த கணனியில் அமைக்க.

$ sudo mkdir /home/hpcuser

பின்னர் அப்பாதையை கிடங்காகப் பயன்படுத்தும் guix-daemon ஒன்றை உருவாக்குக. இதற்குக் கீழ்க்காணும் guix-daemon.scm கோப்பைப் பயன்படுத்துக. இதில் உங்களுக்கு வேண்டிய பாதையை %relocate-path மாறியில் இடுக.

(use-modules (gnu packages package-management)
             (guix gexp)
             (guix packages)
             (guix utils))

(define %relocate-path
  "/home/hpcuser")

(package
  (inherit guix)
  (arguments
   (substitute-keyword-arguments (package-arguments guix)
     ;; நேரத்தைச் சேமிக்க சோதனை தவிர்.
     ((#:tests? tests? #f)
      #f)
     ;; கிடங்கு அடைவும் (store directory) நிலை அடைவும் (state directory)
     ;; %relocate-path அகத்தே இருக்கும்படி அமை.
     ((#:configure-flags flags '())
      #~(cons #$(string-append "--with-store-dir=" %relocate-path "/store")
              (map (lambda (flag)
                     (if (string=? flag "--localstatedir=/var")
                         #$(string-append "--localstatedir=" %relocate-path "/var")
                         flag))
                   #$flags))))))

guix-daemon அமைத்து இயக்குக.

$ sudo $(guix build -f guix-daemon.scm)/bin/guix-daemon --build-users-group=guixbuild --listen=/tmp/guix-daemon-socket --no-substitutes

புதிய guix-daemon மூலம் வேண்டிய பெட்டகத்தை அமைக்க

அதன் பின் அந்த guix-daemon மூலம் நமக்கு வேண்டிய நிரல்தொகுப்புகளை உருவாக்கி அவற்றை guix pack (-R, -RR எதுவும் இன்றி) செய்க.

(use-modules ((gnu packages base) #:select (hello))
             (guix packages)
             (guix utils))

;; நேரத்தைச் சேமிக்க சோதனை தவிர்.
(define (package-without-tests p)
  (package/inherit p
    (arguments
     (substitute-keyword-arguments (package-arguments p)
       ((#:tests? _ #f) #f)))))

(packages->manifest
 (map (package-mapping package-without-tests)
      (list hello)))

இதை manifest.scm என்னும் கோப்பிலிட்டு guix pack பெட்டகம் அமைத்து மகிழ்க.

$ NIX_STORE_DIR=/home/hpcuser/store GUIX_DAEMON_SOCKET=/tmp/guix-daemon-socket guix pack -S /home/hpcuser/bin=bin -m manifest.scm

இப்பெட்டகம் நமது HPC கொத்துக்கணினியில் நாம் குறிப்பிட்ட பாதையில் மட்டும் செயல்படும்; இதுத் தவறவே தவறாது—எப்போதும் வேலை செய்யும்!

$ scp /home/hpcuser/store/…-guix-pack.tar.gz hpc:~
$ ssh hpc
[hpc]~$ tar --strip-components=3 xf …-guix-pack.tar.gz
[hpc]~$ ./bin/hello
Hello, world!

இன்னும் கொஞ்சம் நேரம் சேமிக்க!

மேற்கண்ட manifest.scm போதுமேயாயினும் இறுதி guix pack பெட்டகமைப்பில் இன்னும் நேரம் சேமிக்க கீழ்க்காணும்வாறு guix pack பெட்டகத்தை நாமே scheme நிரலில் அமைக்கலாம்.

(use-modules ((gnu compression) #:select (compressor))
             ((gnu packages base) #:select (hello tar))
             ((gnu packages compression) #:select (gzip))
             (guix gexp)
             (guix monads)
             (guix packages)
             (guix profiles)
             (guix scripts pack)
             (guix store)
             (guix utils))

(define %relocate-path
  "/home/hpcuser")

;; நேரத்தைச் சேமிக்க சோதனை தவிர்.
(define (package-without-tests p)
  (package/inherit p
    (arguments
     (substitute-keyword-arguments (package-arguments p)
       ((#:tests? _ #f) #f)))))

(define hpc-profile
  (profile
   (content (packages->manifest
             (map (package-mapping package-without-tests)
                  (list hello))))
   ;; நேரத்தைச் சேமிக்க hooks, locales? தவிர். இவை நமக்குத் தேவையில்லையென
   ;; நம்புவோம்.
   (hooks '())
   (locales? #f)
   (allow-collisions? #t)))

(with-store store
  (run-with-store store
    (with-monad %store-monad
      (>>= (self-contained-tarball "hpc-pack"
                                   hpc-profile
                                   #:compressor (compressor "gzip"  ".gz"
                                                            #~(list #+(file-append (package-without-tests gzip)
                                                                                   "/bin/gzip")
                                                                    "-9n"))
                                   #:symlinks `((,(string-append %relocate-path "/bin")
                                                 ->
                                                 "/bin"))
                                   #:archiver (package-without-tests tar))
           (lambda (drv)
             (return drv))))))

இதை hpc-pack.scm என்னும் கோப்பிலிட்டு கீழ்க்காணும்வாறு பெட்டகம் அமைக்க.

$ NIX_STORE_DIR=/home/hpcuser/store GUIX_DAEMON_SOCKET=/tmp/guix-daemon-socket guix build -f hpc-pack.scm

உலகத்தையே முதற்கண் படைக்காமல் இன்னொரு வழி

அனைத்து நிரல்தொகுப்புகளையும் முதற்கண் படைப்பது ஆக்கமும் நேரமும் வீண். இதிலிருந்துத் தப்ப இன்னொரு வழி உள்ளது—Guix மாற்றீடுகளைப் (substitutes) பதவிறக்கி அவற்றில் /gnu/store பாதையை மட்டும் நமக்கு வேண்டிய பாதையாக திருத்தியமைப்பது. இவ்வாறு இருமக்கோப்புகளைத் திருத்தல் எளிதல்ல, எல்லா வித இருமக்கோப்புகளிலும் உறுதியாக வேலைச் செய்யுமென்றும் கூற இயலாது. ஆனால் இதுவும் ஒரு வழி. இதைப் பற்றி பியோட்டர் விவரித்துள்ளார்.

நன்றி

இம்முறை Guix இலண்டன் சந்திப்பில் கிறிஷ்டோஃபர் பெயின்ஸ் அறிவுறுத்தியது. அவருக்கு நன்றி!