(define-module (gn services file-systems) #:use-module (guix gexp) #:use-module (guix records) #:use-module (gnu services) #:use-module (gnu services shepherd) #:use-module (gnu system accounts) #:use-module (gnu system shadow) #:use-module (gnu packages admin) #:use-module (gnu packages linux) #:use-module (gn packages file-systems) #:use-module (ice-9 match) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:export (lizardfs-configuration lizardfs-configuration? lizardfs-service-type lizardfs-mfschunkserver-config-file lizardfs-mfschunkserver-config-file? lizardfs-mfshdd-config-file lizardfs-mfshdd-config-file? lizardfs-mfsmaster-config-file lizardfs-mfsmaster-config-file? lizardfs-mfsmetalogger-config-file lizardfs-mfsmetalogger-config-file?)) (define %lizardfs-accounts (list (user-group (name "lizardfs") (system? #t)) (user-account (name "lizardfs") (group "lizardfs") (system? #t) (comment "Lizardfs User") (home-directory "/var/lib/lizardfs") (shell (file-append shadow "/sbin/nologin"))))) (define-record-type* <lizardfs-mfsmetalogger-config-file> lizardfs-mfsmetalogger-config-file make-lizardfs-mfsmetalogger-config-file lizardfs-mfsmetalogger-config-file? (working-user lizardfs-mfsmetalogger-config-file-working-user (default "lizardfs")) (working-group lizardfs-mfsmetalogger-config-file-working-group (default "lizardfs")) (syslog-identifier lizardfs-mfsmetalogger-config-file-syslog-identifier (default "mfsmetalogger")) (lock-memory lizardfs-mfsmetalogger-config-file-lock-memory (default #f)) ; 0 or 1 (nice-level lizardfs-mfsmetalogger-config-file-nice-level (default -19)) (data-path lizardfs-mfsmetalogger-config-file-data-path (default "/var/lib/lizardfs")) (back-logs lizardfs-mfsmetalogger-config-file-back-logs (default 50)) (back-meta-keep-previous lizardfs-mfsmetalogger-config-file-back-meta-keep-previous (default 3)) (meta-download-frequency lizardfs-mfsmetalogger-config-file-meta-download-frequency (default 24)) (master-reconnection-delay lizardfs-mfsmetalogger-config-file-master-reconnection-delay (default 5)) (master-host lizardfs-mfsmetalogger-config-file-master-host (default "mfsmaster")) (master-port lizardfs-mfsmetalogger-config-file-master-port (default 9419)) (master-timeout lizardfs-mfsmetalogger-config-file-master-timeout (default 60))) (define-gexp-compiler (lizardfs-mfsmetalogger-config-file-compiler (file <lizardfs-mfsmetalogger-config-file>) system target) (match file (($ <lizardfs-mfsmetalogger-config-file> working-user working-group syslog-identifier lock-memory nice-level data-path back-logs back-meta-keep-previous meta-download-frequency master-reconnection-delay master-host master-port master-timeout) (gexp->derivation "mfsmetalogger.cfg" #~(call-with-output-file #$output (lambda (port) (display (string-append "# This file generated by GNU Guix\n\n" (ungexp-splicing `(,@`("WORKING_USER = " ,working-user "\n") ,@`("WORKING_GROUP = " ,working-group "\n") ,@`("SYSLOG_IDENT = " ,syslog-identifier "\n") ,@(if lock-memory `("LOCK_MEMORY = 1\n") `("LOCK_MEMORY = 0\n")) ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n") ,@`("DATA_PATH = " ,data-path "\n") ,@`("BACK_LOGS = " ,(number->string back-logs) "\n") ,@`("BACK_META_KEEP_PREVIOUS = " ,(number->string back-meta-keep-previous) "\n") ,@`("META_DOWNLOAD_FREQ = " ,(number->string meta-download-frequency) "\n") ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n") ,@`("MASTER_HOST = " ,master-host "\n") ,@`("MASTER_PORT = " ,(number->string master-port) "\n") ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n")))) port))) #:local-build? #t)))) (define-record-type* <lizardfs-mfschunkserver-config-file> lizardfs-mfschunkserver-config-file make-lizardfs-mfschunkserver-config-file lizardfs-mfschunkserver-config-file? (label lizardfs-mfschunkserver-label (default "_")) (working-user lizardfs-mfschunkserver-config-file-working-user (default "lizardfs")) (working-group lizardfs-mfschunkserver-config-file-working-group (default "lizardfs")) (syslog-identifier lizardfs-mfschunkserver-config-file-syslog-identifier (default "mfschunkserver")) (lock-memory lizardfs-mfschunkserver-config-file-lock-memory (default #f)) ; 0 or 1 (nice-level lizardfs-mfschunkserver-config-file-nice-level (default -19)) (data-path lizardfs-mfschunkserver-config-file-data-path (default "/var/lib/lizardfs")) (master-reconnection-delay lizardfs-mfschunkserver-config-file-master-reconnection-delay (default 5)) (bind-host lizardfs-mfschunkserver-bind-host (default "*")) (master-host lizardfs-mfschunkserver-config-file-master-host (default "mfsmaster")) (master-port lizardfs-mfschunkserver-config-file-master-port (default 9420)) (master-timeout lizardfs-mfschunkserver-config-file-master-timeout (default 60)) (csserv-listen-host lizardfs-mfschunkserver-config-csserv-listen-host (default "*")) (csserv-listen-port lizardfs-mfschunkserver-config-csserv-listen-port (default 9422)) (hdd-conf-filename lizardfs-mfschunkserver-config-hdd-conf-filename (default "/etc/lizardfs/mfshdd.cfg")) ; This should be our generated one (hdd-leave-space-default lizardfs-mfschunkserver-config-hdd-leave-space-default (default "4GiB")) (hdd-test-freq lizardfs-mfschunkserver-config-hdd-test-freq (default 10)) (hdd-advise-no-cache lizardfs-mfschunkserver-config-hdd-advise-no-cache (default #t)) ; 0 or 1 (hdd-punch-holes lizardfs-mfschunkserver-config-hdd-punch-holes (default #t)) ; 0 or 1 (enable-load-factor lizardfrs-mfschunkserver-config-enable-load-factor (default #f)) ; 0 or 1 (replication-bandwidth-limit-kbps lizardfs-mfschunkserver-config-replication-bandwidth-limit-kbps (default 8192)) (nr-of-network-workers lizardfs-mfschunkserver-config-nr-of-network-workers (default 1)) (nr-of-hdd-workers-per-network-worker lizardfs-mfschunkerver-config-nr-of-hdd-workers-per-network-pworker (default 20)) (read-ahead-kb lizardfs-mfschunkserver-config-read-ahead-kb (default 0)) (max-read-behind-kb lizardfs-mfschunkserver-config-max-read-behind-kb (default 0)) (create-new-chunks-in-moosefs-format lizardfs-mfschunkserver-config-crate-new-chunks-in-moosefs-format (default #t)) ; 0 or 1 (perform-fsync lizardfs-mfschunkserver-config-perform-fsync (default #t)) ; 0 or 1 ) (define-gexp-compiler (lizardfs-mfschunkserver-config-file-compiler (file <lizardfs-mfschunkserver-config-file>) system target) (match file (($ <lizardfs-mfschunkserver-config-file> label working-user working-group syslog-identifier lock-memory nice-level data-path master-reconnection-delay bind-host master-host master-port master-timeout csserv-listen-host csserv-listen-port hdd-conf-filename hdd-leave-space-default hdd-test-freq hdd-advise-no-cache hdd-punch-holes enable-load-factor replication-bandwidth-limit-kbps nr-of-network-workers nr-of-hdd-workers-per-network-worker read-ahead-kb max-read-behind-kb create-new-chunks-in-moosefs-format perform-fsync) (gexp->derivation "mfschunkserver.cfg" #~(call-with-output-file #$output (lambda (port) (display (string-append "# This file generated by GNU Guix\n\n" (ungexp-splicing `(,@`("LABEL = " ,label "\n") ,@`("WORKING_USER = " ,working-user "\n") ,@`("WORKING_GROUP = " ,working-group "\n") ,@`("SYSLOG_IDENT = " ,syslog-identifier "\n") ,@(if lock-memory `("LOCK_MEMORY = 1\n") `("LOCK_MEMORY = 0\n")) ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n") ,@`("DATA_PATH = " ,data-path "\n") ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n") ,@`("MASTER_HOST = " ,master-host "\n") ,@`("MASTER_PORT = " ,(number->string master-port) "\n") ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n") ,@`("CSSERV_LISTEN_HOST = " ,csserv-listen-host "\n") ,@`("CSSERV_LISTEN_PORT = " ,(number->string csserv-listen-port) "\n") ,@`("HDD_CONF_FILENAME = " ,hdd-conf-filename "\n") ,@`("HDD_LEAVE_SPACE_DEFAULT = " ,hdd-leave-space-default "\n") ,@`("HDD_TEST_FREQ = " ,(number->string hdd-test-freq) "\n") ,@(if hdd-advise-no-cache `("HDD_ADVISE_NO_CACHE = 1\n") `("HDD_ADVISE_NO_CACHE = 0\n")) ,@(if hdd-punch-holes `("HDD_PUNCH_HOLES = 1\n") `("HDD_PUNCH_HOLES = 0\n")) ,@(if enable-load-factor `("ENABLE_LOAD_FACTOR = 1\n") `("ENABLE_LOAD_FACTOR = 0\n")) ,@`("REPLICATION_BANDWIDTH_LIMIT_KBPS = " ,(number->string replication-bandwidth-limit-kbps) "\n") ,@`("NR_OF_NETWORK_WORKERS = " ,(number->string nr-of-network-workers) "\n") ,@`("NR_OF_HDD_WORKERS_PER_NETWORK_WORKER = " ,(number->string nr-of-hdd-workers-per-network-worker) "\n") ,@`("READ_AHEAD_KB = " ,(number->string read-ahead-kb) "\n") ,@`("MAX_READ_BEHIND_KB = " ,(number->string max-read-behind-kb) "\n") ,@(if create-new-chunks-in-moosefs-format `("CREATE_NEW_CHUNKS_IN_MOOSEFS_FORMAT = 1\n") `("CREATE_NEW_CHUNKS_IN_MOOSEFS_FORMAT = 0\n")) ,@(if perform-fsync `("PERFORM_FSYNC = 1\n") `("PERFORM_FSYNC = 0\n"))))) port))) #:local-build? #t)))) (define-record-type* <lizardfs-mfshdd-config-file> lizardfs-mfshdd-config-file make-lizardfs-mfshdd-config-file lizardfs-mfshdd-config-file? (disks-to-use lizardfs-mfshdd-config-file-disks-to-use (default '())) (disks-to-remove lizardfs-mfshdd-config-file-disks-to-remove (default '()))) (define-gexp-compiler (lizardfs-mfshdd-config-file-compiler (file <lizardfs-mfshdd-config-file>) system target) (match file (($ <lizardfs-mfshdd-config-file> disks-to-use disks-to-remove) (gexp->derivation "mfshdd.cfg" #~(call-with-output-file #$output (lambda (port) (display (string-append "# This file generated by GNU Guix\n\n" (ungexp-splicing `(,@(append-map (lambda (disk) `(,disk "\n")) disks-to-use) ,@(append-map (lambda (disk) `("*" ,disk "\n")) disks-to-remove)))) port))) #:local-build? #t)))) (define-record-type* <lizardfs-mfsmaster-config-file> lizardfs-mfsmaster-config-file make-lizardfs-mfsmaster-config-file lizardfs-mfsmaster-config-file? (personality lizardsf-mfsmaster-config-personality (default "")) (admin-password lizardfs-mfsmaster-config-admin-password (default "")) (working-user lizardfs-mfsmaster-config-working-user (default "lizardfs")) (working-group lizardfs-mfsmaster-config-working-group (default "lizardfs")) (syslog-ident lizardfs-mfsmaster-config-syslog-ident (default "mfsmaster")) (lock-memory lizardfs-mfsmaster-config-lock-memory (default #f)) ; 0 or 1 (nice-level lizardfs-mfsmaster-config-nice-level (default -19)) (exports-filename lizardfs-mfsmaster-config-exports-filename (default "/etc/lizardfs/mfsexports.cfg")) ; our created one? (topology-filename lizardfs-mfsmaster-config-topology-filename (default "/etc/lizardfs/mfstopology.cfg")) ; our created one? (custom-goals-filename lizardfs-mfsmaster-config-custom-goals-filename (default "/etc/lizardfs/mfsgoals.cfg")) ; our created one? (data-path lizardfs-mfsmaster-config-data-path (default "/var/lib/lizardfs")) (prefer-local-chunkserver lizardfs-mfsmaster-prefer-local-chunkserver (default #t)) ; 0 or 1 (auto-recovery lizardfs-mfsmaster-config-auto-recovery (default #f)) ; 0 or 1 (back-logs lizardfs-mfsmaster-config-back-logs (default 50)) (back-meta-keep-previous lizardfs-mfsmaster-config-back-meta-keep-previous (default 1)) (operations-delay-init lizardfs-mfsmaster-config-operations-delay-init (default 300)) (operations-delay-disconnect lizardfs-mfsmaster-config-operations-delay-disconnect (default 3600)) (matoml-listen-host lizardfs-mfsmaster-config-matoml-listen-host (default "*")) (matoml-listen-port lizardfs-mfsmaster-config-matoml-listen-port (default 9419)) (matoml-log-preserve-seconds lizardfs-mfsmaster-config-matoml-log-preserve-seconds (default 600)) (matocs-listen-host lizardfs-mfsmaster-config-matocs-listen-host (default "*")) (matocs-listen-port lizardfs-mfsmaster-config-matocs-listen-port (default 9420)) (matocl-listen-host lizardfs-mfsmaster-config-matocl-listen-host (default "*")) (matocl-listen-port lizardfs-mfsmaster-config-matocl-listen-port (default 9421)) (matots-listen-host lizardfs-mfsmaster-config-matots-listen-host (default "*")) (matots-listen-port lizardfs-mfsmaster-config-matots-listen-port (default 9424)) (chunks-loop-max-cps lizardfs-mfsmaster-config-chunks-loop-max-cps (default 100000)) (chunks-loop-min-time lizardfs-mfsmaster-config-chunks-loop-min-time (default 300)) (chunks-loop-peroid lizardfs-mfsmaster-config-chunks-loop-period (default 1000)) (chunks-loop-max-cpu lizardfs-mfsmaster-config-chunks-loop-max-cpu (default 60)) (chunks-soft-del-limit lizardfs-mfsmaster-config-chunks-soft-del-limit (default 10)) (chunks-hard-del-limit lizardfs-mfsmaster-config-chunks-hard-del-limit (default 25)) (chunks-write-rep-limit lizardfs-mfsmaster-config-chunks-write-rep-limit (default 2)) (chunks-read-rep-limit lizardfs-mfsmaster-config-chunks-read-rep-limit (default 10)) (endangered-chunks-priority lizardfs-mfsmaster-config-endangered-chunks-priority (default 0)) (endangered-chunks-max-capacity lizardfs-mfsmaster-config-endangered-chunks-max-capacity (default "1Mi")) (acceptable-difference lizardfs-mfsmaster-config-acceptable-difference (default 0.1)) (chunks-rebalancing-between-labels lizardfs-mfsmaster-config-chunks-rebalancing-between-labels (default 0)) (free-inodes-period lizardfs-mfsmaster-config-free-inodes-period (default 60)) (no-atime lizardfs-mfsmaster-config-no-atime (default #f)) ; 0 or 1 (session-sustain-time lizardfs-mfsmaster-config-session-sustain-time (default 86400)) (reject-old-client lizardfs-mfsmaster-config-reject-old-clients (default #f)) ; 0 or 1 (globaliolimits-filename lizardfs-mfsmaster-config-globaliolimits-filename (default "/etc/lizardfs/globaliolimits.cfg")) ; our generated one? (globaliolimits-renegotiation-period-settings lizardfs-mfsmaster-config-globaliolmits-renegotiation-period-settings (default 0.1)) (globaliolimits-accumulate-ms lizardfs-mfsmaster-config-globaliolimits-accumulate-ms (default 250)) (mfsmetarestore-path lizardfs-mfsmaster-config-mfsmeaterestore-path (default (file-append lizardfs "/sbin/mfsmetarestore"))) (master-reconnection-delay lizardfs-mfsmaster-config-master-reconnection-delay (default 5)) (master-host lizardfs-mfsmaster-config-master-host (default "mfsmaster")) (master-port lizardfs-mfsmaster-config-master-port (default 9419)) (master-timeout lizardfs-mfsmaster-config-master-timeout (default 60)) (metadata-checksum-interval lizardfs-mfsmaster-config-metadata-checksum-interval (default 50)) (metadata-checksum-recalculation-speed lizardfs-mfsmaster-config-metadata-recalculation-speed (default 100)) (disable-metadata-checksum-verification lizardfs-mfsmaster-config-disable-metadata-checksum-verification (default #f)) ; 0 or 1 (metadata-save-request-min-period lizardfs-mfsmaster-config-metadata-save-request-min-period (default 1800)) (use-bdb-for-name-storage lizardfs-mfsmaster-config-use-bdb-for-name-storage (default #t)) ; 0 or 1 (bdb-name-storage-cache lizardfs-mfsmaster-config-bdb-name-storage-cache (default 10)) (avoid-same-ip-chunkservers lizardfs-mfsmaster-config-avoid-same-ip-chunkservers (default #f)) ; 0 or 1 (load-factor-penalty lizardfs-mfsmaster-config-load-factor-penalty (default 0)) ; between 0, 0.5, inclusive (redundancy-level lizardfs-mfsmaster-config-redundancy-level (default 0)) (snapshot-initial-batch-size-limit lizardfs-mfsmaster-config-snapshot-initial-batch-size-limit (default 10000)) (file-test-loop-min-time lizardfs-mfsmaster-config-file-test-loop-min-time (default 3600))) (define-gexp-compiler (lizardfs-mfsmaster-config-file-compiler (file <lizardfs-mfsmaster-config-file>) system target) (match file (($ <lizardfs-mfsmaster-config-file> personality admin-password working-user working-group syslog-ident lock-memory nice-level exports-filename topology-filename custom-goals-filename data-path prefer-local-chunkserver auto-recovery back-logs back-meta-keep-previous operations-delay-init operations-delay-disconnect matoml-listen-host matoml-listen-port matoml-log-preserve-seconds matocs-listen-host matocs-listen-port matocl-listen-host matocl-listen-port matots-listen-host matots-listen-port chunks-loop-max-cps chunks-loop-min-time chunks-loop-period chunks-loop-max-cpu chunks-soft-del-limit chunks-hard-del-limit chunks-write-rep-limit chunks-read-rep-limit endangered-chunks-priority endangered-chunks-max-capacity acceptable-difference chunks-rebalancing-between-labels free-inodes-period no-atime session-sustain-time reject-old-client globaliolimits-filename globaliolimits-renegotiation-period-settings globaliolimits-accumulate-ms mfsmetarestore-path master-reconnection-delay master-host master-port master-timeout metadata-checksum-interval metadata-checksum-recalculation-speed disable-metadata-checksum-verification metadata-save-request-min-period use-bdb-for-name-storage bdb-name-storage-cache avoid-same-ip-chunkservers load-factor-penalty redundancy-level snapshot-initial-batch-size-limit file-test-loop-min-time) (gexp->derivation "mfsmaster.cfg" #~(call-with-output-file #$output (lambda (port) (display (string-append "# This file generated by GNU Guix\n\n" (ungexp-splicing `(,@`("PERSONALITY = " ,personality "\n") ,@`("ADMIN_PASSWORD = \"" ,admin-password "\"\n") ,@`("WORKING_USER = " ,working-user "\n") ,@`("WORKING_GROUP = " ,working-group "\n") ,@`("SYSLOG_IDENT = " ,syslog-ident "\n") ,@(if lock-memory `("LOCK_MEMORY = 1\n") `("LOCK_MEMORY = 0\n")) ,@`("NICE_LEVEL = " ,(number->string nice-level) "\n") ,@`("EXPORTS_FILENAME = " ,exports-filename "\n") ,@`("TOPOLOGY_FILENAME = " ,topology-filename "\n") ,@`("CUSTOM_GOALS_FILENAME = " ,custom-goals-filename "\n") ,@`("DATA_PATH = " ,data-path "\n") ,@(if prefer-local-chunkserver `("PREFER_LOCAL_CHUNKSERVER = 1\n") `("PREFER_LOCAL_CHUNKSERVER = 0\n")) ,@(if auto-recovery `("AUTO_RECOVERY = 1\n") `("AUTO_RECOVERY = 0\n")) ,@`("BACK_LOGS = " ,(number->string back-logs) "\n") ,@`("BACK_META_KEEP_PREVIOUS = " ,(number->string back-meta-keep-previous) "\n") ,@`("OPERATIONS_DELAY_INIT = " ,(number->string operations-delay-init) "\n") ,@`("OPERATIONS_DELAY_DISCONNECT = " ,(number->string operations-delay-disconnect) "\n") ,@`("MATOML_LISTEN_HOST = " ,matoml-listen-host "\n") ,@`("MATOML_LISTEN_PORT = " ,(number->string matoml-listen-port) "\n") ,@`("MATOML_LOG_PRESERVE_SECONDS = " ,(number->string matoml-log-preserve-seconds) "\n") ,@`("MATOCS_LISTEN_HOST = " ,matocs-listen-host "\n") ,@`("MATOCS_LISTEN_PORT = " ,(number->string matocs-listen-port) "\n") ,@`("MATOCL_LISTEN_HOST = " ,matocl-listen-host "\n") ,@`("MATOCL_LISTEN_PORT = " ,(number->string matocl-listen-port) "\n") ,@`("MATOTS_LISTEN_HOST = " ,matots-listen-host "\n") ,@`("MATOTS_LISTEN_PORT = " ,(number->string matots-listen-port) "\n") ,@`("CHUNKS_LOOP_MAX_CPS = " ,(number->string chunks-loop-max-cps) "\n") ,@`("CHUNKS_LOOP_MIN_TIME = " ,(number->string chunks-loop-min-time) "\n") ,@`("CHUNKS_LOOP_PERIOD = " ,(number->string chunks-loop-period) "\n") ,@`("CHUNKS_LOOP_MAX_CPU = " ,(number->string chunks-loop-max-cpu) "\n") ,@`("CHUNKS_SOFT_DEL_LIMIT = " ,(number->string chunks-soft-del-limit) "\n") ,@`("CHUNKS_HARD_DEL_LIMIT = " ,(number->string chunks-hard-del-limit) "\n") ,@`("CHUNKS_WRITE_REP_LIMIT = " ,(number->string chunks-write-rep-limit) "\n") ,@`("CHUNKS_READ_REP_LIMIT = " ,(number->string chunks-read-rep-limit) "\n") ,@`("ENDANGERED_CHUNKS_PRIORITY = " ,(number->string endangered-chunks-priority) "\n") ,@`("ENDANGERED_CHUNKS_MAX_CAPACITY = " ,endangered-chunks-max-capacity "\n") ,@`("ACCEPTABLE_DIFFERENCE = " ,(number->string acceptable-difference) "\n") ,@`("CHUNKS_REBALANCING_BETWEEN_LABELS = " ,(number->string chunks-rebalancing-between-labels) "\n") ,@`("FREE_INODES_PERIOD = " ,(number->string free-inodes-period) "\n") ,@(if no-atime `("NO_ATIME = 1\n") `("NO_ATIME = 0\n")) ,@`("SESSION_SUSTAIN_TIME = " ,(number->string session-sustain-time) "\n") ,@(if reject-old-client `("REJECT_OLD_CLIENT = 1\n") `("REJECT_OLD_CLIENT = 0\n")) ,@`("GLOBALIOLIMITS_FILENAME = " ,globaliolimits-filename "\n") ,@`("GLOBALIOLIMITS_RENEGOTIATION_PERIOD_SETTINGS = " ,(number->string globaliolimits-renegotiation-period-settings) "\n") ,@`("GLOBALIOLIMITS_ACCUMULATE_MS = " ,(number->string globaliolimits-accumulate-ms) "\n") ,@`("MFSMETARESTORE_PATH = " ,mfsmetarestore-path "\n") ,@`("MASTER_RECONNECTION_DELAY = " ,(number->string master-reconnection-delay) "\n") ,@`("MASTER_HOST = " ,master-host "\n") ,@`("MASTER_PORT = " ,(number->string master-port) "\n") ,@`("MASTER_TIMEOUT = " ,(number->string master-timeout) "\n") ,@`("METADATA_CHECKSUM_INTERVAL = " ,(number->string metadata-checksum-interval) "\n") ,@`("METADATA_CHECKSUM_RECALCULATION_SPEED = " ,(number->string metadata-checksum-recalculation-speed) "\n") ,@(if disable-metadata-checksum-verification `("DISABLE_METADATA_CHECKSUM_VERIFICATION = 1\n") `("DISABLE_METADATA_CHECKSUM_VERIFICATION = 0\n")) ,@`("METADATA_SAVE_REQUEST_MIN_PERIOD = " ,(number->string metadata-save-request-min-period) "\n") ,@(if use-bdb-for-name-storage `("USE_BDB_FOR_NAME_STORAGE = 1\n") `("USE_BDB_FOR_NAME_STORAGE = 0\n")) ,@`("BDB_NAME_STORAGE_CACHE = " ,(number->string bdb-name-storage-cache) "\n") ,@(if avoid-same-ip-chunkservers `("AVOID_SAME_IP_CHUNKSERVERS = 1\n") `("AVOID_SAME_IP_CHUNKSERVERS = 0\n")) ,@`("LOAD_FACTOR_PENALTY = " ,(number->string load-factor-penalty) "\n") ,@`("REDUNDANCY_LEVEL = " ,(number->string redundancy-level) "\n") ,@`("SNAPSHOT_INITIAL_BATCH_SIZE_LIMIT = " ,(number->string snapshot-initial-batch-size-limit) "\n") ,@`("FILE_TEST_LOOP_MIN_TIME = " ,(number->string file-test-loop-min-time) "\n")))) port))) #:local-build? #t)))) (define-record-type* <lizardfs-configuration> lizardfs-configuration make-lizardfs-configuration lizardfs-configuration? (package lizardfs-configuration-package (default lizardfs)) (mfsmetalogger-config lizardfs-configuration-mfsmetalogger-config (default (lizardfs-mfsmetalogger-config-file))) (mfschunkserver-config lizardfs-configuration-mfschunkserver-config (default (lizardfs-mfschunkserver-config-file))) (mfshdd-config lizardfs-configuration-mfshdd-config (default (lizardfs-mfshdd-config-file))) (mfsmaster-config lizardfs-configuration-mfsmaster-config (default (lizardfs-mfsmaster-config-file))) (run-mfsmetalogger-service? lizardfs-configuration-run-mfsmetalogger-service (default #f)) (mfsgoals-config lizardfs-configuration-mfsgoals-config (default (plain-file "mfsgoals.cfg" (string-append "1 1_copy : _\n" "2 2_copies : _ _\n" "3 3_copies : _ _ _\n")))) (mfsmount-config lizardfs-configuration-mfsmount-config (default (plain-file "mfsmount.cfg" ""))) (mfsexports-config lizardfs-configuration-mfsexports-config (default (plain-file "mfsexports.cfg" ""))) (mfstopology-config lizardfs-configuration-mfstopology-config (default (plain-file "mfstopology.cfg" ""))) (globaliolimits-config lizardfs-configuration-globaliolimits-config (default (plain-file "globaliolimits.cfg" ""))) (iolimits-config lizardfs-configuration-iolimits-config (default (plain-file "iolimits.cfg" "")))) (define lizardfs-shepherd-service (match-lambda (($ <lizardfs-configuration> package) (list (shepherd-service (documentation "Lizardfs mfsmaster server") (provision '(lizardfs)) (requirement '(loopback)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/mfsmaster") "-c" "/etc/lizardfs/mfsmaster.cfg" "-d" "start") #:log-file "/var/log/mfsmaster.log")) (stop #~(make-system-destructor #$(file-append package "/sbin/mfsmaster") " -c /etc/lizardfs/mfsmaster.cfg" " stop")) (respawn? #f) (auto-start? #f) ))))) (define lizardfs-mfsmetalogger-shepherd-service (match-lambda (($ <lizardfs-configuration> package) (list (shepherd-service (documentation "Lizardfs mfsmetalogger server") (provision '(lizardfs-mfsmetalogger)) (requirement '(loopback lizardfs)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/mfsmetalogger") "-c" "/etc/lizardfs/mfsmetalogger.cfg" "-d" "start") #:log-file "/var/log/mfsmetalogger.log")) (stop #~(make-system-destructor #$(file-append package "/sbin/mfsmetalogger") " -c /etc/lizardfs/mfsmetalogger.cfg" " stop")) (auto-start? #f) ))))) (define lizardfs-mfschunkserver-shepherd-service (match-lambda (($ <lizardfs-configuration> package) (list (shepherd-service (documentation "Lizardfs mfschunkserver server") (provision '(lizardfs-mfschunkserver)) (requirement '(loopback lizardfs)) (start #~(make-forkexec-constructor (list #$(file-append package "/sbin/mfschunkserver") "-c" "/etc/lizardfs/mfschunkserver.cfg" "-d" "start") #:log-file "/var/log/mfschunkserver.log")) (stop #~(make-system-destructor #$(file-append package "/sbin/mfschunkserver") " -c /etc/lizardfs/mfschunkserver.cfg" " stop")) (auto-start? #f) ))))) (define lizardfs-mfsmount-shepherd-service (match-lambda (($ <lizardfs-configuration> package) (list (shepherd-service (documentation "Mount Lizardfs filesystems") (provision '(lizardfs-mounts)) (requirement '(loopback)) (start #~(make-forkexec-constructor (list #$(file-append package "/bin/mfsmount") ;#$mountpoint "-o" "mfsdelayedinit") )) ;(stop #~(make-system-destructor #$(file-append fuse "/bin/fusermount") " -u " #$mountpoint)) (stop #~(make-kill-destructor)) (auto-start? #f) ))))) (define (lizardfs-etc-service config) `(("lizardfs/globaliolimits.cfg" ,(lizardfs-configuration-globaliolimits-config config)) ("lizardfs/iolimits.cfg" ,(lizardfs-configuration-iolimits-config config)) ("lizardfs/mfschunkserver.cfg" ,(lizardfs-configuration-mfschunkserver-config config)) ("lizardfs/mfsexports.cfg" ,(lizardfs-configuration-mfsexports-config config)) ("lizardfs/mfsgoals.cfg" ,(lizardfs-configuration-mfsgoals-config config)) ("lizardfs/mfshdd.cfg" ,(lizardfs-configuration-mfshdd-config config)) ("lizardfs/mfsmaster.cfg" ,(lizardfs-configuration-mfsmaster-config config)) ("lizardfs/mfsmetalogger.cfg" ,(lizardfs-configuration-mfsmetalogger-config config)) ("lizardfs/mfsmount.cfg" ,(lizardfs-configuration-mfsmount-config config)) ("lizardfs/mfstopology.cfg" ,(lizardfs-configuration-mfstopology-config config)))) (define (lizardfs-activation config) #~(begin (unless (and (file-exists? "/var/lib/lizardfs/metadata.mfs") (lizardfs-configuration-run-mfsmetalogger-service config)) ;; First run "service". (with-output-to-file "/var/lib/lizardfs/metadata.mfs" (lambda () (format #t "MFSM NEW")))) #$(plain-file? (lizardfs-configuration-globaliolimits-config config)) #$(plain-file? (lizardfs-configuration-iolimits-config config)) #$(plain-file? (lizardfs-configuration-mfschunkserver-config config)) #$(plain-file? (lizardfs-configuration-mfsexports-config config)) #$(plain-file? (lizardfs-configuration-mfsgoals-config config)) #$(plain-file? (lizardfs-configuration-mfshdd-config config)) #$(plain-file? (lizardfs-configuration-mfsmaster-config config)) #$(plain-file? (lizardfs-configuration-mfsmetalogger-config config)) #$(plain-file? (lizardfs-configuration-mfsmount-config config)) #$(plain-file? (lizardfs-configuration-mfstopology-config config)) #t)) (define (lizardfs-services-to-run config) (append (lizardfs-shepherd-service config) (lizardfs-mfschunkserver-shepherd-service config) (if (lizardfs-configuration-run-mfsmetalogger-service config) (lizardfs-mfsmetalogger-shepherd-service config) '()))) (define lizardfs-service-type (service-type (name 'lizardfs) (extensions (list (service-extension shepherd-root-service-type lizardfs-services-to-run) (service-extension activation-service-type lizardfs-activation) (service-extension etc-service-type lizardfs-etc-service) (service-extension account-service-type (const %lizardfs-accounts)) (service-extension profile-service-type (compose list lizardfs-configuration-package)))) (default-value (lizardfs-configuration)) (description "")))