Update all legacy-style modules

I.e., modules that use "require = [options]".  Nowadays that should be
written as

  {
    options = { ... };
    config = { ... };
  };

Also, use "imports" instead of "require" in places where we actually
import another module.
This commit is contained in:
Eelco Dolstra 2013-09-04 13:05:09 +02:00
parent 3a23e6dd31
commit 17457297cb
54 changed files with 1827 additions and 1934 deletions

View File

@ -2,11 +2,20 @@
with pkgs.lib; with pkgs.lib;
###### interface
let let
glibcLocales = pkgs.glibcLocales.override {
allLocales = any (x: x == "all") config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
};
in
{
###### interface
options = { options = {
i18n = { i18n = {
defaultLocale = mkOption { defaultLocale = mkOption {
default = "en_US.UTF-8"; default = "en_US.UTF-8";
@ -53,17 +62,10 @@ let
}; };
###### implementation
glibcLocales = pkgs.glibcLocales.override { ###### implementation
allLocales = any (x: x == "all") config.i18n.supportedLocales;
locales = config.i18n.supportedLocales;
};
in config = {
{
require = options;
environment.systemPackages = [ glibcLocales ]; environment.systemPackages = [ glibcLocales ];
@ -80,4 +82,6 @@ in
LANG=${config.i18n.defaultLocale} LANG=${config.i18n.defaultLocale}
''; '';
}; };
};
} }

View File

@ -1,12 +1,18 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
###### interface
let let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.krb5; cfg = config.krb5;
in
{
###### interface
options = { options = {
krb5 = { krb5 = {
enable = mkOption { enable = mkOption {
@ -35,26 +41,22 @@ let
}; };
}; };
}; };
in
###### implementation ###### implementation
mkIf config.krb5.enable { config = mkIf config.krb5.enable {
require = [
options
];
environment = { environment.systemPackages = [ pkgs.krb5 ];
systemPackages = [ pkgs.krb5 ];
etc = [ environment.etc."krb5.conf".text =
{ source = pkgs.writeText "krb5.conf"
'' ''
[libdefaults] [libdefaults]
default_realm = ${cfg.defaultRealm} default_realm = ${cfg.defaultRealm}
encrypt = true encrypt = true
# The following krb5.conf variables are only for MIT Kerberos. # The following krb5.conf variables are only for MIT Kerberos.
krb4_config = /etc/krb.conf krb4_config = /etc/krb.conf
krb4_realms = /etc/krb.realms krb4_realms = /etc/krb.realms
kdc_timesync = 1 kdc_timesync = 1
@ -62,16 +64,16 @@ mkIf config.krb5.enable {
forwardable = true forwardable = true
proxiable = true proxiable = true
# The following encryption type specification will be used by MIT Kerberos # The following encryption type specification will be used by MIT Kerberos
# if uncommented. In general, the defaults in the MIT Kerberos code are # if uncommented. In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new # correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems. # encryption types as they are added, creating interoperability problems.
# default_tgs_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5 # default_tgs_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5
# default_tkt_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5 # default_tkt_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5
# permitted_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5 # permitted_enctypes = aes256-cts arcfour-hmac-md5 des3-hmac-sha1 des-cbc-crc des-cbc-md5
# The following libdefaults parameters are only for Heimdal Kerberos. # The following libdefaults parameters are only for Heimdal Kerberos.
v4_instance_resolve = false v4_instance_resolve = false
v4_name_convert = { v4_name_convert = {
host = { host = {
@ -84,11 +86,11 @@ mkIf config.krb5.enable {
} }
fcc-mit-ticketflags = true fcc-mit-ticketflags = true
[realms] [realms]
${cfg.defaultRealm} = { ${cfg.defaultRealm} = {
kdc = ${cfg.kdc} kdc = ${cfg.kdc}
admin_server = ${cfg.kerberosAdminServer} admin_server = ${cfg.kerberosAdminServer}
# kpasswd_server = ${cfg.kerberosAdminServer} #kpasswd_server = ${cfg.kerberosAdminServer}
} }
ATHENA.MIT.EDU = { ATHENA.MIT.EDU = {
kdc = kerberos.mit.edu:88 kdc = kerberos.mit.edu:88
@ -166,7 +168,7 @@ mkIf config.krb5.enable {
default_domain = stanford.edu default_domain = stanford.edu
} }
[domain_realm] [domain_realm]
.${cfg.domainRealm} = ${cfg.defaultRealm} .${cfg.domainRealm} = ${cfg.defaultRealm}
${cfg.domainRealm} = ${cfg.defaultRealm} ${cfg.domainRealm} = ${cfg.defaultRealm}
.mit.edu = ATHENA.MIT.EDU .mit.edu = ATHENA.MIT.EDU
@ -179,15 +181,14 @@ mkIf config.krb5.enable {
whoi.edu = ATHENA.MIT.EDU whoi.edu = ATHENA.MIT.EDU
.stanford.edu = stanford.edu .stanford.edu = stanford.edu
[logging] [logging]
kdc = SYSLOG:INFO:DAEMON kdc = SYSLOG:INFO:DAEMON
admin_server = SYSLOG:INFO:DAEMON admin_server = SYSLOG:INFO:DAEMON
default = SYSLOG:INFO:DAEMON default = SYSLOG:INFO:DAEMON
krb4_convert = true krb4_convert = true
krb4_get_tickets = false krb4_get_tickets = false
[appdefaults]
[appdefaults]
pam = { pam = {
debug = false debug = false
ticket_lifetime = 36000 ticket_lifetime = 36000
@ -197,9 +198,7 @@ mkIf config.krb5.enable {
initial_timeout = 1 initial_timeout = 1
} }
''; '';
target = "krb5.conf";
}
];
}; };
} }

View File

@ -1,150 +1,12 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib; with pkgs.lib;
with pkgs; with pkgs;
###### interface
let let
inherit mkOption mkIf optionalString stringAfter singleton;
cfg = config.users.ldap; cfg = config.users.ldap;
options = {
users = {
ldap = {
enable = mkOption {
default = false;
description = "
Whether to enable authentication against an LDAP server.
";
};
server = mkOption {
example = "ldap://ldap.example.org/";
description = "
The URL of the LDAP server.
";
};
base = mkOption {
example = "dc=example,dc=org";
description = "
The distinguished name of the search base.
";
};
useTLS = mkOption {
default = false;
description = "
If enabled, use TLS (encryption) over an LDAP (port 389)
connection. The alternative is to specify an LDAPS server (port
636) in <option>users.ldap.server</option> or to forego
security.
";
};
timeLimit = mkOption {
default = 0;
type = types.int;
description = "
Specifies the time limit (in seconds) to use when performing
searches. A value of zero (0), which is the default, is to
wait indefinitely for searches to be completed.
";
};
daemon = {
enable = mkOption {
default = false;
description = ''
Whether to let the nslcd daemon (nss-pam-ldapd) handle the
LDAP lookups for NSS and PAM. This can improve performance,
and if you need to bind to the LDAP server with a password,
it increases security, since only the nslcd user needs to
have access to the bindpw file, not everyone that uses NSS
and/or PAM. If this option is enabled, a local nscd user is
created automatically, and the nslcd service is started
automatically when the network get up.
'';
};
extraConfig = mkOption {
default = "";
type = types.string;
description = ''
Extra configuration options that will be added verbatim at
the end of the nslcd configuration file (nslcd.conf).
'' ;
} ;
};
bind = {
distinguishedName = mkOption {
default = "";
example = "cn=admin,dc=example,dc=com";
type = types.string;
description = "
The distinguished name to bind to the LDAP server with. If this
is not specified, an anonymous bind will be done.
";
};
password = mkOption {
default = "/etc/ldap/bind.password";
type = types.string;
description = "
The path to a file containing the credentials to use when binding
to the LDAP server (if not binding anonymously).
";
};
timeLimit = mkOption {
default = 30;
type = types.int;
description = "
Specifies the time limit (in seconds) to use when connecting
to the directory server. This is distinct from the time limit
specified in <literal>users.ldap.timeLimit</literal> and affects
the initial server connection only.
";
};
policy = mkOption {
default = "hard_open";
type = types.string;
description = "
Specifies the policy to use for reconnecting to an unavailable
LDAP server. The default is <literal>hard_open</literal>, which
reconnects if opening the connection to the directory server
failed. By contrast, <literal>hard_init</literal> reconnects if
initializing the connection failed. Initializing may not
actually contact the directory server, and it is possible that
a malformed configuration file will trigger reconnection. If
<literal>soft</literal> is specified, then
<literal>nss_ldap</literal> will return immediately on server
failure. All hard reconnect policies block with exponential
backoff before retrying.
";
};
};
extraConfig = mkOption {
default = "" ;
type = types.string ;
description = ''
Extra configuration options that will be added verbatim at
the end of the ldap configuration file (ldap.conf).
If <literal>users.ldap.daemon</literal> is enabled, this
configuration will not be used. In that case, use
<literal>users.ldap.daemon.extraConfig</literal> instead.
'' ;
};
};
};
};
# Careful: OpenLDAP seems to be very picky about the indentation of # Careful: OpenLDAP seems to be very picky about the indentation of
# this file. Directives HAVE to start in the first column! # this file. Directives HAVE to start in the first column!
ldapConfig = { ldapConfig = {
@ -186,11 +48,143 @@ let
in in
###### implementation {
mkIf cfg.enable {
require = [ ###### interface
options
]; options = {
users.ldap = {
enable = mkOption {
default = false;
description = "Whether to enable authentication against an LDAP server.";
};
server = mkOption {
example = "ldap://ldap.example.org/";
description = "The URL of the LDAP server.";
};
base = mkOption {
example = "dc=example,dc=org";
description = "The distinguished name of the search base.";
};
useTLS = mkOption {
default = false;
description = ''
If enabled, use TLS (encryption) over an LDAP (port 389)
connection. The alternative is to specify an LDAPS server (port
636) in <option>users.ldap.server</option> or to forego
security.
'';
};
timeLimit = mkOption {
default = 0;
type = types.int;
description = ''
Specifies the time limit (in seconds) to use when performing
searches. A value of zero (0), which is the default, is to
wait indefinitely for searches to be completed.
'';
};
daemon = {
enable = mkOption {
default = false;
description = ''
Whether to let the nslcd daemon (nss-pam-ldapd) handle the
LDAP lookups for NSS and PAM. This can improve performance,
and if you need to bind to the LDAP server with a password,
it increases security, since only the nslcd user needs to
have access to the bindpw file, not everyone that uses NSS
and/or PAM. If this option is enabled, a local nscd user is
created automatically, and the nslcd service is started
automatically when the network get up.
'';
};
extraConfig = mkOption {
default = "";
type = types.string;
description = ''
Extra configuration options that will be added verbatim at
the end of the nslcd configuration file (nslcd.conf).
'' ;
} ;
};
bind = {
distinguishedName = mkOption {
default = "";
example = "cn=admin,dc=example,dc=com";
type = types.string;
description = ''
The distinguished name to bind to the LDAP server with. If this
is not specified, an anonymous bind will be done.
'';
};
password = mkOption {
default = "/etc/ldap/bind.password";
type = types.string;
description = ''
The path to a file containing the credentials to use when binding
to the LDAP server (if not binding anonymously).
'';
};
timeLimit = mkOption {
default = 30;
type = types.int;
description = ''
Specifies the time limit (in seconds) to use when connecting
to the directory server. This is distinct from the time limit
specified in <literal>users.ldap.timeLimit</literal> and affects
the initial server connection only.
'';
};
policy = mkOption {
default = "hard_open";
type = types.string;
description = ''
Specifies the policy to use for reconnecting to an unavailable
LDAP server. The default is <literal>hard_open</literal>, which
reconnects if opening the connection to the directory server
failed. By contrast, <literal>hard_init</literal> reconnects if
initializing the connection failed. Initializing may not
actually contact the directory server, and it is possible that
a malformed configuration file will trigger reconnection. If
<literal>soft</literal> is specified, then
<literal>nss_ldap</literal> will return immediately on server
failure. All hard reconnect policies block with exponential
backoff before retrying.
'';
};
};
extraConfig = mkOption {
default = "";
type = types.string;
description = ''
Extra configuration options that will be added verbatim at
the end of the ldap configuration file (ldap.conf).
If <literal>users.ldap.daemon</literal> is enabled, this
configuration will not be used. In that case, use
<literal>users.ldap.daemon.extraConfig</literal> instead.
'' ;
};
};
};
###### implementation
config = mkIf cfg.enable {
environment.etc = if cfg.daemon.enable then [nslcdConfig] else [ldapConfig]; environment.etc = if cfg.daemon.enable then [nslcdConfig] else [ldapConfig];
@ -221,6 +215,7 @@ mkIf cfg.enable {
}; };
systemd.services = mkIf cfg.daemon.enable { systemd.services = mkIf cfg.daemon.enable {
nslcd = { nslcd = {
wantedBy = [ "nss-user-lookup.target" ]; wantedBy = [ "nss-user-lookup.target" ];
before = [ "nss-user-lookup.target" ]; before = [ "nss-user-lookup.target" ];
@ -244,5 +239,8 @@ mkIf cfg.enable {
Restart = "always"; Restart = "always";
}; };
}; };
};
}; };
} }

View File

@ -1,6 +1,6 @@
# /etc files related to networking, such as /etc/services. # /etc files related to networking, such as /etc/services.
{config, pkgs, ...}: { config, pkgs, ... }:
with pkgs.lib; with pkgs.lib;
@ -8,6 +8,10 @@ let
cfg = config.networking; cfg = config.networking;
in
{
options = { options = {
networking.extraHosts = pkgs.lib.mkOption { networking.extraHosts = pkgs.lib.mkOption {
@ -32,10 +36,7 @@ let
}; };
in config = {
{
require = [options];
environment.etc = environment.etc =
{ # /etc/services: TCP/UDP port assignments. { # /etc/services: TCP/UDP port assignments.
@ -81,4 +82,7 @@ in
# services that depend on IP connectivity (like ntpd) should be # services that depend on IP connectivity (like ntpd) should be
# pulled in by this target. # pulled in by this target.
systemd.targets.ip-up.description = "Services Requiring IP Connectivity"; systemd.targets.ip-up.description = "Services Requiring IP Connectivity";
};
} }

View File

@ -6,17 +6,22 @@ with pkgs.lib;
let let
inherit (config.services.avahi) nssmdns;
in
{
options = { options = {
# NSS modules. Hacky! # NSS modules. Hacky!
system.nssModules = mkOption { system.nssModules = mkOption {
internal = true; internal = true;
default = []; default = [];
description = " description = ''
Search path for NSS (Name Service Switch) modules. This allows Search path for NSS (Name Service Switch) modules. This allows
several DNS resolution methods to be specified via several DNS resolution methods to be specified via
<filename>/etc/nsswitch.conf</filename>. <filename>/etc/nsswitch.conf</filename>.
"; '';
merge = mergeListOption; merge = mergeListOption;
apply = list: apply = list:
{ {
@ -27,12 +32,7 @@ let
}; };
inherit (config.services.avahi) nssmdns; config = {
in
{
require = [ options ];
environment.etc = environment.etc =
[ # Name Service Switch configuration file. Required by the C library. [ # Name Service Switch configuration file. Required by the C library.
@ -57,4 +57,6 @@ in
# a valid IP address. It returns all locally configured IP # a valid IP address. It returns all locally configured IP
# addresses, or ::1 and 127.0.0.2 as fallbacks. # addresses, or ::1 and 127.0.0.2 as fallbacks.
system.nssModules = [ pkgs.systemd ]; system.nssModules = [ pkgs.systemd ];
};
} }

View File

@ -54,7 +54,9 @@ let
extraManpages extraManpages
]; ];
in
{
options = { options = {
environment = { environment = {
@ -78,9 +80,7 @@ let
# to work. # to work.
default = []; default = [];
example = ["/"]; example = ["/"];
description = " description = "List of directories to be symlinked in `/run/current-system/sw'.";
Lists directories to be symlinked in `/run/current-system/sw'.
";
}; };
}; };
@ -120,15 +120,12 @@ let
}; };
config = {
in
{
require = [ options ];
environment.systemPackages = requiredPackages; environment.systemPackages = requiredPackages;
environment.pathsToLink = [
"/bin" environment.pathsToLink =
[ "/bin"
"/etc/xdg" "/etc/xdg"
"/info" "/info"
"/lib" "/lib"
@ -140,4 +137,6 @@ in
"/share/terminfo" "/share/terminfo"
"/share/man" "/share/man"
]; ];
};
} }

View File

@ -1,43 +1,34 @@
{pkgs, config, ...}: { config, pkgs, ... }:
###### interface
let
inherit (pkgs.lib) mkOption mkIf;
options = {
environment = {
unixODBCDrivers = mkOption {
default = [];
example = "map (x : x.ini) (with pkgs.unixODBCDrivers; [ mysql psql psqlng ] )";
description = ''
specifies unix odbc drivers to be registered at /etc/odbcinst.ini.
Maybe you also want to add pkgs.unixODBC to the system path to get a
command line client t connnect to odbc databases.
'';
};
};
};
in
###### implementation
with pkgs.lib;
# unixODBC drivers (this solution is not perfect.. Because the user has to # unixODBC drivers (this solution is not perfect.. Because the user has to
# ask the admin to add a driver.. but it's simple and works # ask the admin to add a driver.. but it's simple and works
mkIf (config.environment.unixODBCDrivers != []) { {
###### interface
require = [ options = {
options environment.unixODBCDrivers = mkOption {
]; default = [];
example = literalExample "map (x : x.ini) (with pkgs.unixODBCDrivers; [ mysql psql psqlng ] )";
environment = { description = ''
etc = [ Specifies Unix ODBC drivers to be registered in
{ source = <filename>/etc/odbcinst.ini</filename>. You may also want to
let inis = config.environment.unixODBCDrivers; add <literal>pkgs.unixODBC</literal> to the system path to get
in pkgs.writeText "odbcinst.ini" (pkgs.lib.concatStringsSep "\n" inis); a command line client to connnect to ODBC databases.
target = "odbcinst.ini"; '';
}
];
}; };
};
###### implementation
config = mkIf (config.environment.unixODBCDrivers != []) {
environment.etc."odbcinst.ini".text =
let inis = config.environment.unixODBCDrivers;
in pkgs.lib.concatStringsSep "\n" inis;
};
} }

View File

@ -1,13 +1,22 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
###### interface
let let
inherit (pkgs.lib) mkOption
mergeEnableOption mergeListOption; pcmciaUtils = pkgs.pcmciaUtils.passthru.function {
inherit (config.hardware.pcmcia) firmware config;
};
in
{
###### interface
options = { options = {
hardware = {
pcmcia = { hardware.pcmcia = {
enable = mkOption { enable = mkOption {
default = false; default = false;
merge = mergeEnableOption; merge = mergeEnableOption;
@ -32,30 +41,19 @@ let
''; '';
}; };
}; };
}; };
};
in
###### implementation ###### implementation
let
inherit (pkgs.lib) mkIf;
pcmciaUtils = pkgs.pcmciaUtils.passthru.function { config = mkIf config.hardware.pcmcia.enable {
inherit (config.hardware.pcmcia) firmware config;
};
in
mkIf config.hardware.pcmcia.enable {
require = [
# ../upstart-jobs/udev.nix
# ? # config.environment.extraPackages
options
];
boot.kernelModules = [ "pcmcia" ]; boot.kernelModules = [ "pcmcia" ];
services.udev.packages = [ pcmciaUtils ]; services.udev.packages = [ pcmciaUtils ];
environment.systemPackages = [ pcmciaUtils ]; environment.systemPackages = [ pcmciaUtils ];
};
} }

View File

@ -6,7 +6,7 @@
with pkgs.lib; with pkgs.lib;
{ {
require = imports =
[ ./memtest.nix [ ./memtest.nix
./channel.nix ./channel.nix
./iso-image.nix ./iso-image.nix

View File

@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [ ./installation-cd-minimal.nix ]; imports = [ ./installation-cd-minimal.nix ];
boot.kernelPackages = pkgs.linuxPackages_3_9; boot.kernelPackages = pkgs.linuxPackages_3_9;
boot.vesa = false; boot.vesa = false;

View File

@ -6,10 +6,7 @@
with pkgs.lib; with pkgs.lib;
{ {
require = [ imports = [ ./installation-cd-base.nix ../../profiles/graphical.nix ];
./installation-cd-base.nix
../../profiles/graphical.nix
];
# Provide wicd for easy wireless configuration. # Provide wicd for easy wireless configuration.
#networking.wicd.enable = true; #networking.wicd.enable = true;

View File

@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [ ./installation-cd-minimal.nix ]; imports = [ ./installation-cd-minimal.nix ];
boot.kernelPackages = pkgs.linuxPackages_3_10; boot.kernelPackages = pkgs.linuxPackages_3_10;
boot.vesa = false; boot.vesa = false;

View File

@ -4,7 +4,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = imports =
[ ./installation-cd-base.nix [ ./installation-cd-base.nix
../../profiles/minimal.nix ../../profiles/minimal.nix
]; ];

View File

@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [ ./installation-cd-graphical.nix ]; imports = [ ./installation-cd-graphical.nix ];
boot.kernelPackages = pkgs.linuxPackages_3_10; boot.kernelPackages = pkgs.linuxPackages_3_10;
boot.vesa = false; boot.vesa = false;

View File

@ -8,6 +8,79 @@ with pkgs.lib;
let let
# The Grub image.
grubImage = pkgs.runCommand "grub_eltorito" {}
''
${pkgs.grub2}/bin/grub-mkimage -O i386-pc -o tmp biosdisk iso9660 help linux linux16 chain png jpeg echo gfxmenu reboot
cat ${pkgs.grub2}/lib/grub/*/cdboot.img tmp > $out
''; # */
# The configuration file for Grub.
grubCfg =
''
set default=${builtins.toString config.boot.loader.grub.default}
set timeout=${builtins.toString config.boot.loader.grub.timeout}
if loadfont /boot/grub/unicode.pf2; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
terminal_output gfxterm
insmod png
if background_image /boot/grub/splash.png; then
set color_normal=white/black
set color_highlight=black/white
else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi
fi
${config.boot.loader.grub.extraEntries}
'';
# The efi boot image
efiImg = pkgs.runCommand "efi-image_eltorito" {}
''
#Let's hope 10M is enough
dd bs=2048 count=5120 if=/dev/zero of="$out"
${pkgs.dosfstools}/sbin/mkfs.vfat "$out"
${pkgs.mtools}/bin/mmd -i "$out" efi
${pkgs.mtools}/bin/mmd -i "$out" efi/boot
${pkgs.mtools}/bin/mmd -i "$out" efi/nixos
${pkgs.mtools}/bin/mmd -i "$out" loader
${pkgs.mtools}/bin/mmd -i "$out" loader/entries
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${pkgs.gummiboot}/lib/gummiboot/gummiboot${targetArch}.efi \
::efi/boot/boot${targetArch}.efi
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${config.boot.kernelPackages.kernel + "/bzImage"} ::bzImage
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${config.system.build.initialRamdisk + "/initrd"} ::efi/nixos/initrd
echo "title NixOS LiveCD" > boot-params
echo "linux /bzImage" >> boot-params
echo "initrd /efi/nixos/initrd" >> boot-params
echo "options init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}" >> boot-params
${pkgs.mtools}/bin/mcopy -v -i "$out" boot-params ::loader/entries/nixos-livecd.conf
echo "default nixos-livecd" > boot-params
echo "timeout 5" >> boot-params
${pkgs.mtools}/bin/mcopy -v -i "$out" boot-params ::loader/loader.conf
'';
targetArch = if pkgs.stdenv.isi686 then
"ia32"
else if pkgs.stdenv.isx86_64 then
"x64"
else
throw "Unsupported architecture";
in
{
options = { options = {
isoImage.isoName = mkOption { isoImage.isoName = mkOption {
@ -84,80 +157,7 @@ let
}; };
# The Grub image. config = {
grubImage = pkgs.runCommand "grub_eltorito" {}
''
${pkgs.grub2}/bin/grub-mkimage -O i386-pc -o tmp biosdisk iso9660 help linux linux16 chain png jpeg echo gfxmenu reboot
cat ${pkgs.grub2}/lib/grub/*/cdboot.img tmp > $out
''; # */
# The configuration file for Grub.
grubCfg =
''
set default=${builtins.toString config.boot.loader.grub.default}
set timeout=${builtins.toString config.boot.loader.grub.timeout}
if loadfont /boot/grub/unicode.pf2; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
terminal_output gfxterm
insmod png
if background_image /boot/grub/splash.png; then
set color_normal=white/black
set color_highlight=black/white
else
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
fi
fi
${config.boot.loader.grub.extraEntries}
'';
# The efi boot image
efiImg = pkgs.runCommand "efi-image_eltorito" {}
''
#Let's hope 10M is enough
dd bs=2048 count=5120 if=/dev/zero of="$out"
${pkgs.dosfstools}/sbin/mkfs.vfat "$out"
${pkgs.mtools}/bin/mmd -i "$out" efi
${pkgs.mtools}/bin/mmd -i "$out" efi/boot
${pkgs.mtools}/bin/mmd -i "$out" efi/nixos
${pkgs.mtools}/bin/mmd -i "$out" loader
${pkgs.mtools}/bin/mmd -i "$out" loader/entries
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${pkgs.gummiboot}/lib/gummiboot/gummiboot${targetArch}.efi \
::efi/boot/boot${targetArch}.efi
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${config.boot.kernelPackages.kernel + "/bzImage"} ::bzImage
${pkgs.mtools}/bin/mcopy -v -i "$out" \
${config.system.build.initialRamdisk + "/initrd"} ::efi/nixos/initrd
echo "title NixOS LiveCD" > boot-params
echo "linux /bzImage" >> boot-params
echo "initrd /efi/nixos/initrd" >> boot-params
echo "options init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}" >> boot-params
${pkgs.mtools}/bin/mcopy -v -i "$out" boot-params ::loader/entries/nixos-livecd.conf
echo "default nixos-livecd" > boot-params
echo "timeout 5" >> boot-params
${pkgs.mtools}/bin/mcopy -v -i "$out" boot-params ::loader/loader.conf
'';
targetArch = if pkgs.stdenv.isi686 then
"ia32"
else if pkgs.stdenv.isx86_64 then
"x64"
else
throw "Unsupported architecture";
in
{
require = options;
boot.loader.grub.version = 2; boot.loader.grub.version = 2;
@ -308,4 +308,6 @@ in
# contents of the CD to a bootable USB stick. Need unionfs-fuse for union mounts # contents of the CD to a bootable USB stick. Need unionfs-fuse for union mounts
boot.initrd.supportedFilesystems = [ "vfat" "unionfs-fuse" ]; boot.initrd.supportedFilesystems = [ "vfat" "unionfs-fuse" ];
};
} }

View File

@ -1,11 +1,11 @@
{config, pkgs, ...}: { config, pkgs, ... }:
{ {
require = [./installation-cd-base.nix]; imports = [ ./installation-cd-base.nix ];
# Build the build-time dependencies of this configuration on the DVD # Build the build-time dependencies of this configuration on the DVD
# to speed up installation. # to speed up installation.
isoImage.storeContents = [config.system.build.toplevel.drvPath]; isoImage.storeContents = [ config.system.build.toplevel.drvPath ];
# Include lots of packages. # Include lots of packages.
environment.systemPackages = environment.systemPackages =

View File

@ -12,15 +12,10 @@ let
# evaluated. So we'll just hope for the best. # evaluated. So we'll just hope for the best.
dummyConfiguration = pkgs.writeText "configuration.nix" dummyConfiguration = pkgs.writeText "configuration.nix"
'' ''
{config, pkgs, ...}: { config, pkgs, ... }:
{ { # Add your own options below, e.g.:
require = [ ];
# Add your own options below
# E.g.,
# services.openssh.enable = true; # services.openssh.enable = true;
nixpkgs.config.platform = pkgs.platforms.fuloong2f_n32; nixpkgs.config.platform = pkgs.platforms.fuloong2f_n32;
} }
''; '';
@ -45,11 +40,7 @@ let
in in
{ {
require = imports = [ ./system-tarball.nix ];
[
./system-tarball.nix
];
# Disable some other stuff we don't need. # Disable some other stuff we don't need.
security.sudo.enable = false; security.sudo.enable = false;

View File

@ -65,7 +65,7 @@ let
in in
{ {
require = imports =
[ ./system-tarball.nix [ ./system-tarball.nix
# Profiles of this basic installation. # Profiles of this basic installation.

View File

@ -15,11 +15,9 @@ let
# evaluated. So we'll just hope for the best. # evaluated. So we'll just hope for the best.
dummyConfiguration = pkgs.writeText "configuration.nix" dummyConfiguration = pkgs.writeText "configuration.nix"
'' ''
{config, pkgs, ...}: { config, pkgs, ... }:
{ {
require = [ ];
# Add your own options below and run "nixos-rebuild switch". # Add your own options below and run "nixos-rebuild switch".
# E.g., # E.g.,
# services.openssh.enable = true; # services.openssh.enable = true;
@ -39,10 +37,7 @@ let
in in
{ {
require = imports = [ ./system-tarball.nix ];
[
./system-tarball.nix
];
# Disable some other stuff we don't need. # Disable some other stuff we don't need.
security.sudo.enable = false; security.sudo.enable = false;

View File

@ -8,6 +8,11 @@ with pkgs.lib;
let let
versionFile = pkgs.writeText "nixos-version" config.system.nixosVersion;
in
{
options = { options = {
tarball.contents = mkOption { tarball.contents = mkOption {
example = example =
@ -31,12 +36,7 @@ let
}; };
versionFile = pkgs.writeText "nixos-version" config.system.nixosVersion; config = {
in
{
require = options;
# In stage 1 of the boot, mount the CD/DVD as the root FS by label # In stage 1 of the boot, mount the CD/DVD as the root FS by label
# so that we don't need to know its device. # so that we don't need to know its device.
@ -86,4 +86,7 @@ in
touch /etc/NIXOS touch /etc/NIXOS
${config.environment.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system ${config.environment.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
''; '';
};
} }

View File

@ -8,7 +8,7 @@ my @attrs = ();
my @kernelModules = (); my @kernelModules = ();
my @initrdKernelModules = (); my @initrdKernelModules = ();
my @modulePackages = (); my @modulePackages = ();
my @requires = ("<nixos/modules/installer/scan/not-detected.nix>"); my @imports = ("<nixos/modules/installer/scan/not-detected.nix>");
sub debug { sub debug {
@ -227,7 +227,7 @@ my $initrdKernelModules = toNixExpr(removeDups @initrdKernelModules);
my $kernelModules = toNixExpr(removeDups @kernelModules); my $kernelModules = toNixExpr(removeDups @kernelModules);
my $modulePackages = toNixExpr(removeDups @modulePackages); my $modulePackages = toNixExpr(removeDups @modulePackages);
my $attrs = multiLineList(" ", removeDups @attrs); my $attrs = multiLineList(" ", removeDups @attrs);
my $requires = multiLineList(" ", removeDups @requires); my $imports = multiLineList(" ", removeDups @imports);
print <<EOF ; print <<EOF ;
@ -236,7 +236,7 @@ print <<EOF ;
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [$requires ]; imports = [$imports ];
boot.initrd.kernelModules = [$initrdKernelModules ]; boot.initrd.kernelModules = [$initrdKernelModules ];
boot.kernelModules = [$kernelModules ]; boot.kernelModules = [$kernelModules ];

View File

@ -215,7 +215,7 @@ if $generate; then
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = imports =
[ # Include the results of the hardware scan. [ # Include the results of the hardware scan.
./hardware-configuration.nix ./hardware-configuration.nix
]; ];

View File

@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = imports =
[ ../virtualisation/virtualbox-image.nix [ ../virtualisation/virtualbox-image.nix
../installer/cd-dvd/channel.nix ../installer/cd-dvd/channel.nix
../profiles/demo.nix ../profiles/demo.nix

View File

@ -1,10 +1,9 @@
# This module defines the global list of uids and gids. We keep a # This module defines the global list of uids and gids. We keep a
# central list to prevent id collisions. # central list to prevent id collisions.
{config, pkgs, ...}: { config, pkgs, ... }:
let
{
options = { options = {
ids.uids = pkgs.lib.mkOption { ids.uids = pkgs.lib.mkOption {
@ -21,10 +20,8 @@ let
}; };
in
{ config = {
require = options;
ids.uids = { ids.uids = {
root = 0; root = 0;
@ -198,4 +195,6 @@ in
nogroup = 65534; nogroup = 65534;
}; };
};
} }

View File

@ -1,21 +1,15 @@
# This module allows you to export something from configuration # This module allows you to export something from configuration
# Use case: export kernel source expression for ease of configuring # Use case: export kernel source expression for ease of configuring
{config, pkgs, ...}: { config, pkgs, ... }:
let {
options = {
options = {
passthru = pkgs.lib.mkOption { passthru = pkgs.lib.mkOption {
description = '' description = ''
This attribute set will be exported as a system attribute. This attribute set will be exported as a system attribute.
You can put whatever you want here. You can put whatever you want here.
''; '';
}; };
}; };
in
{
require = options;
} }

View File

@ -224,7 +224,6 @@
#./services/x11/window-managers/compiz.nix #./services/x11/window-managers/compiz.nix
./services/x11/window-managers/default.nix ./services/x11/window-managers/default.nix
./services/x11/window-managers/icewm.nix ./services/x11/window-managers/icewm.nix
./services/x11/window-managers/kwm.nix
./services/x11/window-managers/metacity.nix ./services/x11/window-managers/metacity.nix
./services/x11/window-managers/none.nix ./services/x11/window-managers/none.nix
./services/x11/window-managers/twm.nix ./services/x11/window-managers/twm.nix

View File

@ -49,7 +49,7 @@
# Include lots of firmware. # Include lots of firmware.
hardware.enableAllFirmware = true; hardware.enableAllFirmware = true;
require = imports =
[ ../hardware/network/zydas-zd1211.nix ]; [ ../hardware/network/zydas-zd1211.nix ];
} }

View File

@ -47,7 +47,7 @@ let
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [ ${toString config.installer.cloneConfigIncludes} ]; imports = [ ${toString config.installer.cloneConfigIncludes} ];
} }
''; '';

View File

@ -1,7 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
require = [ ./graphical.nix ]; imports = [ ./graphical.nix ];
users.extraUsers.demo = users.extraUsers.demo =
{ description = "Demo user account"; { description = "Demo user account";

View File

@ -31,6 +31,9 @@ let
mapAttrsFlatten (k: v: "alias ${k}='${v}'") cfg.shellAliases mapAttrsFlatten (k: v: "alias ${k}='${v}'") cfg.shellAliases
); );
in
{
options = { options = {
environment.promptInit = mkOption { environment.promptInit = mkOption {
@ -87,36 +90,28 @@ let
}; };
in
{ config = {
require = [options];
environment.etc = # Script executed when the shell starts as a login shell.
[ { # Script executed when the shell starts as a login shell. environment.etc."profile".source =
source = pkgs.substituteAll { pkgs.substituteAll {
src = ./profile.sh; src = ./profile.sh;
wrapperDir = config.security.wrapperDir; wrapperDir = config.security.wrapperDir;
inherit (cfg) shellInit; inherit (cfg) shellInit;
}; };
target = "profile";
}
{ # /etc/bashrc: executed every time an interactive bash # /etc/bashrc: executed every time an interactive bash
# starts. Sources /etc/profile to ensure that the system # starts. Sources /etc/profile to ensure that the system
# environment is configured properly. # environment is configured properly.
source = pkgs.substituteAll { environment.etc."bashrc".source =
pkgs.substituteAll {
src = ./bashrc.sh; src = ./bashrc.sh;
inherit (cfg) interactiveShellInit; inherit (cfg) interactiveShellInit;
}; };
target = "bashrc";
}
{ # Configuration for readline in bash. # Configuration for readline in bash.
source = ./inputrc; environment.etc."inputrc".source = ./inputrc;
target = "inputrc";
}
];
environment.shellAliases = environment.shellAliases =
{ ls = "ls --color=tty"; { ls = "ls --color=tty";
@ -153,4 +148,7 @@ in
"/etc/bash_completion.d" "/etc/bash_completion.d"
"/share/bash-completion" "/share/bash-completion"
]; ];
};
} }

View File

@ -3,12 +3,18 @@
# directly to an SMTP server defined in its configuration file, wihout # directly to an SMTP server defined in its configuration file, wihout
# queueing mail locally. # queueing mail locally.
{config, pkgs, ...}: { config, pkgs, ... }:
with pkgs.lib; with pkgs.lib;
let let
cfg = config.networking.defaultMailServer;
in
{
options = { options = {
networking.defaultMailServer = { networking.defaultMailServer = {
@ -16,82 +22,78 @@ let
directDelivery = mkOption { directDelivery = mkOption {
default = false; default = false;
example = true; example = true;
description = " description = ''
Use the trivial Mail Transfer Agent (MTA) Use the trivial Mail Transfer Agent (MTA)
<command>ssmtp</command> package to allow programs to send <command>ssmtp</command> package to allow programs to send
e-mail. If you don't want to run a ``real'' MTA like e-mail. If you don't want to run a real MTA like
<command>sendmail</command> or <command>postfix</command> on <command>sendmail</command> or <command>postfix</command> on
your machine, set this option to <literal>true</literal>, and your machine, set this option to <literal>true</literal>, and
set the option set the option
<option>networking.defaultMailServer.hostName</option> to the <option>networking.defaultMailServer.hostName</option> to the
host name of your preferred mail server. host name of your preferred mail server.
"; '';
}; };
hostName = mkOption { hostName = mkOption {
example = "mail.example.org"; example = "mail.example.org";
description = " description = ''
The host name of the default mail server to use to deliver The host name of the default mail server to use to deliver
e-mail. e-mail.
"; '';
}; };
domain = mkOption { domain = mkOption {
default = ""; default = "";
example = "example.org"; example = "example.org";
description = " description = ''
The domain from which mail will appear to be sent. The domain from which mail will appear to be sent.
"; '';
}; };
useTLS = mkOption { useTLS = mkOption {
default = false; default = false;
example = true; example = true;
description = " description = ''
Whether TLS should be used to connect to the default mail Whether TLS should be used to connect to the default mail
server. server.
"; '';
}; };
useSTARTTLS = mkOption { useSTARTTLS = mkOption {
default = false; default = false;
example = true; example = true;
description = " description = ''
Whether the STARTTLS should be used to connect to the default Whether the STARTTLS should be used to connect to the default
mail server. (This is needed for TLS-capable mail servers mail server. (This is needed for TLS-capable mail servers
running on the default SMTP port 25.) running on the default SMTP port 25.)
"; '';
}; };
authUser = mkOption { authUser = mkOption {
default = ""; default = "";
example = "foo@example.org"; example = "foo@example.org";
description = " description = ''
Username used for SMTP auth. Leave blank to disable. Username used for SMTP auth. Leave blank to disable.
"; '';
}; };
authPass = mkOption { authPass = mkOption {
default = ""; default = "";
example = "correctHorseBatteryStaple"; example = "correctHorseBatteryStaple";
description = " description = ''
Password used for SMTP auth. (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE) Password used for SMTP auth. (STORED PLAIN TEXT, WORLD-READABLE IN NIX STORE)
"; '';
}; };
}; };
}; };
cfg = config.networking.defaultMailServer;
in config = mkIf cfg.directDelivery {
mkIf cfg.directDelivery { environment.etc."ssmtp/ssmtp.conf".text =
require = [options]; ''
environment.etc =
[ { source = pkgs.writeText "ssmtp.conf" ''
MailHub=${cfg.hostName} MailHub=${cfg.hostName}
FromLineOverride=YES FromLineOverride=YES
${if cfg.domain != "" then "rewriteDomain=${cfg.domain}" else ""} ${if cfg.domain != "" then "rewriteDomain=${cfg.domain}" else ""}
@ -101,9 +103,9 @@ mkIf cfg.directDelivery {
${if cfg.authUser != "" then "AuthUser=${cfg.authUser}" else ""} ${if cfg.authUser != "" then "AuthUser=${cfg.authUser}" else ""}
${if cfg.authPass != "" then "AuthPass=${cfg.authPass}" else ""} ${if cfg.authPass != "" then "AuthPass=${cfg.authPass}" else ""}
''; '';
target = "ssmtp/ssmtp.conf";
}
];
environment.systemPackages = [pkgs.ssmtp]; environment.systemPackages = [pkgs.ssmtp];
};
} }

View File

@ -1,47 +1,42 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
let let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.desktopManager.gnome; cfg = config.services.xserver.desktopManager.gnome;
gnome = pkgs.gnome; gnome = pkgs.gnome;
options = { services = { xserver = { desktopManager = { in
gnome = { {
enable = mkOption {
options = {
services.xserver.desktopManager.gnome.enable = mkOption {
default = false; default = false;
example = true; example = true;
description = "Enable a gnome terminal as a desktop manager."; description = "Enable a gnome terminal as a desktop manager.";
}; };
}; };
}; }; }; }; config = mkIf cfg.enable {
in
mkIf cfg.enable { services.xserver.desktopManager.session = singleton
require = options; { name = "gnome";
services = {
xserver = {
desktopManager = {
session = [{
name = "gnome";
start = '' start = ''
${gnome.gnometerminal}/bin/gnome-terminal -ls & ${gnome.gnometerminal}/bin/gnome-terminal -ls &
waitPID=$! waitPID=$!
''; '';
}];
}; };
}; environment.systemPackages =
}; [ gnome.gnometerminal
environment = {
x11Packages = [
gnome.gnometerminal
gnome.GConf gnome.GConf
gnome.gconfeditor gnome.gconfeditor
]; ];
}; };
} }

View File

@ -1,10 +1,14 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
let let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.desktopManager.xterm; cfg = config.services.xserver.desktopManager.xterm;
in
{
options = { options = {
services.xserver.desktopManager.xterm.enable = mkOption { services.xserver.desktopManager.xterm.enable = mkOption {
@ -15,30 +19,18 @@ let
}; };
in config = mkIf cfg.enable {
mkIf cfg.enable { services.xserver.desktopManager.session = singleton
require = options; { name = "xterm";
services = {
xserver = {
desktopManager = {
session = [{
name = "xterm";
start = '' start = ''
${pkgs.xterm}/bin/xterm -ls & ${pkgs.xterm}/bin/xterm -ls &
waitPID=$! waitPID=$!
''; '';
}];
}; };
}; environment.systemPackages = [ pkgs.xterm ];
}; };
environment = {
x11Packages = [
pkgs.xterm
];
};
} }

View File

@ -1,15 +1,15 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
let let
inherit (pkgs.lib) mkOption mergeOneOption any;
cfg = config.services.xserver.windowManager; cfg = config.services.xserver.windowManager;
in in
{ {
imports = [ imports =
./compiz.nix [ ./compiz.nix
./openbox.nix ./openbox.nix
./kwm.nix
./metacity.nix ./metacity.nix
./none.nix ./none.nix
./twm.nix ./twm.nix
@ -20,6 +20,7 @@ in
]; ];
options = { options = {
services.xserver.windowManager = { services.xserver.windowManager = {
session = mkOption { session = mkOption {
@ -28,11 +29,11 @@ in
name = "wmii"; name = "wmii";
start = "..."; start = "...";
}]; }];
description = " description = ''
Internal option used to add some common line to window manager Internal option used to add some common line to window manager
scripts before forwarding the value to the scripts before forwarding the value to the
<varname>displayManager</varname>. <varname>displayManager</varname>.
"; '';
apply = map (d: d // { apply = map (d: d // {
manage = "window"; manage = "window";
}); });
@ -41,9 +42,7 @@ in
default = mkOption { default = mkOption {
default = "none"; default = "none";
example = "wmii"; example = "wmii";
description = " description = "Default window manager loaded if none have been chosen.";
Default window manager loaded if none have been chosen.
";
merge = mergeOneOption; merge = mergeOneOption;
apply = defaultWM: apply = defaultWM:
if any (w: w.name == defaultWM) cfg.session then if any (w: w.name == defaultWM) cfg.session then
@ -53,6 +52,7 @@ in
}; };
}; };
}; };
config = { config = {

View File

@ -1,46 +0,0 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.kwm;
option = { services = { xserver = { windowManager = {
kwm = {
enable = mkOption {
default = false;
example = true;
description = "Enable the kwm window manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = option;
services = {
xserver = {
windowManager = {
session = [{
name = "kwm";
start = "
${pkgs.kde3.kdebase}/bin/kwin &
waitPID=$!
";
}];
};
};
};
environment = {
x11Packages = [
pkgs.kde3.kdelibs
pkgs.kde3.kdebase
];
};
}

View File

@ -1,15 +1,19 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
let let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.metacity; cfg = config.services.xserver.windowManager.metacity;
xorg = config.services.xserver.package; xorg = config.services.xserver.package;
gnome = pkgs.gnome; gnome = pkgs.gnome;
option = { services = { xserver = { windowManager = { in
metacity = { {
enable = mkOption { options = {
services.xserver.windowManager.metacity.enable = mkOption {
default = false; default = false;
example = true; example = true;
description = "Enable the metacity window manager."; description = "Enable the metacity window manager.";
@ -17,18 +21,10 @@ let
}; };
}; }; }; }; config = mkIf cfg.enable {
in
mkIf cfg.enable { services.xserver.windowManager.session = singleton
require = option; { name = "metacity";
services = {
xserver = {
windowManager = {
session = [{
name = "metacity";
start = '' start = ''
env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/ env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/
# !!! Hack: load the schemas for Metacity. # !!! Hack: load the schemas for Metacity.
@ -37,13 +33,10 @@ mkIf cfg.enable {
${gnome.metacity}/bin/metacity & ${gnome.metacity}/bin/metacity &
waitPID=$! waitPID=$!
''; '';
}];
}; };
}; environment.systemPackages = [ gnome.metacity ];
}; };
environment = {
x11Packages = [ gnome.metacity ];
};
} }

View File

@ -1,27 +1,27 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
let let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.wmii; cfg = config.services.xserver.windowManager.wmii;
option = { services = { xserver = { windowManager = { in
wmii = { {
enable = mkOption { options = {
services.xserver.windowManager.wmii.enable = mkOption {
default = false; default = false;
example = true; example = true;
description = "Enable the wmii window manager."; description = "Enable the wmii window manager.";
}; };
}; };
}; }; }; }; config = mkIf cfg.enable {
in
mkIf cfg.enable { services.xserver.windowManager.session = singleton
require = option;
services = {
xserver = {
# stop wmii by # stop wmii by
# $wmiir xwrite /ctl quit # $wmiir xwrite /ctl quit
# this will cause wmii exiting with exit code 0 # this will cause wmii exiting with exit code 0
@ -32,23 +32,16 @@ mkIf cfg.enable {
# lost and all applications running on X will terminate. # lost and all applications running on X will terminate.
# Another use case is kill -9 wmii; after rotating screen. # Another use case is kill -9 wmii; after rotating screen.
# Note: we don't like kill for that purpose. But it works (-> subject "wmii and xrandr" on mailinglist) # Note: we don't like kill for that purpose. But it works (-> subject "wmii and xrandr" on mailinglist)
windowManager = { { name = "wmii";
session = [{ start = ''
name = "wmii";
start = "
while :; do while :; do
${pkgs.wmiiSnap}/bin/wmii && break ${pkgs.wmiiSnap}/bin/wmii && break
done done
"; '';
}];
}; };
}; environment.systemPackages = [ pkgs.wmiiSnap ];
}; };
environment = {
x11Packages = [
pkgs.wmiiSnap
];
};
} }

View File

@ -4,66 +4,6 @@ with pkgs.lib;
let let
options = {
system.build = mkOption {
default = {};
description = ''
Attribute set of derivations used to setup the system.
'';
};
nesting.children = mkOption {
default = [];
description = ''
Additional configurations to build.
'';
};
nesting.clone = mkOption {
default = [];
description = ''
Additional configurations to build based on the current
configuration which is has a lower priority.
'';
};
system.boot.loader.id = mkOption {
default = "";
description = ''
Id string of the used bootloader.
'';
};
system.boot.loader.kernelFile = mkOption {
default = pkgs.stdenv.platform.kernelTarget;
type = types.uniq types.string;
description = ''
Name of the kernel file to be passed to the bootloader.
'';
};
system.copySystemConfiguration = mkOption {
default = false;
description = ''
If enabled, copies the NixOS configuration file
<literal>$NIXOS_CONFIG</literal> (usually
<filename>/etc/nixos/configuration.nix</filename>)
to the system store path.
'';
};
system.extraSystemBuilderCmds = mkOption {
default = "";
internal = true;
merge = concatStringsSep "\n";
description = ''
This code will be added to the builder creating the system store path.
'';
};
};
# This attribute is responsible for creating boot entries for # This attribute is responsible for creating boot entries for
# child configuration. They are only (directly) accessible # child configuration. They are only (directly) accessible
@ -176,8 +116,71 @@ let
}; };
in { in
require = [options];
{
options = {
system.build = mkOption {
default = {};
description = ''
Attribute set of derivations used to setup the system.
'';
};
nesting.children = mkOption {
default = [];
description = ''
Additional configurations to build.
'';
};
nesting.clone = mkOption {
default = [];
description = ''
Additional configurations to build based on the current
configuration which is has a lower priority.
'';
};
system.boot.loader.id = mkOption {
default = "";
description = ''
Id string of the used bootloader.
'';
};
system.boot.loader.kernelFile = mkOption {
default = pkgs.stdenv.platform.kernelTarget;
type = types.uniq types.string;
description = ''
Name of the kernel file to be passed to the bootloader.
'';
};
system.copySystemConfiguration = mkOption {
default = false;
description = ''
If enabled, copies the NixOS configuration file
<literal>$NIXOS_CONFIG</literal> (usually
<filename>/etc/nixos/configuration.nix</filename>)
to the system store path.
'';
};
system.extraSystemBuilderCmds = mkOption {
default = "";
internal = true;
merge = concatStringsSep "\n";
description = ''
This code will be added to the builder creating the system store path.
'';
};
};
config = {
system.extraSystemBuilderCmds = system.extraSystemBuilderCmds =
optionalString optionalString
@ -185,4 +188,7 @@ in {
"cp ${maybeEnv "NIXOS_CONFIG" "/etc/nixos/configuration.nix"} $out"; "cp ${maybeEnv "NIXOS_CONFIG" "/etc/nixos/configuration.nix"} $out";
system.build.toplevel = system; system.build.toplevel = system;
};
} }

View File

@ -1,13 +1,26 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
###### interface
let let
inherit (pkgs.lib) mkOption mkIf;
generationsDirBuilder = pkgs.substituteAll {
src = ./generations-dir-builder.sh;
isExecutable = true;
inherit (pkgs) bash;
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
inherit (config.boot.loader.generationsDir) copyKernels;
};
# Temporary check, for nixos to cope both with nixpkgs stdenv-updates and trunk
platform = pkgs.stdenv.platform;
in
{
options = { options = {
boot = {
loader = { boot.loader.generationsDir = {
generationsDir = {
enable = mkOption { enable = mkOption {
default = false; default = false;
@ -34,37 +47,17 @@ let
/nix/store is not needed by the boot loader. /nix/store is not needed by the boot loader.
"; ";
}; };
};
};
};
}; };
in
###### implementation
let
generationsDirBuilder = pkgs.substituteAll {
src = ./generations-dir-builder.sh;
isExecutable = true;
inherit (pkgs) bash;
path = [pkgs.coreutils pkgs.gnused pkgs.gnugrep];
inherit (config.boot.loader.generationsDir) copyKernels;
}; };
# Temporary check, for nixos to cope both with nixpkgs stdenv-updates and trunk
platform = pkgs.stdenv.platform;
in
{
require = [
options
# config.system.build config = mkIf config.boot.loader.generationsDir.enable {
# ../system/system-options.nix
]; system.build.installBootLoader = generationsDirBuilder;
system.boot.loader.id = "generationsDir";
system.boot.loader.kernelFile = platform.kernelTarget;
system = mkIf config.boot.loader.generationsDir.enable {
build.installBootLoader = generationsDirBuilder;
boot.loader.id = "generationsDir";
boot.loader.kernelFile = platform.kernelTarget;
}; };
} }

View File

@ -1,30 +1,9 @@
{pkgs, config, ...}: { config, pkgs, ... }:
with pkgs.lib;
###### interface
let let
inherit (pkgs.lib) mkOption mkIf;
options = {
boot = {
loader = {
raspberryPi = {
enable = mkOption {
default = false;
description = ''
Whether to create files with the system generations in
<literal>/boot</literal>.
<literal>/boot/old</literal> will hold files from old generations.
'';
};
};
};
};
};
in
###### implementation
let
builder = pkgs.substituteAll { builder = pkgs.substituteAll {
src = ./builder.sh; src = ./builder.sh;
isExecutable = true; isExecutable = true;
@ -34,18 +13,26 @@ let
}; };
platform = pkgs.stdenv.platform; platform = pkgs.stdenv.platform;
in in
{ {
require = [ options = {
options
# config.system.build boot.loader.raspberryPi.enable = mkOption {
# ../system/system-options.nix default = false;
]; description = ''
Whether to create files with the system generations in
<literal>/boot</literal>.
<literal>/boot/old</literal> will hold files from old generations.
'';
};
system = mkIf config.boot.loader.raspberryPi.enable { };
build.installBootLoader = builder;
boot.loader.id = "raspberrypi"; config = mkIf config.boot.loader.raspberryPi.enable {
boot.loader.kernelFile = platform.kernelTarget; system.build.installBootLoader = builder;
system.boot.loader.id = "raspberrypi";
system.boot.loader.kernelFile = platform.kernelTarget;
}; };
} }

View File

@ -11,116 +11,6 @@ let
udev = config.systemd.package; udev = config.systemd.package;
options = {
boot.resumeDevice = mkOption {
default = "";
example = "0:0";
description = "
Device for manual resume attempt during boot. Looks like
major:minor. ls -l /dev/SWAP_PARTION shows them.
";
};
boot.initrd.enableSplashScreen = mkOption {
default = true;
description = "
Whether to show a nice splash screen while booting.
";
};
boot.initrd.checkJournalingFS = mkOption {
default = true;
type = types.bool;
description = ''
Whether to run fsck on journaling filesystems such as ext3.
'';
};
boot.initrd.mdadmConf = mkOption {
default = "";
type = with types; string;
description = ''
Contents of /etc/mdadm.conf at initrd.
'';
};
boot.initrd.preLVMCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately before lvm discovery.
'';
};
boot.initrd.postDeviceCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately after stage 1 of the
boot has loaded kernel modules and created device nodes in
/dev.
'';
};
boot.initrd.postMountCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately after the stage 1
filesystems have been mounted.
'';
};
boot.initrd.extraUtilsCommands = mkOption {
internal = true;
default = "";
type = with types; string;
description = ''
Shell commands to be executed in the builder of the
extra-utils derivation. This can be used to provide
additional utilities in the initial ramdisk.
'';
};
boot.initrd.extraUtilsCommandsTest = mkOption {
internal = true;
default = "";
type = with types; string;
description = ''
Shell commands to be executed in the builder of the
extra-utils derivation after patchelf has done its
job. This can be used to test additional utilities
copied in extraUtilsCommands.
'';
};
boot.initrd.compressor = mkOption {
default = "gzip -9";
type = types.string;
description = "The compressor to use on the initrd";
example = "xz";
};
fileSystems = mkOption {
options.neededForBoot = mkOption {
default = false;
type = types.bool;
description = ''
If set, this file system will be mounted in the initial
ramdisk. By default, this applies to the root file system
and to the file system containing
<filename>/nix/store</filename>.
'';
};
};
};
kernelPackages = config.boot.kernelPackages; kernelPackages = config.boot.kernelPackages;
modulesTree = config.system.modulesTree; modulesTree = config.system.modulesTree;
@ -141,7 +31,8 @@ let
&& kernelPackages.kernel.features.needsCifsUtils && kernelPackages.kernel.features.needsCifsUtils
&& any (fs: fs.fsType == "cifs") fileSystems; && any (fs: fs.fsType == "cifs") fileSystems;
busybox = if needsCifsUtils busybox =
if needsCifsUtils
then pkgs.busybox.override { then pkgs.busybox.override {
extraConfig = '' extraConfig = ''
CONFIG_FEATURE_MOUNT_CIFS n CONFIG_FEATURE_MOUNT_CIFS n
@ -351,9 +242,119 @@ let
]; ];
}; };
in { in
require = [options]; {
options = {
boot.resumeDevice = mkOption {
default = "";
example = "0:0";
description = "
Device for manual resume attempt during boot. Looks like
major:minor. ls -l /dev/SWAP_PARTION shows them.
";
};
boot.initrd.enableSplashScreen = mkOption {
default = true;
description = "
Whether to show a nice splash screen while booting.
";
};
boot.initrd.checkJournalingFS = mkOption {
default = true;
type = types.bool;
description = ''
Whether to run fsck on journaling filesystems such as ext3.
'';
};
boot.initrd.mdadmConf = mkOption {
default = "";
type = with types; string;
description = ''
Contents of /etc/mdadm.conf at initrd.
'';
};
boot.initrd.preLVMCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately before lvm discovery.
'';
};
boot.initrd.postDeviceCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately after stage 1 of the
boot has loaded kernel modules and created device nodes in
/dev.
'';
};
boot.initrd.postMountCommands = mkOption {
default = "";
type = with types; string;
description = ''
Shell commands to be executed immediately after the stage 1
filesystems have been mounted.
'';
};
boot.initrd.extraUtilsCommands = mkOption {
internal = true;
default = "";
type = with types; string;
description = ''
Shell commands to be executed in the builder of the
extra-utils derivation. This can be used to provide
additional utilities in the initial ramdisk.
'';
};
boot.initrd.extraUtilsCommandsTest = mkOption {
internal = true;
default = "";
type = with types; string;
description = ''
Shell commands to be executed in the builder of the
extra-utils derivation after patchelf has done its
job. This can be used to test additional utilities
copied in extraUtilsCommands.
'';
};
boot.initrd.compressor = mkOption {
default = "gzip -9";
type = types.string;
description = "The compressor to use on the initrd";
example = "xz";
};
fileSystems = mkOption {
options.neededForBoot = mkOption {
default = false;
type = types.bool;
description = ''
If set, this file system will be mounted in the initial
ramdisk. By default, this applies to the root file system
and to the file system containing
<filename>/nix/store</filename>.
'';
};
};
};
config = {
system.build.bootStage1 = bootStage1; system.build.bootStage1 = bootStage1;
system.build.initialRamdisk = initialRamdisk; system.build.initialRamdisk = initialRamdisk;
@ -363,4 +364,6 @@ in {
(isYes "TMPFS") (isYes "TMPFS")
(isYes "BLK_DEV_INITRD") (isYes "BLK_DEV_INITRD")
]; ];
};
} }

View File

@ -4,6 +4,38 @@ with pkgs.lib;
let let
kernel = config.boot.kernelPackages.kernel;
activateConfiguration = config.system.activationScripts.script;
readonlyMountpoint = pkgs.runCommand "readonly-mountpoint" {} ''
mkdir -p $out/bin
cc -O3 ${./readonly-mountpoint.c} -o $out/bin/readonly-mountpoint
strip -s $out/bin/readonly-mountpoint
'';
bootStage2 = pkgs.substituteAll {
src = ./stage-2-init.sh;
shellDebug = "${pkgs.bashInteractive}/bin/bash";
isExecutable = true;
inherit (config.boot) devShmSize runSize cleanTmpDir;
inherit (config.nix) readOnlyStore;
ttyGid = config.ids.gids.tty;
path =
[ pkgs.coreutils
pkgs.utillinux
pkgs.sysvtools
] ++ (optional config.boot.cleanTmpDir pkgs.findutils)
++ optional config.nix.readOnlyStore readonlyMountpoint;
postBootCommands = pkgs.writeText "local-cmds"
''
${config.boot.postBootCommands}
${config.powerManagement.powerUpCommands}
'';
};
in
{
options = { options = {
boot = { boot = {
@ -59,39 +91,10 @@ let
}; };
kernel = config.boot.kernelPackages.kernel;
activateConfiguration = config.system.activationScripts.script;
readonlyMountpoint = pkgs.runCommand "readonly-mountpoint" {} '' config = {
mkdir -p $out/bin
cc -O3 ${./readonly-mountpoint.c} -o $out/bin/readonly-mountpoint
strip -s $out/bin/readonly-mountpoint
'';
bootStage2 = pkgs.substituteAll {
src = ./stage-2-init.sh;
shellDebug = "${pkgs.bashInteractive}/bin/bash";
isExecutable = true;
inherit (config.boot) devShmSize runSize cleanTmpDir;
inherit (config.nix) readOnlyStore;
ttyGid = config.ids.gids.tty;
path =
[ pkgs.coreutils
pkgs.utillinux
pkgs.sysvtools
] ++ (optional config.boot.cleanTmpDir pkgs.findutils)
++ optional config.nix.readOnlyStore readonlyMountpoint;
postBootCommands = pkgs.writeText "local-cmds"
''
${config.boot.postBootCommands}
${config.powerManagement.powerUpCommands}
'';
};
in
{
require = [options];
system.build.bootStage2 = bootStage2; system.build.bootStage2 = bootStage2;
};
} }

View File

@ -1,5 +1,5 @@
{ config, pkgs, modulesPath, ... }: { config, pkgs, modulesPath, ... }:
{ {
require = [ "${modulesPath}/virtualisation/amazon-image.nix" ]; imports = [ "${modulesPath}/virtualisation/amazon-image.nix" ];
} }

View File

@ -3,7 +3,7 @@
with pkgs.lib; with pkgs.lib;
{ {
require = [ ../profiles/headless.nix ./ec2-data.nix ]; imports = [ ../profiles/headless.nix ./ec2-data.nix ];
system.build.amazonImage = system.build.amazonImage =
pkgs.vmTools.runInLinuxVM ( pkgs.vmTools.runInLinuxVM (

View File

@ -5,7 +5,8 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
with pkgs.lib; with pkgs.lib;
let
{
options = { options = {
ec2.metadata = mkOption { ec2.metadata = mkOption {
type = types.bool; type = types.bool;
@ -15,9 +16,8 @@ let
''; '';
}; };
}; };
in
{ config = {
require = [options];
systemd.services."fetch-ec2-data" = systemd.services."fetch-ec2-data" =
{ description = "Fetch EC2 Data"; { description = "Fetch EC2 Data";
@ -95,4 +95,5 @@ in
serviceConfig.RemainAfterExit = true; serviceConfig.RemainAfterExit = true;
}; };
};
} }

View File

@ -1,5 +1,5 @@
{ config, pkgs, modulesPath, ... }: { config, pkgs, modulesPath, ... }:
{ {
require = [ "${modulesPath}/virtualisation/nova-image.nix" ]; imports = [ "${modulesPath}/virtualisation/nova-image.nix" ];
} }

View File

@ -3,7 +3,7 @@
with pkgs.lib; with pkgs.lib;
{ {
require = [ ../profiles/qemu-guest.nix ../profiles/headless.nix ./ec2-data.nix ]; imports = [ ../profiles/qemu-guest.nix ../profiles/headless.nix ./ec2-data.nix ];
system.build.novaImage = system.build.novaImage =
pkgs.vmTools.runInLinuxVM ( pkgs.vmTools.runInLinuxVM (

View File

@ -18,6 +18,123 @@ let
then "noname" then "noname"
else config.networking.hostName; else config.networking.hostName;
cfg = config.virtualisation;
qemuGraphics = if cfg.graphics then "" else "-nographic";
kernelConsole = if cfg.graphics then "" else "console=ttyS0";
ttys = [ "tty1" "tty2" "tty3" "tty4" "tty5" "tty6" ];
# Shell script to start the VM.
startVM =
''
#! ${pkgs.stdenv.shell}
NIX_DISK_IMAGE=$(readlink -f ''${NIX_DISK_IMAGE:-${config.virtualisation.diskImage}})
if ! test -e "$NIX_DISK_IMAGE"; then
${pkgs.qemu_kvm}/bin/qemu-img create -f qcow2 "$NIX_DISK_IMAGE" \
${toString config.virtualisation.diskSize}M || exit 1
fi
# Create a directory for exchanging data with the VM.
if [ -z "$TMPDIR" -o -z "$USE_TMPDIR" ]; then
TMPDIR=$(mktemp -d nix-vm.XXXXXXXXXX --tmpdir)
fi
cd $TMPDIR
mkdir -p $TMPDIR/xchg
idx=2
extraDisks=""
${flip concatMapStrings cfg.emptyDiskImages (size: ''
${pkgs.qemu_kvm}/bin/qemu-img create -f raw "empty$idx" "${toString size}M"
extraDisks="$extraDisks -drive index=$idx,file=$(pwd)/empty$idx,if=virtio,werror=report"
idx=$((idx + 1))
'')}
# Start QEMU.
# "-boot menu=on" is there, because I don't know how to make qemu boot from 2nd hd.
exec ${pkgs.qemu_kvm}/bin/qemu-kvm \
-name ${vmName} \
-m ${toString config.virtualisation.memorySize} \
${optionalString (pkgs.stdenv.system == "x86_64-linux") "-cpu kvm64"} \
-net nic,vlan=0,model=virtio \
-net user,vlan=0''${QEMU_NET_OPTS:+,$QEMU_NET_OPTS} \
-virtfs local,path=/nix/store,security_model=none,mount_tag=store \
-virtfs local,path=$TMPDIR/xchg,security_model=none,mount_tag=xchg \
-virtfs local,path=''${SHARED_DIR:-$TMPDIR/xchg},security_model=none,mount_tag=shared \
${if cfg.useBootLoader then ''
-drive index=0,id=drive1,file=$NIX_DISK_IMAGE,if=virtio,cache=writeback,werror=report \
-drive index=1,id=drive2,file=${bootDisk}/disk.img,if=virtio,readonly \
-boot menu=on
'' else ''
-drive file=$NIX_DISK_IMAGE,if=virtio,cache=writeback,werror=report \
-kernel ${config.system.build.toplevel}/kernel \
-initrd ${config.system.build.toplevel}/initrd \
-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo} ${kernelConsole} $QEMU_KERNEL_PARAMS" \
''} \
$extraDisks \
${qemuGraphics} \
${toString config.virtualisation.qemu.options} \
$QEMU_OPTS
'';
regInfo = pkgs.runCommand "reginfo"
{ exportReferencesGraph =
map (x: [("closure-" + baseNameOf x) x]) config.virtualisation.pathsInNixDB;
buildInputs = [ pkgs.perl ];
preferLocalBuild = true;
}
''
printRegistration=1 perl ${pkgs.pathsFromGraph} closure-* > $out
'';
# Generate a hard disk image containing a /boot partition and GRUB
# in the MBR. Used when the `useBootLoader' option is set.
bootDisk =
pkgs.vmTools.runInLinuxVM (
pkgs.runCommand "nixos-boot-disk"
{ preVM =
''
mkdir $out
diskImage=$out/disk.img
${pkgs.qemu_kvm}/bin/qemu-img create -f qcow2 $diskImage "32M"
'';
buildInputs = [ pkgs.utillinux ];
}
''
# Create a single /boot partition.
${pkgs.parted}/sbin/parted /dev/vda mklabel msdos
${pkgs.parted}/sbin/parted /dev/vda -- mkpart primary ext2 1M -1s
. /sys/class/block/vda1/uevent
mknod /dev/vda1 b $MAJOR $MINOR
. /sys/class/block/vda/uevent
${pkgs.e2fsprogs}/sbin/mkfs.ext4 -L boot /dev/vda1
${pkgs.e2fsprogs}/sbin/tune2fs -c 0 -i 0 /dev/vda1
# Mount /boot.
mkdir /boot
mount /dev/vda1 /boot
# This is needed for GRUB 0.97, which doesn't know about virtio devices.
mkdir /boot/grub
echo '(hd0) /dev/vda' > /boot/grub/device.map
# Install GRUB and generate the GRUB boot menu.
touch /etc/NIXOS
mkdir -p /nix/var/nix/profiles
${config.system.build.toplevel}/bin/switch-to-configuration boot
umount /boot
''
);
in
{
imports = [ ../profiles/qemu-guest.nix ];
options = { options = {
virtualisation.memorySize = virtualisation.memorySize =
@ -154,122 +271,7 @@ let
}; };
cfg = config.virtualisation; config = {
qemuGraphics = if cfg.graphics then "" else "-nographic";
kernelConsole = if cfg.graphics then "" else "console=ttyS0";
ttys = [ "tty1" "tty2" "tty3" "tty4" "tty5" "tty6" ];
# Shell script to start the VM.
startVM =
''
#! ${pkgs.stdenv.shell}
NIX_DISK_IMAGE=$(readlink -f ''${NIX_DISK_IMAGE:-${config.virtualisation.diskImage}})
if ! test -e "$NIX_DISK_IMAGE"; then
${pkgs.qemu_kvm}/bin/qemu-img create -f qcow2 "$NIX_DISK_IMAGE" \
${toString config.virtualisation.diskSize}M || exit 1
fi
# Create a directory for exchanging data with the VM.
if [ -z "$TMPDIR" -o -z "$USE_TMPDIR" ]; then
TMPDIR=$(mktemp -d nix-vm.XXXXXXXXXX --tmpdir)
fi
cd $TMPDIR
mkdir -p $TMPDIR/xchg
idx=2
extraDisks=""
${flip concatMapStrings cfg.emptyDiskImages (size: ''
${pkgs.qemu_kvm}/bin/qemu-img create -f raw "empty$idx" "${toString size}M"
extraDisks="$extraDisks -drive index=$idx,file=$(pwd)/empty$idx,if=virtio,werror=report"
idx=$((idx + 1))
'')}
# Start QEMU.
# "-boot menu=on" is there, because I don't know how to make qemu boot from 2nd hd.
exec ${pkgs.qemu_kvm}/bin/qemu-kvm \
-name ${vmName} \
-m ${toString config.virtualisation.memorySize} \
${optionalString (pkgs.stdenv.system == "x86_64-linux") "-cpu kvm64"} \
-net nic,vlan=0,model=virtio \
-net user,vlan=0''${QEMU_NET_OPTS:+,$QEMU_NET_OPTS} \
-virtfs local,path=/nix/store,security_model=none,mount_tag=store \
-virtfs local,path=$TMPDIR/xchg,security_model=none,mount_tag=xchg \
-virtfs local,path=''${SHARED_DIR:-$TMPDIR/xchg},security_model=none,mount_tag=shared \
${if cfg.useBootLoader then ''
-drive index=0,id=drive1,file=$NIX_DISK_IMAGE,if=virtio,cache=writeback,werror=report \
-drive index=1,id=drive2,file=${bootDisk}/disk.img,if=virtio,readonly \
-boot menu=on
'' else ''
-drive file=$NIX_DISK_IMAGE,if=virtio,cache=writeback,werror=report \
-kernel ${config.system.build.toplevel}/kernel \
-initrd ${config.system.build.toplevel}/initrd \
-append "$(cat ${config.system.build.toplevel}/kernel-params) init=${config.system.build.toplevel}/init regInfo=${regInfo} ${kernelConsole} $QEMU_KERNEL_PARAMS" \
''} \
$extraDisks \
${qemuGraphics} \
${toString config.virtualisation.qemu.options} \
$QEMU_OPTS
'';
regInfo = pkgs.runCommand "reginfo"
{ exportReferencesGraph =
map (x: [("closure-" + baseNameOf x) x]) config.virtualisation.pathsInNixDB;
buildInputs = [ pkgs.perl ];
preferLocalBuild = true;
}
''
printRegistration=1 perl ${pkgs.pathsFromGraph} closure-* > $out
'';
# Generate a hard disk image containing a /boot partition and GRUB
# in the MBR. Used when the `useBootLoader' option is set.
bootDisk =
pkgs.vmTools.runInLinuxVM (
pkgs.runCommand "nixos-boot-disk"
{ preVM =
''
mkdir $out
diskImage=$out/disk.img
${pkgs.qemu_kvm}/bin/qemu-img create -f qcow2 $diskImage "32M"
'';
buildInputs = [ pkgs.utillinux ];
}
''
# Create a single /boot partition.
${pkgs.parted}/sbin/parted /dev/vda mklabel msdos
${pkgs.parted}/sbin/parted /dev/vda -- mkpart primary ext2 1M -1s
. /sys/class/block/vda1/uevent
mknod /dev/vda1 b $MAJOR $MINOR
. /sys/class/block/vda/uevent
${pkgs.e2fsprogs}/sbin/mkfs.ext4 -L boot /dev/vda1
${pkgs.e2fsprogs}/sbin/tune2fs -c 0 -i 0 /dev/vda1
# Mount /boot.
mkdir /boot
mount /dev/vda1 /boot
# This is needed for GRUB 0.97, which doesn't know about virtio devices.
mkdir /boot/grub
echo '(hd0) /dev/vda' > /boot/grub/device.map
# Install GRUB and generate the GRUB boot menu.
touch /etc/NIXOS
mkdir -p /nix/var/nix/profiles
${config.system.build.toplevel}/bin/switch-to-configuration boot
umount /boot
''
);
in
{
require = [ options ../profiles/qemu-guest.nix ];
boot.loader.grub.device = mkOverride 50 "/dev/vda"; boot.loader.grub.device = mkOverride 50 "/dev/vda";
@ -414,4 +416,6 @@ in
(isYes "SERIAL_8250_CONSOLE") (isYes "SERIAL_8250_CONSOLE")
(isYes "SERIAL_8250") (isYes "SERIAL_8250")
]; ];
};
} }

View File

@ -5,7 +5,7 @@
machine = machine =
{ config, pkgs, ... }: { config, pkgs, ... }:
{ require = [ ./common/x11.nix ]; { imports = [ ./common/x11.nix ];
environment.systemPackages = [ pkgs.firefox ]; environment.systemPackages = [ pkgs.firefox ];
}; };

View File

@ -37,7 +37,7 @@ let
'' ''
{ config, pkgs, modulesPath, ... }: { config, pkgs, modulesPath, ... }:
{ require = { imports =
[ ./hardware.nix [ ./hardware.nix
"''${modulesPath}/testing/test-instrumentation.nix" "''${modulesPath}/testing/test-instrumentation.nix"
]; ];

View File

@ -5,7 +5,7 @@
machine = machine =
{ config, pkgs, ... }: { config, pkgs, ... }:
{ require = [ ./common/user-account.nix ]; { imports = [ ./common/user-account.nix ];
virtualisation.memorySize = 768; virtualisation.memorySize = 768;

View File

@ -17,7 +17,7 @@ rec {
client = client =
{ config, pkgs, ... }: { config, pkgs, ... }:
{ require = [ ./common/x11.nix ]; { imports = [ ./common/x11.nix ];
services.xserver.driSupport = true; services.xserver.driSupport = true;
services.xserver.defaultDepth = pkgs.lib.mkOverride 0 16; services.xserver.defaultDepth = pkgs.lib.mkOverride 0 16;
environment.systemPackages = [ pkgs.quake3demo ]; environment.systemPackages = [ pkgs.quake3demo ];

View File

@ -3,9 +3,8 @@
{ {
nodes = { nodes = {
storage = storage =
{pkgs, config, ...}: { config, pkgs, ... }:
{ { services.nfs.server.enable = true;
services.nfs.server.enable = true;
services.nfs.server.exports = '' services.nfs.server.exports = ''
/repos 192.168.1.0/255.255.255.0(rw,no_root_squash) /repos 192.168.1.0/255.255.255.0(rw,no_root_squash)
''; '';
@ -13,10 +12,8 @@
}; };
postgresql = postgresql =
{config, pkgs, ...}: { config, pkgs, ... }:
{ { services.postgresql.enable = true;
services.openssh.enable = true;
services.postgresql.enable = true;
services.postgresql.package = pkgs.postgresql92; services.postgresql.package = pkgs.postgresql92;
services.postgresql.enableTCPIP = true; services.postgresql.enableTCPIP = true;
services.postgresql.authentication = '' services.postgresql.authentication = ''
@ -29,15 +26,13 @@
}; };
webserver = webserver =
{config, pkgs, ...}: { config, pkgs, ... }:
{ { fileSystems = pkgs.lib.mkOverride 50
fileSystems = pkgs.lib.mkOverride 50
[ { mountPoint = "/repos"; [ { mountPoint = "/repos";
device = "storage:/repos"; device = "storage:/repos";
fsType = "nfs"; fsType = "nfs";
} }
]; ];
services.httpd.enable = true; services.httpd.enable = true;
services.httpd.adminAddr = "root@localhost"; services.httpd.adminAddr = "root@localhost";
services.httpd.extraSubservices = [ { serviceType = "trac"; } ]; services.httpd.extraSubservices = [ { serviceType = "trac"; } ];
@ -45,9 +40,8 @@
}; };
client = client =
{config, pkgs, ...}: { config, pkgs, ... }:
{ { imports = [ ./common/x11.nix ];
require = [ ./common/x11.nix ];
services.xserver.desktopManager.kde4.enable = true; services.xserver.desktopManager.kde4.enable = true;
}; };
}; };

View File

@ -5,7 +5,7 @@
machine = machine =
{ config, pkgs, ... }: { config, pkgs, ... }:
{ require = [ ./common/user-account.nix ]; { imports = [ ./common/user-account.nix ];
services.xserver.enable = true; services.xserver.enable = true;