Move all of NixOS to nixos/ in preparation of the repository merge
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
fonts = {
|
||||
|
||||
enableCoreFonts = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to include Microsoft's proprietary Core Fonts. These fonts
|
||||
are redistributable, but only verbatim, among other restrictions.
|
||||
See <link xlink:href="http://corefonts.sourceforge.net/eula.htm"/>
|
||||
for details.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = mkIf config.fonts.enableCoreFonts {
|
||||
|
||||
fonts.extraFonts = [ pkgs.corefonts ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
fonts = {
|
||||
|
||||
enableFontConfig = mkOption { # !!! should be enableFontconfig
|
||||
default = true;
|
||||
description = ''
|
||||
If enabled, a Fontconfig configuration file will be built
|
||||
pointing to a set of default fonts. If you don't care about
|
||||
running X11 applications or any other program that uses
|
||||
Fontconfig, you can turn this option off and prevent a
|
||||
dependency on all those fonts.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = mkIf config.fonts.enableFontConfig {
|
||||
|
||||
# Bring in the default (upstream) fontconfig configuration.
|
||||
environment.etc."fonts/fonts.conf".source =
|
||||
pkgs.makeFontsConf { fontDirectories = config.fonts.fonts; };
|
||||
|
||||
environment.etc."fonts/conf.d/00-nixos.conf".text =
|
||||
''
|
||||
<?xml version='1.0'?>
|
||||
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
|
||||
<fontconfig>
|
||||
|
||||
<!-- Set the default hinting style to "slight". -->
|
||||
<match target="font">
|
||||
<edit mode="assign" name="hintstyle">
|
||||
<const>hintslight</const>
|
||||
</edit>
|
||||
</match>
|
||||
|
||||
</fontconfig>
|
||||
'';
|
||||
|
||||
# FIXME: This variable is no longer needed, but we'll keep it
|
||||
# around for a while for applications linked against old
|
||||
# fontconfig builds.
|
||||
environment.variables.FONTCONFIG_FILE = "/etc/fonts/fonts.conf";
|
||||
|
||||
environment.systemPackages = [ pkgs.fontconfig ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
fontDirs = config.fonts.fonts;
|
||||
|
||||
localDefs = with pkgs.builderDefs; pkgs.builderDefs.passthru.function rec {
|
||||
src = "";/* put a fetchurl here */
|
||||
buildInputs = [pkgs.xorg.mkfontdir pkgs.xorg.mkfontscale];
|
||||
inherit fontDirs;
|
||||
installPhase = fullDepEntry ("
|
||||
list='';
|
||||
for i in ${toString fontDirs} ; do
|
||||
if [ -d \$i/ ]; then
|
||||
list=\"\$list \$i\";
|
||||
fi;
|
||||
done
|
||||
list=\$(find \$list -name fonts.dir -o -name '*.ttf' -o -name '*.otf');
|
||||
fontDirs='';
|
||||
for i in \$list ; do
|
||||
fontDirs=\"\$fontDirs \$(dirname \$i)\";
|
||||
done;
|
||||
mkdir -p \$out/share/X11-fonts/;
|
||||
find \$fontDirs -type f -o -type l | while read i; do
|
||||
j=\"\${i##*/}\"
|
||||
if ! test -e \"\$out/share/X11-fonts/\${j}\"; then
|
||||
ln -s \"\$i\" \"\$out/share/X11-fonts/\${j}\";
|
||||
fi;
|
||||
done;
|
||||
cd \$out/share/X11-fonts/
|
||||
rm fonts.dir
|
||||
rm fonts.scale
|
||||
rm fonts.alias
|
||||
mkfontdir
|
||||
mkfontscale
|
||||
cat \$( find ${pkgs.xorg.fontalias}/ -name fonts.alias) >fonts.alias
|
||||
") ["minInit" "addInputs"];
|
||||
};
|
||||
|
||||
x11Fonts = with localDefs; stdenv.mkDerivation rec {
|
||||
name = "X11-fonts";
|
||||
builder = writeScript (name + "-builder")
|
||||
(textClosure localDefs
|
||||
[installPhase doForceShare doPropagate]);
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
fonts = {
|
||||
|
||||
enableFontDir = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to create a directory with links to all fonts in
|
||||
<filename>/run/current-system/sw/share/X11-fonts</filename>.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = mkIf config.fonts.enableFontDir {
|
||||
|
||||
environment.systemPackages = [ x11Fonts ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
fonts = {
|
||||
|
||||
# TODO: find another name for it.
|
||||
fonts = mkOption {
|
||||
default = [
|
||||
# - the user's .fonts directory
|
||||
"~/.fonts"
|
||||
# - the user's current profile
|
||||
"~/.nix-profile/lib/X11/fonts"
|
||||
"~/.nix-profile/share/fonts"
|
||||
# - the default profile
|
||||
"/nix/var/nix/profiles/default/lib/X11/fonts"
|
||||
"/nix/var/nix/profiles/default/share/fonts"
|
||||
];
|
||||
description = "List of primary font paths.";
|
||||
apply = list: list ++ [
|
||||
# - a few statically built locations
|
||||
pkgs.xorg.fontbhttf
|
||||
pkgs.xorg.fontbhlucidatypewriter100dpi
|
||||
pkgs.xorg.fontbhlucidatypewriter75dpi
|
||||
pkgs.ttf_bitstream_vera
|
||||
pkgs.freefont_ttf
|
||||
pkgs.liberation_ttf
|
||||
pkgs.xorg.fontbh100dpi
|
||||
pkgs.xorg.fontmiscmisc
|
||||
pkgs.xorg.fontcursormisc
|
||||
]
|
||||
++ config.fonts.extraFonts;
|
||||
};
|
||||
|
||||
extraFonts = mkOption {
|
||||
default = [];
|
||||
example = [ pkgs.dejavu_fonts ];
|
||||
description = "List of packages with additional fonts.";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
fonts = {
|
||||
|
||||
enableGhostscriptFonts = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to add the fonts provided by Ghostscript (such as
|
||||
various URW fonts and the “Base-14” Postscript fonts) to the
|
||||
list of system fonts, making them available to X11
|
||||
applications.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = mkIf config.fonts.enableGhostscriptFonts {
|
||||
|
||||
fonts.extraFonts = [ "${pkgs.ghostscript}/share/ghostscript/fonts" ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
options = {
|
||||
gnu = mkOption {
|
||||
default = false;
|
||||
description =
|
||||
'' When enabled, GNU software is chosen by default whenever a there is
|
||||
a choice between GNU and non-GNU software (e.g., GNU lsh
|
||||
vs. OpenSSH).
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf config.gnu {
|
||||
|
||||
environment.systemPackages = with pkgs;
|
||||
# TODO: Adjust `requiredPackages' from `system-path.nix'.
|
||||
# TODO: Add Inetutils once it has the new `ifconfig'.
|
||||
[ parted
|
||||
#fdisk # XXX: GNU fdisk currently fails to build and it's redundant
|
||||
# with the `parted' command.
|
||||
nano zile
|
||||
texinfo # for the stand-alone Info reader
|
||||
]
|
||||
++ stdenv.lib.optional (!stdenv.isArm) grub2;
|
||||
|
||||
|
||||
# GNU GRUB, where available.
|
||||
boot.loader.grub.enable = !pkgs.stdenv.isArm;
|
||||
boot.loader.grub.version = 2;
|
||||
|
||||
# GNU lsh.
|
||||
services.openssh.enable = false;
|
||||
services.lshd.enable = true;
|
||||
services.xserver.startOpenSSHAgent = false;
|
||||
services.xserver.startGnuPGAgent = true;
|
||||
|
||||
# TODO: GNU dico.
|
||||
# TODO: GNU Inetutils' inetd.
|
||||
# TODO: GNU Pies.
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
glibcLocales = pkgs.glibcLocales.override {
|
||||
allLocales = any (x: x == "all") config.i18n.supportedLocales;
|
||||
locales = config.i18n.supportedLocales;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
i18n = {
|
||||
defaultLocale = mkOption {
|
||||
default = "en_US.UTF-8";
|
||||
example = "nl_NL.UTF-8";
|
||||
description = "
|
||||
The default locale. It determines the language for program
|
||||
messages, the format for dates and times, sort order, and so on.
|
||||
It also determines the character set, such as UTF-8.
|
||||
";
|
||||
};
|
||||
|
||||
supportedLocales = mkOption {
|
||||
default = ["all"];
|
||||
example = ["en_US.UTF-8/UTF-8" "nl_NL.UTF-8/UTF-8" "nl_NL/ISO-8859-1"];
|
||||
description = ''
|
||||
List of locales that the system should support. The value
|
||||
<literal>"all"</literal> means that all locales supported by
|
||||
Glibc will be installed. A full list of supported locales
|
||||
can be found at <link
|
||||
xlink:href="http://sourceware.org/cgi-bin/cvsweb.cgi/libc/localedata/SUPPORTED?cvsroot=glibc"/>.
|
||||
'';
|
||||
};
|
||||
|
||||
consoleFont = mkOption {
|
||||
default = "lat9w-16";
|
||||
example = "LatArCyrHeb-16";
|
||||
description = "
|
||||
The font used for the virtual consoles. Leave empty to use
|
||||
whatever the <command>setfont</command> program considers the
|
||||
default font.
|
||||
";
|
||||
};
|
||||
|
||||
consoleKeyMap = mkOption {
|
||||
default = "us";
|
||||
example = "fr";
|
||||
description = "
|
||||
The keyboard mapping table for the virtual consoles.
|
||||
";
|
||||
type = types.uniq types.string;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = {
|
||||
|
||||
environment.systemPackages = [ glibcLocales ];
|
||||
|
||||
environment.variables.LANG = config.i18n.defaultLocale;
|
||||
|
||||
# ‘/etc/locale.conf’ is used by systemd.
|
||||
environment.etc = singleton
|
||||
{ target = "locale.conf";
|
||||
source = pkgs.writeText "locale.conf"
|
||||
''
|
||||
LANG=${config.i18n.defaultLocale}
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.krb5;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
krb5 = {
|
||||
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
description = "Whether to enable Kerberos V.";
|
||||
};
|
||||
|
||||
defaultRealm = mkOption {
|
||||
default = "ATENA.MIT.EDU";
|
||||
description = "Default realm.";
|
||||
};
|
||||
|
||||
domainRealm = mkOption {
|
||||
default = "atena.mit.edu";
|
||||
description = "Default domain realm.";
|
||||
};
|
||||
|
||||
kdc = mkOption {
|
||||
default = "kerberos.mit.edu";
|
||||
description = "Kerberos Domain Controller";
|
||||
};
|
||||
|
||||
kerberosAdminServer = mkOption {
|
||||
default = "kerberos.mit.edu";
|
||||
description = "Kerberos Admin Server";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf config.krb5.enable {
|
||||
|
||||
environment.systemPackages = [ pkgs.krb5 ];
|
||||
|
||||
environment.etc."krb5.conf".text =
|
||||
''
|
||||
[libdefaults]
|
||||
default_realm = ${cfg.defaultRealm}
|
||||
encrypt = true
|
||||
|
||||
# The following krb5.conf variables are only for MIT Kerberos.
|
||||
krb4_config = /etc/krb.conf
|
||||
krb4_realms = /etc/krb.realms
|
||||
kdc_timesync = 1
|
||||
ccache_type = 4
|
||||
forwardable = true
|
||||
proxiable = true
|
||||
|
||||
# The following encryption type specification will be used by MIT Kerberos
|
||||
# if uncommented. In general, the defaults in the MIT Kerberos code are
|
||||
# correct and overriding these specifications only serves to disable new
|
||||
# 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_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
|
||||
|
||||
# The following libdefaults parameters are only for Heimdal Kerberos.
|
||||
v4_instance_resolve = false
|
||||
v4_name_convert = {
|
||||
host = {
|
||||
rcmd = host
|
||||
ftp = ftp
|
||||
}
|
||||
plain = {
|
||||
something = something-else
|
||||
}
|
||||
}
|
||||
fcc-mit-ticketflags = true
|
||||
|
||||
[realms]
|
||||
${cfg.defaultRealm} = {
|
||||
kdc = ${cfg.kdc}
|
||||
admin_server = ${cfg.kerberosAdminServer}
|
||||
#kpasswd_server = ${cfg.kerberosAdminServer}
|
||||
}
|
||||
ATHENA.MIT.EDU = {
|
||||
kdc = kerberos.mit.edu:88
|
||||
kdc = kerberos-1.mit.edu:88
|
||||
kdc = kerberos-2.mit.edu:88
|
||||
admin_server = kerberos.mit.edu
|
||||
default_domain = mit.edu
|
||||
}
|
||||
MEDIA-LAB.MIT.EDU = {
|
||||
kdc = kerberos.media.mit.edu
|
||||
admin_server = kerberos.media.mit.edu
|
||||
}
|
||||
ZONE.MIT.EDU = {
|
||||
kdc = casio.mit.edu
|
||||
kdc = seiko.mit.edu
|
||||
admin_server = casio.mit.edu
|
||||
}
|
||||
MOOF.MIT.EDU = {
|
||||
kdc = three-headed-dogcow.mit.edu:88
|
||||
kdc = three-headed-dogcow-1.mit.edu:88
|
||||
admin_server = three-headed-dogcow.mit.edu
|
||||
}
|
||||
CSAIL.MIT.EDU = {
|
||||
kdc = kerberos-1.csail.mit.edu
|
||||
kdc = kerberos-2.csail.mit.edu
|
||||
admin_server = kerberos.csail.mit.edu
|
||||
default_domain = csail.mit.edu
|
||||
krb524_server = krb524.csail.mit.edu
|
||||
}
|
||||
IHTFP.ORG = {
|
||||
kdc = kerberos.ihtfp.org
|
||||
admin_server = kerberos.ihtfp.org
|
||||
}
|
||||
GNU.ORG = {
|
||||
kdc = kerberos.gnu.org
|
||||
kdc = kerberos-2.gnu.org
|
||||
kdc = kerberos-3.gnu.org
|
||||
admin_server = kerberos.gnu.org
|
||||
}
|
||||
1TS.ORG = {
|
||||
kdc = kerberos.1ts.org
|
||||
admin_server = kerberos.1ts.org
|
||||
}
|
||||
GRATUITOUS.ORG = {
|
||||
kdc = kerberos.gratuitous.org
|
||||
admin_server = kerberos.gratuitous.org
|
||||
}
|
||||
DOOMCOM.ORG = {
|
||||
kdc = kerberos.doomcom.org
|
||||
admin_server = kerberos.doomcom.org
|
||||
}
|
||||
ANDREW.CMU.EDU = {
|
||||
kdc = vice28.fs.andrew.cmu.edu
|
||||
kdc = vice2.fs.andrew.cmu.edu
|
||||
kdc = vice11.fs.andrew.cmu.edu
|
||||
kdc = vice12.fs.andrew.cmu.edu
|
||||
admin_server = vice28.fs.andrew.cmu.edu
|
||||
default_domain = andrew.cmu.edu
|
||||
}
|
||||
CS.CMU.EDU = {
|
||||
kdc = kerberos.cs.cmu.edu
|
||||
kdc = kerberos-2.srv.cs.cmu.edu
|
||||
admin_server = kerberos.cs.cmu.edu
|
||||
}
|
||||
DEMENTIA.ORG = {
|
||||
kdc = kerberos.dementia.org
|
||||
kdc = kerberos2.dementia.org
|
||||
admin_server = kerberos.dementia.org
|
||||
}
|
||||
stanford.edu = {
|
||||
kdc = krb5auth1.stanford.edu
|
||||
kdc = krb5auth2.stanford.edu
|
||||
kdc = krb5auth3.stanford.edu
|
||||
admin_server = krb5-admin.stanford.edu
|
||||
default_domain = stanford.edu
|
||||
}
|
||||
|
||||
[domain_realm]
|
||||
.${cfg.domainRealm} = ${cfg.defaultRealm}
|
||||
${cfg.domainRealm} = ${cfg.defaultRealm}
|
||||
.mit.edu = ATHENA.MIT.EDU
|
||||
mit.edu = ATHENA.MIT.EDU
|
||||
.media.mit.edu = MEDIA-LAB.MIT.EDU
|
||||
media.mit.edu = MEDIA-LAB.MIT.EDU
|
||||
.csail.mit.edu = CSAIL.MIT.EDU
|
||||
csail.mit.edu = CSAIL.MIT.EDU
|
||||
.whoi.edu = ATHENA.MIT.EDU
|
||||
whoi.edu = ATHENA.MIT.EDU
|
||||
.stanford.edu = stanford.edu
|
||||
|
||||
[logging]
|
||||
kdc = SYSLOG:INFO:DAEMON
|
||||
admin_server = SYSLOG:INFO:DAEMON
|
||||
default = SYSLOG:INFO:DAEMON
|
||||
krb4_convert = true
|
||||
krb4_get_tickets = false
|
||||
|
||||
[appdefaults]
|
||||
pam = {
|
||||
debug = false
|
||||
ticket_lifetime = 36000
|
||||
renew_lifetime = 36000
|
||||
max_timeout = 30
|
||||
timeout_shift = 2
|
||||
initial_timeout = 1
|
||||
}
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,246 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
with pkgs;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.users.ldap;
|
||||
|
||||
# Careful: OpenLDAP seems to be very picky about the indentation of
|
||||
# this file. Directives HAVE to start in the first column!
|
||||
ldapConfig = {
|
||||
target = "ldap.conf";
|
||||
source = writeText "ldap.conf" ''
|
||||
uri ${config.users.ldap.server}
|
||||
base ${config.users.ldap.base}
|
||||
timelimit ${toString config.users.ldap.timeLimit}
|
||||
bind_timelimit ${toString config.users.ldap.bind.timeLimit}
|
||||
bind_policy ${config.users.ldap.bind.policy}
|
||||
${optionalString config.users.ldap.useTLS ''
|
||||
ssl start_tls
|
||||
tls_checkpeer no
|
||||
''}
|
||||
${optionalString (config.users.ldap.bind.distinguishedName != "") ''
|
||||
binddn ${config.users.ldap.bind.distinguishedName}
|
||||
''}
|
||||
${optionalString (cfg.extraConfig != "") cfg.extraConfig }
|
||||
'';
|
||||
};
|
||||
|
||||
nslcdConfig = {
|
||||
target = "nslcd.conf";
|
||||
source = writeText "nslcd.conf" ''
|
||||
uid nslcd
|
||||
gid nslcd
|
||||
uri ${cfg.server}
|
||||
base ${cfg.base}
|
||||
timelimit ${toString cfg.timeLimit}
|
||||
bind_timelimit ${toString cfg.bind.timeLimit}
|
||||
${optionalString (cfg.bind.distinguishedName != "")
|
||||
"binddn ${cfg.bind.distinguishedName}" }
|
||||
${optionalString (cfg.daemon.extraConfig != "") cfg.daemon.extraConfig }
|
||||
'';
|
||||
};
|
||||
|
||||
insertLdapPassword = !config.users.ldap.daemon.enable &&
|
||||
config.users.ldap.bind.distinguishedName != "";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
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];
|
||||
|
||||
system.activationScripts = mkIf insertLdapPassword {
|
||||
ldap = stringAfter [ "etc" "groups" "users" ] ''
|
||||
if test -f "${cfg.bind.password}" ; then
|
||||
echo "bindpw "$(cat ${cfg.bind.password})"" | cat ${ldapConfig} - > /etc/ldap.conf.bindpw
|
||||
mv -fT /etc/ldap.conf.bindpw /etc/ldap.conf
|
||||
chmod 600 /etc/ldap.conf
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
system.nssModules = singleton (
|
||||
if cfg.daemon.enable then nss_pam_ldapd else nss_ldap
|
||||
);
|
||||
|
||||
users = mkIf cfg.daemon.enable {
|
||||
extraGroups.nslcd = {
|
||||
gid = config.ids.gids.nslcd;
|
||||
};
|
||||
|
||||
extraUsers.nslcd = {
|
||||
uid = config.ids.uids.nslcd;
|
||||
description = "nslcd user.";
|
||||
group = "nslcd";
|
||||
};
|
||||
};
|
||||
|
||||
systemd.services = mkIf cfg.daemon.enable {
|
||||
|
||||
nslcd = {
|
||||
wantedBy = [ "nss-user-lookup.target" ];
|
||||
before = [ "nss-user-lookup.target" ];
|
||||
after = [ "network.target" ];
|
||||
|
||||
preStart = ''
|
||||
mkdir -p /run/nslcd
|
||||
rm -f /run/nslcd/nslcd.pid;
|
||||
chown nslcd.nslcd /run/nslcd
|
||||
${optionalString (cfg.bind.distinguishedName != "") ''
|
||||
if test -s "${cfg.bind.password}" ; then
|
||||
ln -sfT "${cfg.bind.password}" /run/nslcd/bindpw
|
||||
fi
|
||||
''}
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${nss_pam_ldapd}/sbin/nslcd";
|
||||
Type = "forking";
|
||||
PIDFile = "/run/nslcd/nslcd.pid";
|
||||
Restart = "always";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
# /etc files related to networking, such as /etc/services.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.networking;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
networking.extraHosts = pkgs.lib.mkOption {
|
||||
default = "";
|
||||
example = "192.168.0.1 lanlocalhost";
|
||||
description = ''
|
||||
Additional entries to be appended to <filename>/etc/hosts</filename>.
|
||||
'';
|
||||
};
|
||||
|
||||
networking.dnsSingleRequest = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Recent versions of glibc will issue both ipv4 (A) and ipv6 (AAAA)
|
||||
address queries at the same time, from the same port. Sometimes upstream
|
||||
routers will systemically drop the ipv4 queries. The symptom of this problem is
|
||||
that 'getent hosts example.com' only returns ipv6 (or perhaps only ipv4) addresses. The
|
||||
workaround for this is to specify the option 'single-request' in
|
||||
/etc/resolv.conf. This option enables that.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
environment.etc =
|
||||
{ # /etc/services: TCP/UDP port assignments.
|
||||
"services".source = pkgs.iana_etc + "/etc/services";
|
||||
|
||||
# /etc/protocols: IP protocol numbers.
|
||||
"protocols".source = pkgs.iana_etc + "/etc/protocols";
|
||||
|
||||
# /etc/rpc: RPC program numbers.
|
||||
"rpc".source = pkgs.glibc + "/etc/rpc";
|
||||
|
||||
# /etc/hosts: Hostname-to-IP mappings.
|
||||
"hosts".text =
|
||||
''
|
||||
127.0.0.1 localhost
|
||||
${optionalString cfg.enableIPv6 ''
|
||||
::1 localhost
|
||||
''}
|
||||
${cfg.extraHosts}
|
||||
'';
|
||||
|
||||
# /etc/resolvconf.conf: Configuration for openresolv.
|
||||
"resolvconf.conf".text =
|
||||
''
|
||||
# This is the default, but we must set it here to prevent
|
||||
# a collision with an apparently unrelated environment
|
||||
# variable with the same name exported by dhcpcd.
|
||||
interface_order='lo lo[0-9]*'
|
||||
'' + optionalString config.services.nscd.enable ''
|
||||
# Invalidate the nscd cache whenever resolv.conf is
|
||||
# regenerated.
|
||||
libc_restart='${pkgs.systemd}/bin/systemctl try-restart --no-block nscd.service'
|
||||
'' + optionalString cfg.dnsSingleRequest ''
|
||||
# only send one DNS request at a time
|
||||
resolv_conf_options='single-request'
|
||||
'' + optionalString config.services.bind.enable ''
|
||||
# This hosts runs a full-blown DNS resolver.
|
||||
name_servers='127.0.0.1'
|
||||
'';
|
||||
};
|
||||
|
||||
# The ‘ip-up’ target is started when we have IP connectivity. So
|
||||
# services that depend on IP connectivity (like ntpd) should be
|
||||
# pulled in by this target.
|
||||
systemd.targets.ip-up.description = "Services Requiring IP Connectivity";
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
options = {
|
||||
environment.noXlibs = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
description = ''
|
||||
Switch off the options in the default configuration that require X libraries.
|
||||
Currently this includes: ssh X11 forwarding, dbus, fonts.enableCoreFonts,
|
||||
fonts.enableFontConfig
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = pkgs.lib.mkIf config.environment.noXlibs {
|
||||
programs.ssh.setXAuthLocation = false;
|
||||
fonts = {
|
||||
enableCoreFonts = false;
|
||||
enableFontConfig = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
# Configuration for the Name Service Switch (/etc/nsswitch.conf).
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
inherit (config.services.avahi) nssmdns;
|
||||
inherit (config.services.samba) nsswins;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
# NSS modules. Hacky!
|
||||
system.nssModules = mkOption {
|
||||
internal = true;
|
||||
default = [];
|
||||
description = ''
|
||||
Search path for NSS (Name Service Switch) modules. This allows
|
||||
several DNS resolution methods to be specified via
|
||||
<filename>/etc/nsswitch.conf</filename>.
|
||||
'';
|
||||
merge = mergeListOption;
|
||||
apply = list:
|
||||
{
|
||||
inherit list;
|
||||
path = makeLibraryPath list;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
environment.etc =
|
||||
[ # Name Service Switch configuration file. Required by the C library.
|
||||
# !!! Factor out the mdns stuff. The avahi module should define
|
||||
# an option used by this module.
|
||||
{ source = pkgs.writeText "nsswitch.conf"
|
||||
''
|
||||
passwd: files ldap
|
||||
group: files ldap
|
||||
shadow: files ldap
|
||||
hosts: files ${optionalString nssmdns "mdns_minimal [NOTFOUND=return]"} dns ${optionalString nssmdns "mdns"} ${optionalString nsswins "wins"} myhostname
|
||||
networks: files dns
|
||||
ethers: files
|
||||
services: files
|
||||
protocols: files
|
||||
'';
|
||||
target = "nsswitch.conf";
|
||||
}
|
||||
];
|
||||
|
||||
# Use nss-myhostname to ensure that our hostname always resolves to
|
||||
# a valid IP address. It returns all locally configured IP
|
||||
# addresses, or ::1 and 127.0.0.2 as fallbacks.
|
||||
system.nssModules = [ pkgs.systemd ];
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.powerManagement;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
powerManagement = {
|
||||
|
||||
enable = mkOption {
|
||||
default = true;
|
||||
description =
|
||||
''
|
||||
Whether to enable power management. This includes support
|
||||
for suspend-to-RAM and powersave features on laptops.
|
||||
'';
|
||||
};
|
||||
|
||||
resumeCommands = mkOption {
|
||||
default = "";
|
||||
description = "Commands executed after the system resumes from suspend-to-RAM.";
|
||||
};
|
||||
|
||||
powerUpCommands = mkOption {
|
||||
default = "";
|
||||
example = "${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda";
|
||||
description =
|
||||
''
|
||||
Commands executed when the machine powers up. That is,
|
||||
they're executed both when the system first boots and when
|
||||
it resumes from suspend or hibernation.
|
||||
'';
|
||||
};
|
||||
|
||||
powerDownCommands = mkOption {
|
||||
default = "";
|
||||
example = "${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda";
|
||||
description =
|
||||
''
|
||||
Commands executed when the machine powers down. That is,
|
||||
they're executed both when the system shuts down and when
|
||||
it goes to suspend or hibernation.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
# Enable the ACPI daemon. Not sure whether this is essential.
|
||||
services.acpid.enable = true;
|
||||
|
||||
boot.kernelModules =
|
||||
[ "acpi_cpufreq" "powernow-k8" "cpufreq_performance" "cpufreq_powersave" "cpufreq_ondemand"
|
||||
"cpufreq_conservative"
|
||||
];
|
||||
|
||||
powerManagement.cpuFreqGovernor = mkDefault "ondemand";
|
||||
powerManagement.scsiLinkPolicy = mkDefault "min_power";
|
||||
|
||||
systemd.targets.post-resume = {
|
||||
description = "Post-Resume Actions";
|
||||
requires = [ "post-resume.service" ];
|
||||
after = [ "post-resume.service" ];
|
||||
wantedBy = [ "sleep.target" ];
|
||||
unitConfig.StopWhenUnneeded = true;
|
||||
};
|
||||
|
||||
# Service executed before suspending/hibernating.
|
||||
systemd.services."pre-sleep" =
|
||||
{ description = "Pre-Sleep Actions";
|
||||
wantedBy = [ "sleep.target" ];
|
||||
before = [ "sleep.target" ];
|
||||
script =
|
||||
''
|
||||
${cfg.powerDownCommands}
|
||||
'';
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
|
||||
systemd.services."post-resume" =
|
||||
{ description = "Post-Resume Actions";
|
||||
after = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
||||
script =
|
||||
''
|
||||
${cfg.resumeCommands}
|
||||
${cfg.powerUpCommands}
|
||||
'';
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
with pkgs;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.hardware.pulseaudio;
|
||||
|
||||
uid = config.ids.uids.pulseaudio;
|
||||
gid = config.ids.gids.pulseaudio;
|
||||
|
||||
pulseRuntimePath = "/var/run/pulse";
|
||||
|
||||
# Create pulse/client.conf even if PulseAudio is disabled so
|
||||
# that we can disable the autospawn feature in programs that
|
||||
# are built with PulseAudio support (like KDE).
|
||||
clientConf = writeText "client.conf" ''
|
||||
autospawn=${if (cfg.enable && !cfg.systemWide) then "yes" else "no"}
|
||||
${optionalString (cfg.enable && !cfg.systemWide)
|
||||
"daemon-binary=${cfg.package}/bin/pulseaudio"}
|
||||
'';
|
||||
|
||||
# Write an /etc/asound.conf that causes all ALSA applications to
|
||||
# be re-routed to the PulseAudio server through ALSA's Pulse
|
||||
# plugin.
|
||||
alsaConf = writeText "asound.conf" ''
|
||||
pcm_type.pulse {
|
||||
lib ${alsaPlugins}/lib/alsa-lib/libasound_module_pcm_pulse.so
|
||||
}
|
||||
pcm.!default {
|
||||
type pulse
|
||||
hint.description "Default Audio Device (via PulseAudio)"
|
||||
}
|
||||
ctl_type.pulse {
|
||||
lib ${alsaPlugins}/lib/alsa-lib/libasound_module_ctl_pulse.so
|
||||
}
|
||||
ctl.!default {
|
||||
type pulse
|
||||
}
|
||||
'';
|
||||
|
||||
in {
|
||||
|
||||
options = {
|
||||
|
||||
hardware.pulseaudio = {
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to enable the PulseAudio sound server.
|
||||
'';
|
||||
};
|
||||
|
||||
systemWide = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
If false, a PulseAudio server is launched automatically for
|
||||
each user that tries to use the sound system. The server runs
|
||||
with user privileges. This is the recommended and most secure
|
||||
way to use PulseAudio. If true, one system-wide PulseAudio
|
||||
server is launched on boot, running as the user "pulse".
|
||||
Please read the PulseAudio documentation for more details.
|
||||
'';
|
||||
};
|
||||
|
||||
configFile = mkOption {
|
||||
type = types.uniq types.path;
|
||||
default = "${pulseaudio}/etc/pulse/default.pa";
|
||||
description = ''
|
||||
The path to the configuration the PulseAudio server
|
||||
should use. By default, the "default.pa" configuration
|
||||
from the PulseAudio distribution is used.
|
||||
'';
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
default = pulseaudio;
|
||||
example = "pulseaudio.override { jackaudioSupport = true; }";
|
||||
description = ''
|
||||
The PulseAudio derivation to use. This can be used to enable
|
||||
features (such as JACK support) that are not enabled in the
|
||||
default PulseAudio in Nixpkgs.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = mkMerge [
|
||||
{
|
||||
environment.etc = singleton {
|
||||
target = "pulse/client.conf";
|
||||
source = clientConf;
|
||||
};
|
||||
}
|
||||
|
||||
(mkIf cfg.enable {
|
||||
environment.systemPackages = [ cfg.package ];
|
||||
|
||||
environment.etc = singleton {
|
||||
target = "asound.conf";
|
||||
source = alsaConf;
|
||||
};
|
||||
|
||||
# Allow PulseAudio to get realtime priority using rtkit.
|
||||
security.rtkit.enable = true;
|
||||
})
|
||||
|
||||
(mkIf (cfg.enable && !cfg.systemWide) {
|
||||
environment.etc = singleton {
|
||||
target = "pulse/default.pa";
|
||||
source = cfg.configFile;
|
||||
};
|
||||
})
|
||||
|
||||
(mkIf (cfg.enable && cfg.systemWide) {
|
||||
users.extraUsers.pulse = {
|
||||
# For some reason, PulseAudio wants UID == GID.
|
||||
uid = assert uid == gid; uid;
|
||||
group = "pulse";
|
||||
extraGroups = [ "audio" ];
|
||||
description = "PulseAudio system service user";
|
||||
home = pulseRuntimePath;
|
||||
};
|
||||
|
||||
users.extraGroups.pulse.gid = gid;
|
||||
|
||||
systemd.services.pulseaudio = {
|
||||
description = "PulseAudio system-wide server";
|
||||
wantedBy = [ "sound.target" ];
|
||||
before = [ "sound.target" ];
|
||||
path = [ cfg.package ];
|
||||
environment.PULSE_RUNTIME_PATH = pulseRuntimePath;
|
||||
preStart = ''
|
||||
mkdir -p --mode 755 ${pulseRuntimePath}
|
||||
chown -R pulse:pulse ${pulseRuntimePath}
|
||||
'';
|
||||
script = ''
|
||||
exec pulseaudio --system -n --file="${cfg.configFile}"
|
||||
'';
|
||||
};
|
||||
})
|
||||
];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
# This module defines a global environment configuration and
|
||||
# a common configuration for all shells.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.environment;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
environment.variables = mkOption {
|
||||
default = {};
|
||||
description = ''
|
||||
A set of environment variables used in the global environment.
|
||||
The value of each variable can be either a string or a list of
|
||||
strings. The latter is concatenated, interspersed with colon
|
||||
characters.
|
||||
'';
|
||||
type = types.attrsOf (mkOptionType {
|
||||
name = "a string or a list of strings";
|
||||
merge = xs:
|
||||
let xs' = evalProperties xs; in
|
||||
if isList (head xs') then concatLists xs'
|
||||
else if builtins.lessThan 1 (length xs') then abort "variable in ‘environment.variables’ has multiple values"
|
||||
else if !builtins.isString (head xs') then abort "variable in ‘environment.variables’ does not have a string value"
|
||||
else head xs';
|
||||
});
|
||||
apply = mapAttrs (n: v: if isList v then concatStringsSep ":" v else v);
|
||||
};
|
||||
|
||||
environment.profiles = mkOption {
|
||||
default = [];
|
||||
description = ''
|
||||
A list of profiles used to setup the global environment.
|
||||
'';
|
||||
type = types.listOf types.string;
|
||||
};
|
||||
|
||||
environment.profileVariables = mkOption {
|
||||
default = (p: {});
|
||||
description = ''
|
||||
A function which given a profile path should give back
|
||||
a set of environment variables for that profile.
|
||||
'';
|
||||
# !!! this should be of the following type:
|
||||
#type = types.functionTo (types.attrsOf (types.optionSet envVar));
|
||||
# and envVar should be changed to something more like environOpts.
|
||||
# Having unique `value' _or_ multiple `list' is much more useful
|
||||
# than just sticking everything together with ':' unconditionally.
|
||||
# Anyway, to have this type mentioned above
|
||||
# types.optionSet needs to be transformed into a type constructor
|
||||
# (it has a !!! mark on that in nixpkgs)
|
||||
# for now we hack all this to be
|
||||
type = types.functionTo (types.attrsOf (types.listOf types.string));
|
||||
};
|
||||
|
||||
# !!! isn't there a better way?
|
||||
environment.extraInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during global environment initialisation
|
||||
after all variables and profileVariables have been set.
|
||||
This code is asumed to be shell-independent, which means you should
|
||||
stick to pure sh without sh word split.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
environment.shellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during shell initialisation.
|
||||
This code is asumed to be shell-independent, which means you should
|
||||
stick to pure sh without sh word split.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
environment.loginShellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during login shell initialisation.
|
||||
This code is asumed to be shell-independent, which means you should
|
||||
stick to pure sh without sh word split.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
environment.interactiveShellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during interactive shell initialisation.
|
||||
This code is asumed to be shell-independent, which means you should
|
||||
stick to pure sh without sh word split.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
environment.shellAliases = mkOption {
|
||||
default = {};
|
||||
example = { ll = "ls -l"; };
|
||||
description = ''
|
||||
An attribute set that maps aliases (the top level attribute names in
|
||||
this option) to command strings or directly to build outputs. The
|
||||
aliases are added to all users' shells.
|
||||
'';
|
||||
type = types.attrs; # types.attrsOf types.stringOrPath;
|
||||
};
|
||||
|
||||
environment.binsh = mkOption {
|
||||
default = "${config.system.build.binsh}/bin/sh";
|
||||
example = "\${pkgs.dash}/bin/dash";
|
||||
type = types.path;
|
||||
description = ''
|
||||
The shell executable that is linked system-wide to
|
||||
<literal>/bin/sh</literal>. Please note that NixOS assumes all
|
||||
over the place that shell to be Bash, so override the default
|
||||
setting only if you know exactly what you're doing.
|
||||
'';
|
||||
};
|
||||
|
||||
environment.shells = mkOption {
|
||||
default = [];
|
||||
example = [ "/run/current-system/sw/bin/zsh" ];
|
||||
description = ''
|
||||
A list of permissible login shells for user accounts.
|
||||
No need to mention <literal>/bin/sh</literal>
|
||||
here, it is placed into this list implicitly.
|
||||
'';
|
||||
type = types.listOf types.path;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
system.build.binsh = pkgs.bashInteractive;
|
||||
|
||||
environment.etc."shells".text =
|
||||
''
|
||||
${concatStringsSep "\n" cfg.shells}
|
||||
/bin/sh
|
||||
'';
|
||||
|
||||
system.build.setEnvironment = pkgs.writeText "set-environment"
|
||||
''
|
||||
${concatStringsSep "\n" (
|
||||
(mapAttrsToList (n: v: ''export ${n}="${concatStringsSep ":" v}"'')
|
||||
# This line is a kind of a hack because of !!! note above
|
||||
(zipAttrsWith (const concatLists) ([ (mapAttrs (n: v: [ v ]) cfg.variables) ] ++ map cfg.profileVariables cfg.profiles))))}
|
||||
|
||||
${cfg.extraInit}
|
||||
|
||||
# The setuid wrappers override other bin directories.
|
||||
export PATH="${config.security.wrapperDir}:$PATH"
|
||||
|
||||
# ~/bin if it exists overrides other bin directories.
|
||||
export PATH="$HOME/bin:$PATH"
|
||||
'';
|
||||
|
||||
system.activationScripts.binsh = stringAfter [ "stdio" ]
|
||||
''
|
||||
# Create the required /bin/sh symlink; otherwise lots of things
|
||||
# (notably the system() function) won't work.
|
||||
mkdir -m 0755 -p /bin
|
||||
ln -sfn "${cfg.binsh}" /bin/.sh.tmp
|
||||
mv /bin/.sh.tmp /bin/sh # atomically replace /bin/sh
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{ config, pkgs, utils, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
with utils;
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
swapDevices = mkOption {
|
||||
default = [];
|
||||
example = [
|
||||
{ device = "/dev/hda7"; }
|
||||
{ device = "/var/swapfile"; }
|
||||
{ label = "bigswap"; }
|
||||
];
|
||||
description = ''
|
||||
The swap devices and swap files. These must have been
|
||||
initialised using <command>mkswap</command>. Each element
|
||||
should be an attribute set specifying either the path of the
|
||||
swap device or file (<literal>device</literal>) or the label
|
||||
of the swap device (<literal>label</literal>, see
|
||||
<command>mkswap -L</command>). Using a label is
|
||||
recommended.
|
||||
'';
|
||||
|
||||
type = types.listOf types.optionSet;
|
||||
|
||||
options = {config, options, ...}: {
|
||||
|
||||
options = {
|
||||
|
||||
device = mkOption {
|
||||
example = "/dev/sda3";
|
||||
type = types.uniq types.string;
|
||||
description = "Path of the device.";
|
||||
};
|
||||
|
||||
label = mkOption {
|
||||
example = "swap";
|
||||
type = types.uniq types.string;
|
||||
description = ''
|
||||
Label of the device. Can be used instead of <varname>device</varname>.
|
||||
'';
|
||||
};
|
||||
|
||||
size = mkOption {
|
||||
default = null;
|
||||
example = 2048;
|
||||
type = types.nullOr types.int;
|
||||
description = ''
|
||||
If this option is set, ‘device’ is interpreted as the
|
||||
path of a swapfile that will be created automatically
|
||||
with the indicated size (in megabytes) if it doesn't
|
||||
exist.
|
||||
'';
|
||||
};
|
||||
|
||||
priority = mkOption {
|
||||
default = null;
|
||||
example = 2048;
|
||||
type = types.nullOr types.int;
|
||||
description = ''
|
||||
Specify the priority of the swap device. Priority is a value between 0 and 32767.
|
||||
Higher numbers indicate higher priority.
|
||||
null lets the kernel choose a priority, which will show up as a negative value.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
device =
|
||||
if options.label.isDefined then
|
||||
"/dev/disk/by-label/${config.label}"
|
||||
else
|
||||
mkNotdef;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = mkIf ((length config.swapDevices) != 0) {
|
||||
|
||||
system.requiredKernelConfig = with config.lib.kernelConfig; [
|
||||
(isYes "SWAP")
|
||||
];
|
||||
|
||||
# Create missing swapfiles.
|
||||
# FIXME: support changing the size of existing swapfiles.
|
||||
systemd.services =
|
||||
let
|
||||
|
||||
createSwapDevice = sw:
|
||||
assert sw.device != "";
|
||||
let device' = escapeSystemdPath sw.device; in
|
||||
nameValuePair "mkswap-${escapeSystemdPath sw.device}"
|
||||
{ description = "Initialisation of Swapfile ${sw.device}";
|
||||
wantedBy = [ "${device'}.swap" ];
|
||||
before = [ "${device'}.swap" ];
|
||||
path = [ pkgs.utillinux ];
|
||||
script =
|
||||
''
|
||||
if [ ! -e "${sw.device}" ]; then
|
||||
fallocate -l ${toString sw.size}M "${sw.device}" ||
|
||||
dd if=/dev/zero of="${sw.device}" bs=1M count=${toString sw.size}
|
||||
mkswap ${sw.device}
|
||||
fi
|
||||
'';
|
||||
unitConfig.RequiresMountsFor = [ "${dirOf sw.device}" ];
|
||||
unitConfig.DefaultDependencies = false; # needed to prevent a cycle
|
||||
serviceConfig.Type = "oneshot";
|
||||
};
|
||||
|
||||
in listToAttrs (map createSwapDevice (filter (sw: sw.size != null) config.swapDevices));
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
sysctlOption = mkOptionType {
|
||||
name = "sysctl option value";
|
||||
check = x: builtins.isBool x || builtins.isString x || builtins.isInt x;
|
||||
merge = xs: last xs; # FIXME: hacky way to allow overriding in configuration.nix.
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
boot.kernel.sysctl = mkOption {
|
||||
default = {};
|
||||
example = {
|
||||
"net.ipv4.tcp_syncookies" = false;
|
||||
"vm.swappiness" = 60;
|
||||
};
|
||||
type = types.attrsOf sysctlOption;
|
||||
description = ''
|
||||
Runtime parameters of the Linux kernel, as set by
|
||||
<citerefentry><refentrytitle>sysctl</refentrytitle>
|
||||
<manvolnum>8</manvolnum></citerefentry>. Note that sysctl
|
||||
parameters names must be enclosed in quotes
|
||||
(e.g. <literal>"vm.swappiness"</literal> instead of
|
||||
<literal>vm.swappiness</literal>). The value of each parameter
|
||||
may be a string, integer or Boolean.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
environment.etc."sysctl.d/nixos.conf".text =
|
||||
concatStrings (mapAttrsToList (n: v: "${n}=${if v == false then "0" else toString v}\n") config.boot.kernel.sysctl);
|
||||
|
||||
systemd.services.systemd-sysctl =
|
||||
{ description = "Apply Kernel Variables";
|
||||
before = [ "sysinit.target" "shutdown.target" ];
|
||||
wantedBy = [ "sysinit.target" "multi-user.target" ];
|
||||
restartTriggers = [ config.environment.etc."sysctl.d/nixos.conf".source ];
|
||||
unitConfig.DefaultDependencies = false; # needed to prevent a cycle
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
ExecStart = "${config.systemd.package}/lib/systemd/systemd-sysctl";
|
||||
};
|
||||
};
|
||||
|
||||
# Enable hardlink and symlink restrictions. See
|
||||
# https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=800179c9b8a1e796e441674776d11cd4c05d61d7
|
||||
# for details.
|
||||
boot.kernel.sysctl."fs.protected_hardlinks" = true;
|
||||
boot.kernel.sysctl."fs.protected_symlinks" = true;
|
||||
|
||||
# Hide kernel pointers (e.g. in /proc/modules) for unprivileged
|
||||
# users as these make it easier to exploit kernel vulnerabilities.
|
||||
boot.kernel.sysctl."kernel.kptr_restrict" = 1;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
# This module defines the packages that appear in
|
||||
# /run/current-system/sw.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.environment;
|
||||
|
||||
extraManpages = pkgs.runCommand "extra-manpages" { buildInputs = [ pkgs.help2man ]; }
|
||||
''
|
||||
mkdir -p $out/share/man/man1
|
||||
help2man ${pkgs.gnutar}/bin/tar > $out/share/man/man1/tar.1
|
||||
'';
|
||||
|
||||
requiredPackages =
|
||||
[ config.environment.nix
|
||||
pkgs.acl
|
||||
pkgs.attr
|
||||
pkgs.bashInteractive # bash with ncurses support
|
||||
pkgs.bzip2
|
||||
pkgs.coreutils
|
||||
pkgs.cpio
|
||||
pkgs.curl
|
||||
pkgs.diffutils
|
||||
pkgs.eject # HAL depends on it anyway
|
||||
pkgs.findutils
|
||||
pkgs.gawk
|
||||
pkgs.glibc # for ldd, getent
|
||||
pkgs.gnugrep
|
||||
pkgs.gnupatch
|
||||
pkgs.gnused
|
||||
pkgs.gnutar
|
||||
pkgs.gzip
|
||||
pkgs.xz
|
||||
pkgs.less
|
||||
pkgs.libcap
|
||||
pkgs.man
|
||||
pkgs.nano
|
||||
pkgs.ncurses
|
||||
pkgs.netcat
|
||||
pkgs.openssh
|
||||
pkgs.pciutils
|
||||
pkgs.perl
|
||||
pkgs.procps
|
||||
pkgs.rsync
|
||||
pkgs.strace
|
||||
pkgs.sysvtools
|
||||
pkgs.time
|
||||
pkgs.usbutils
|
||||
pkgs.utillinux
|
||||
extraManpages
|
||||
];
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
environment = {
|
||||
|
||||
systemPackages = mkOption {
|
||||
default = [];
|
||||
example = "[ pkgs.icecat3 pkgs.thunderbird ]";
|
||||
description = ''
|
||||
The set of packages that appear in
|
||||
/run/current-system/sw. These packages are
|
||||
automatically available to all users, and are
|
||||
automatically updated every time you rebuild the system
|
||||
configuration. (The latter is the main difference with
|
||||
installing them in the default profile,
|
||||
<filename>/nix/var/nix/profiles/default</filename>.
|
||||
'';
|
||||
};
|
||||
|
||||
pathsToLink = mkOption {
|
||||
# Note: We need `/lib' to be among `pathsToLink' for NSS modules
|
||||
# to work.
|
||||
default = [];
|
||||
example = ["/"];
|
||||
description = "List of directories to be symlinked in `/run/current-system/sw'.";
|
||||
};
|
||||
};
|
||||
|
||||
system = {
|
||||
|
||||
path = mkOption {
|
||||
default = cfg.systemPackages;
|
||||
description = ''
|
||||
The packages you want in the boot environment.
|
||||
'';
|
||||
|
||||
apply = list: pkgs.buildEnv {
|
||||
name = "system-path";
|
||||
paths = list;
|
||||
inherit (cfg) pathsToLink;
|
||||
ignoreCollisions = true;
|
||||
# !!! Hacky, should modularise.
|
||||
postBuild =
|
||||
''
|
||||
if [ -x $out/bin/update-mime-database -a -w $out/share/mime/packages ]; then
|
||||
$out/bin/update-mime-database -V $out/share/mime
|
||||
fi
|
||||
|
||||
if [ -x $out/bin/gtk-update-icon-cache -a -f $out/share/icons/hicolor/index.theme ]; then
|
||||
$out/bin/gtk-update-icon-cache $out/share/icons/hicolor
|
||||
fi
|
||||
|
||||
if [ -x $out/bin/glib-compile-schemas -a -w $out/share/glib-2.0/schemas ]; then
|
||||
$out/bin/glib-compile-schemas $out/share/glib-2.0/schemas
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
environment.systemPackages = requiredPackages;
|
||||
|
||||
environment.pathsToLink =
|
||||
[ "/bin"
|
||||
"/etc/xdg"
|
||||
"/info"
|
||||
"/lib"
|
||||
"/man"
|
||||
"/sbin"
|
||||
"/share/emacs"
|
||||
"/share/org"
|
||||
"/share/info"
|
||||
"/share/terminfo"
|
||||
"/share/man"
|
||||
];
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
time = {
|
||||
|
||||
timeZone = mkOption {
|
||||
default = "CET";
|
||||
type = with types; uniq string;
|
||||
example = "America/New_York";
|
||||
description = "The time zone used when displaying times and dates.";
|
||||
};
|
||||
|
||||
hardwareClockInLocalTime = mkOption {
|
||||
default = false;
|
||||
description = "If set, keep the hardware clock in local time instead of UTC.";
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
environment.variables.TZDIR = "/etc/zoneinfo";
|
||||
environment.variables.TZ = config.time.timeZone;
|
||||
|
||||
environment.etc.localtime.source = "${pkgs.tzdata}/share/zoneinfo/${config.time.timeZone}";
|
||||
|
||||
environment.etc.zoneinfo.source = "${pkgs.tzdata}/share/zoneinfo";
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
# 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
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
environment.unixODBCDrivers = mkOption {
|
||||
default = [];
|
||||
example = literalExample "map (x : x.ini) (with pkgs.unixODBCDrivers; [ mysql psql psqlng ] )";
|
||||
description = ''
|
||||
Specifies Unix ODBC drivers to be registered in
|
||||
<filename>/etc/odbcinst.ini</filename>. You may also want to
|
||||
add <literal>pkgs.unixODBC</literal> to the system path to get
|
||||
a command line client to connnect to ODBC databases.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf (config.environment.unixODBCDrivers != []) {
|
||||
|
||||
environment.etc."odbcinst.ini".text =
|
||||
let inis = config.environment.unixODBCDrivers;
|
||||
in pkgs.lib.concatStringsSep "\n" inis;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,315 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
ids = config.ids;
|
||||
users = config.users;
|
||||
|
||||
userOpts = { name, config, ... }: {
|
||||
|
||||
options = {
|
||||
|
||||
name = mkOption {
|
||||
type = with types; uniq string;
|
||||
description = "The name of the user account. If undefined, the name of the attribute set will be used.";
|
||||
};
|
||||
|
||||
description = mkOption {
|
||||
type = with types; uniq string;
|
||||
default = "";
|
||||
description = "A short description of the user account.";
|
||||
};
|
||||
|
||||
uid = mkOption {
|
||||
type = with types; uniq (nullOr int);
|
||||
default = null;
|
||||
description = "The account UID. If undefined, NixOS will select a free UID.";
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = with types; uniq string;
|
||||
default = "nogroup";
|
||||
description = "The user's primary group.";
|
||||
};
|
||||
|
||||
extraGroups = mkOption {
|
||||
type = types.listOf types.string;
|
||||
default = [];
|
||||
description = "The user's auxiliary groups.";
|
||||
};
|
||||
|
||||
home = mkOption {
|
||||
type = with types; uniq string;
|
||||
default = "/var/empty";
|
||||
description = "The user's home directory.";
|
||||
};
|
||||
|
||||
shell = mkOption {
|
||||
type = with types; uniq string;
|
||||
default = "/run/current-system/sw/sbin/nologin";
|
||||
description = "The path to the user's shell.";
|
||||
};
|
||||
|
||||
createHome = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "If true, the home directory will be created automatically.";
|
||||
};
|
||||
|
||||
useDefaultShell = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "If true, the user's shell will be set to <literal>users.defaultUserShell</literal>.";
|
||||
};
|
||||
|
||||
password = mkOption {
|
||||
type = with types; uniq (nullOr string);
|
||||
default = null;
|
||||
description = "The user's password. If undefined, no password is set for the user. Warning: do not set confidential information here because this data would be readable by all. This option should only be used for public account such as guest.";
|
||||
};
|
||||
|
||||
isSystemUser = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Indicates if the user is a system user or not.";
|
||||
};
|
||||
|
||||
createUser = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "
|
||||
Indicates if the user should be created automatically as a local user.
|
||||
Set this to false if the user for instance is an LDAP user. NixOS will
|
||||
then not modify any of the basic properties for the user account.
|
||||
";
|
||||
};
|
||||
|
||||
isAlias = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = "If true, the UID of this user is not required to be unique and can thus alias another user.";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
name = mkDefault name;
|
||||
uid = mkDefault (attrByPath [name] null ids.uids);
|
||||
shell = mkIf config.useDefaultShell (mkDefault users.defaultUserShell);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
groupOpts = { name, config, ... }: {
|
||||
|
||||
options = {
|
||||
|
||||
name = mkOption {
|
||||
type = with types; uniq string;
|
||||
description = "The name of the group. If undefined, the name of the attribute set will be used.";
|
||||
};
|
||||
|
||||
gid = mkOption {
|
||||
type = with types; uniq (nullOr int);
|
||||
default = null;
|
||||
description = "The GID of the group. If undefined, NixOS will select a free GID.";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
name = mkDefault name;
|
||||
gid = mkDefault (attrByPath [name] null ids.gids);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
# Note: the 'X' in front of the password is to distinguish between
|
||||
# having an empty password, and not having a password.
|
||||
serializedUser = u: "${u.name}\n${u.description}\n${if u.uid != null then toString u.uid else ""}\n${u.group}\n${toString (concatStringsSep "," u.extraGroups)}\n${u.home}\n${u.shell}\n${toString u.createHome}\n${if u.password != null then "X" + u.password else ""}\n${toString u.isSystemUser}\n${toString u.createUser}\n${toString u.isAlias}\n";
|
||||
|
||||
usersFile = pkgs.writeText "users" (
|
||||
let
|
||||
p = partition (u: u.isAlias) (attrValues config.users.extraUsers);
|
||||
in concatStrings (map serializedUser p.wrong ++ map serializedUser p.right));
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
users.extraUsers = mkOption {
|
||||
default = {};
|
||||
type = types.loaOf types.optionSet;
|
||||
example = {
|
||||
alice = {
|
||||
uid = 1234;
|
||||
description = "Alice";
|
||||
home = "/home/alice";
|
||||
createHome = true;
|
||||
group = "users";
|
||||
extraGroups = ["wheel"];
|
||||
shell = "/bin/sh";
|
||||
password = "foobar";
|
||||
};
|
||||
};
|
||||
description = ''
|
||||
Additional user accounts to be created automatically by the system.
|
||||
This can also be used to set options for root.
|
||||
'';
|
||||
options = [ userOpts ];
|
||||
};
|
||||
|
||||
users.extraGroups = mkOption {
|
||||
default = {};
|
||||
example =
|
||||
{ students.gid = 1001;
|
||||
hackers = { };
|
||||
};
|
||||
type = types.loaOf types.optionSet;
|
||||
description = ''
|
||||
Additional groups to be created automatically by the system.
|
||||
'';
|
||||
options = [ groupOpts ];
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = {
|
||||
|
||||
users.extraUsers = {
|
||||
root = {
|
||||
description = "System administrator";
|
||||
home = "/root";
|
||||
shell = config.users.defaultUserShell;
|
||||
group = "root";
|
||||
};
|
||||
nobody = {
|
||||
description = "Unprivileged account (don't use!)";
|
||||
};
|
||||
};
|
||||
|
||||
users.extraGroups = {
|
||||
root = { };
|
||||
wheel = { };
|
||||
disk = { };
|
||||
kmem = { };
|
||||
tty = { };
|
||||
floppy = { };
|
||||
uucp = { };
|
||||
lp = { };
|
||||
cdrom = { };
|
||||
tape = { };
|
||||
audio = { };
|
||||
video = { };
|
||||
dialout = { };
|
||||
nogroup = { };
|
||||
users = { };
|
||||
nixbld = { };
|
||||
utmp = { };
|
||||
adm = { }; # expected by journald
|
||||
};
|
||||
|
||||
system.activationScripts.rootPasswd = stringAfter [ "etc" ]
|
||||
''
|
||||
# If there is no password file yet, create a root account with an
|
||||
# empty password.
|
||||
if ! test -e /etc/passwd; then
|
||||
rootHome=/root
|
||||
touch /etc/passwd; chmod 0644 /etc/passwd
|
||||
touch /etc/group; chmod 0644 /etc/group
|
||||
touch /etc/shadow; chmod 0600 /etc/shadow
|
||||
# Can't use useradd, since it complains that it doesn't know us
|
||||
# (bootstrap problem!).
|
||||
echo "root:x:0:0:System administrator:$rootHome:${config.users.defaultUserShell}" >> /etc/passwd
|
||||
echo "root::::::::" >> /etc/shadow
|
||||
fi
|
||||
'';
|
||||
|
||||
system.activationScripts.users = stringAfter [ "groups" ]
|
||||
''
|
||||
echo "updating users..."
|
||||
|
||||
cat ${usersFile} | while true; do
|
||||
read name || break
|
||||
read description
|
||||
read uid
|
||||
read group
|
||||
read extraGroups
|
||||
read home
|
||||
read shell
|
||||
read createHome
|
||||
read password
|
||||
read isSystemUser
|
||||
read createUser
|
||||
read isAlias
|
||||
|
||||
if [ -z "$createUser" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if ! curEnt=$(getent passwd "$name"); then
|
||||
useradd ''${isSystemUser:+--system} \
|
||||
--comment "$description" \
|
||||
''${uid:+--uid $uid} \
|
||||
--gid "$group" \
|
||||
--groups "$extraGroups" \
|
||||
--home "$home" \
|
||||
--shell "$shell" \
|
||||
''${createHome:+--create-home} \
|
||||
''${isAlias:+--non-unique} \
|
||||
"$name"
|
||||
if test "''${password:0:1}" = 'X'; then
|
||||
(echo "''${password:1}"; echo "''${password:1}") | ${pkgs.shadow}/bin/passwd "$name"
|
||||
fi
|
||||
else
|
||||
#echo "updating user $name..."
|
||||
oldIFS="$IFS"; IFS=:; set -- $curEnt; IFS="$oldIFS"
|
||||
prevUid=$3
|
||||
prevHome=$6
|
||||
# Don't change the home directory if it's the same to prevent
|
||||
# unnecessary warnings about logged in users.
|
||||
if test "$prevHome" = "$home"; then unset home; fi
|
||||
usermod \
|
||||
--comment "$description" \
|
||||
--gid "$group" \
|
||||
--groups "$extraGroups" \
|
||||
''${home:+--home "$home"} \
|
||||
--shell "$shell" \
|
||||
"$name"
|
||||
fi
|
||||
|
||||
done
|
||||
'';
|
||||
|
||||
system.activationScripts.groups = stringAfter [ "rootPasswd" "binsh" "etc" "var" ]
|
||||
''
|
||||
echo "updating groups..."
|
||||
|
||||
createGroup() {
|
||||
name="$1"
|
||||
gid="$2"
|
||||
|
||||
if ! curEnt=$(getent group "$name"); then
|
||||
groupadd --system \
|
||||
''${gid:+--gid $gid} \
|
||||
"$name"
|
||||
fi
|
||||
}
|
||||
|
||||
${flip concatMapStrings (attrValues config.users.extraGroups) (g: ''
|
||||
createGroup '${g.name}' '${toString g.gid}'
|
||||
'')}
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
hardware.enableAllFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want to enable all the firmware shipped with Debian/Ubuntu.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.hardware.enableAllFirmware {
|
||||
hardware.firmware = [ "${pkgs.firmwareLinuxNonfree}/lib/firmware" ];
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
hardware.cpu.amd.updateMicrocode = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
Update the CPU microcode for AMD processors.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf config.hardware.cpu.amd.updateMicrocode {
|
||||
hardware.firmware = [ "${pkgs.amdUcode}/lib/firmware" ];
|
||||
boot.kernelModules = [ "microcode" ];
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = mkOption {
|
||||
default = false;
|
||||
type = types.bool;
|
||||
description = ''
|
||||
Update the CPU microcode for Intel processors.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf config.hardware.cpu.intel.updateMicrocode {
|
||||
hardware.firmware = [ "${pkgs.microcodeIntel}/lib/firmware" ];
|
||||
boot.kernelModules = [ "microcode" ];
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
let kernelVersion = config.boot.kernelPackages.kernel.version; in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableB43Firmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want firmware for the NICs supported by the b43 module.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableB43Firmware {
|
||||
assertions = [ {
|
||||
assertion = builtins.lessThan 0 (builtins.compareVersions kernelVersion "3.2");
|
||||
message = "b43 firmware for kernels older than 3.2 not packaged yet!";
|
||||
} ];
|
||||
hardware.firmware = [ pkgs.b43Firmware_5_1_138 ];
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableIntel2100BGFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want firmware for the Intel
|
||||
PRO/Wireless 2100BG to be loaded automatically. This is
|
||||
required if you want to use this device.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableIntel2100BGFirmware {
|
||||
|
||||
hardware.enableAllFirmware = true;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableIntel2200BGFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want firmware for the Intel
|
||||
PRO/Wireless 2200BG to be loaded automatically. This is
|
||||
required if you want to use this device.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableIntel2200BGFirmware {
|
||||
|
||||
hardware.enableAllFirmware = true;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableIntel3945ABGFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
This option enables automatic loading of the firmware for the Intel
|
||||
PRO/Wireless 3945ABG.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableIntel3945ABGFirmware {
|
||||
|
||||
hardware.enableAllFirmware = true;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableRalinkFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want firmware for the RT73 NIC.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableRalinkFirmware {
|
||||
hardware.enableAllFirmware = true;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
networking.enableRTL8192cFirmware = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = pkgs.lib.types.bool;
|
||||
description = ''
|
||||
Turn on this option if you want firmware for the RTL8192c (and related) NICs.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = pkgs.lib.mkIf config.networking.enableRTL8192cFirmware {
|
||||
hardware.enableAllFirmware = true;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
{
|
||||
hardware = {
|
||||
pcmcia = {
|
||||
firmware = [ (pkgs.lib.cleanSource ./firmware) ];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
vers_1 5.0, "SMC", "SMC2632W", "Version 01.02", ""
|
||||
manfid 0x0156, 0x0002
|
||||
funcid network_adapter
|
||||
cftable_entry 0x01 [default]
|
||||
Vcc Vmin 3000mV Vmax 3300mV Iavg 300mA Ipeak 300mA
|
||||
Idown 10mA
|
||||
io 0x0000-0x003f [lines=6] [16bit]
|
||||
irq mask 0xffff [level] [pulse]
|
||||
@@ -0,0 +1,5 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
{
|
||||
hardware.firmware = [ pkgs.zd1211fw ];
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
pcmciaUtils = pkgs.pcmciaUtils.passthru.function {
|
||||
inherit (config.hardware.pcmcia) firmware config;
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
hardware.pcmcia = {
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
merge = mergeEnableOption;
|
||||
description = ''
|
||||
Enable this option to support PCMCIA card.
|
||||
'';
|
||||
};
|
||||
|
||||
firmware = mkOption {
|
||||
default = [];
|
||||
merge = mergeListOption;
|
||||
description = ''
|
||||
List of firmware used to handle specific PCMCIA card.
|
||||
'';
|
||||
};
|
||||
|
||||
config = mkOption {
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the configuration file which map the memory, irq
|
||||
and ports used by the PCMCIA hardware.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf config.hardware.pcmcia.enable {
|
||||
|
||||
boot.kernelModules = [ "pcmcia" ];
|
||||
|
||||
services.udev.packages = [ pcmciaUtils ];
|
||||
|
||||
environment.systemPackages = [ pcmciaUtils ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
let
|
||||
wis_go7007 = config.boot.kernelPackages.wis_go7007;
|
||||
in
|
||||
|
||||
{
|
||||
boot.extraModulePackages = [wis_go7007];
|
||||
|
||||
environment.systemPackages = [wis_go7007];
|
||||
|
||||
hardware.firmware = ["${wis_go7007}/firmware"];
|
||||
|
||||
services.udev.packages = [wis_go7007];
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
# Provide an initial copy of the NixOS channel so that the user
|
||||
# doesn't need to run "nix-channel --update" first.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
# We need a copy of the Nix expressions for Nixpkgs and NixOS on the
|
||||
# CD. These are installed into the "nixos" channel of the root
|
||||
# user, as expected by nixos-rebuild/nixos-install.
|
||||
channelSources = pkgs.runCommand "nixos-${config.system.nixosVersion}"
|
||||
{ expr = builtins.readFile ../../../lib/channel-expr.nix; }
|
||||
''
|
||||
mkdir -p $out/nixos
|
||||
cp -prd ${cleanSource ../../..} $out/nixos/nixos
|
||||
cp -prd ${cleanSource <nixpkgs>} $out/nixos/nixpkgs
|
||||
chmod -R u+w $out/nixos/nixos
|
||||
echo -n ${config.system.nixosVersion} > $out/nixos/nixos/.version
|
||||
echo -n "" > $out/nixos/nixos/.version-suffix
|
||||
echo "$expr" > $out/nixos/default.nix
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
# Provide the NixOS/Nixpkgs sources in /etc/nixos. This is required
|
||||
# for nixos-install.
|
||||
boot.postBootCommands =
|
||||
''
|
||||
if ! [ -e /var/lib/nixos/did-channel-init ]; then
|
||||
echo "unpacking the NixOS/Nixpkgs sources..."
|
||||
mkdir -p /nix/var/nix/profiles/per-user/root
|
||||
${config.environment.nix}/bin/nix-env -p /nix/var/nix/profiles/per-user/root/channels \
|
||||
-i ${channelSources} --quiet --option use-substitutes false
|
||||
mkdir -m 0700 -p /root/.nix-defexpr
|
||||
ln -s /nix/var/nix/profiles/per-user/root/channels /root/.nix-defexpr/channels
|
||||
mkdir -m 0755 -p /var/lib/nixos
|
||||
touch /var/lib/nixos/did-channel-init
|
||||
fi
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
# This module contains the basic configuration for building a NixOS
|
||||
# installation CD.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
imports =
|
||||
[ ./channel.nix
|
||||
./iso-image.nix
|
||||
|
||||
# Profiles of this basic installation CD.
|
||||
../../profiles/all-hardware.nix
|
||||
../../profiles/base.nix
|
||||
../../profiles/installation-device.nix
|
||||
];
|
||||
|
||||
# ISO naming.
|
||||
isoImage.isoName = "${config.isoImage.isoBaseName}-${config.system.nixosVersion}-${pkgs.stdenv.system}.iso";
|
||||
|
||||
isoImage.volumeID = substring 0 32 "NIXOS_${config.system.nixosVersion}";
|
||||
|
||||
# Make the installer more likely to succeed in low memory
|
||||
# environments. The kernel's overcommit heustistics bite us
|
||||
# fairly often, preventing processes such as nix-worker or
|
||||
# download-using-manifests.pl from forking even if there is
|
||||
# plenty of free memory.
|
||||
boot.kernel.sysctl."vm.overcommit_memory" = "1";
|
||||
|
||||
# To speed up installation a little bit, include the complete stdenv
|
||||
# in the Nix store on the CD.
|
||||
isoImage.storeContents = [ pkgs.stdenv pkgs.busybox ];
|
||||
|
||||
# Add Memtest86+ to the CD.
|
||||
boot.loader.grub.memtest86 = true;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Move into base image once using 3.10 or later
|
||||
|
||||
require = [ ./installation-cd-minimal.nix ];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_3_10;
|
||||
|
||||
# Get a console as soon as the initrd loads fbcon on EFI boot
|
||||
boot.initrd.kernelModules = [ "fbcon" ];
|
||||
|
||||
isoImage.makeEfiBootable = true;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
# This module defines a NixOS installation CD that contains X11 and
|
||||
# KDE 4.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
imports = [ ./installation-cd-base.nix ../../profiles/graphical.nix ];
|
||||
|
||||
# Provide wicd for easy wireless configuration.
|
||||
#networking.wicd.enable = true;
|
||||
|
||||
# KDE complains if power management is disabled (to be precise, if
|
||||
# there is no power management backend such as upower).
|
||||
powerManagement.enable = true;
|
||||
|
||||
# Don't start the X server by default.
|
||||
services.xserver.autorun = mkForce false;
|
||||
|
||||
# Auto-login as root.
|
||||
services.xserver.displayManager.kdm.extraConfig =
|
||||
''
|
||||
[X-*-Core]
|
||||
AllowRootLogin=true
|
||||
AutoLoginEnable=true
|
||||
AutoLoginUser=root
|
||||
AutoLoginPass=""
|
||||
'';
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./installation-cd-minimal.nix ];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_3_10;
|
||||
boot.vesa = false;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
# This module defines a small NixOS installation CD. It does not
|
||||
# contain any graphical stuff.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ ./installation-cd-base.nix
|
||||
../../profiles/minimal.nix
|
||||
];
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./installation-cd-graphical.nix ];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_3_10;
|
||||
boot.vesa = false;
|
||||
}
|
||||
@@ -0,0 +1,315 @@
|
||||
# This module creates a bootable ISO image containing the given NixOS
|
||||
# configuration. The derivation for the ISO image will be placed in
|
||||
# config.system.build.isoImage.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
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" { buildInputs = [ pkgs.mtools ]; }
|
||||
''
|
||||
#Let's hope 10M is enough
|
||||
dd bs=2048 count=5120 if=/dev/zero of="$out"
|
||||
${pkgs.dosfstools}/sbin/mkfs.vfat "$out"
|
||||
mmd -i "$out" efi
|
||||
mmd -i "$out" efi/boot
|
||||
mmd -i "$out" efi/nixos
|
||||
mmd -i "$out" loader
|
||||
mmd -i "$out" loader/entries
|
||||
mcopy -v -i "$out" \
|
||||
${pkgs.gummiboot}/lib/gummiboot/gummiboot${targetArch}.efi \
|
||||
::efi/boot/boot${targetArch}.efi
|
||||
mcopy -v -i "$out" \
|
||||
${config.boot.kernelPackages.kernel}/bzImage ::bzImage
|
||||
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
|
||||
mcopy -v -i "$out" boot-params ::loader/entries/nixos-livecd.conf
|
||||
echo "default nixos-livecd" > boot-params
|
||||
echo "timeout 5" >> boot-params
|
||||
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 = {
|
||||
|
||||
isoImage.isoName = mkOption {
|
||||
default = "${config.isoImage.isoName}.iso";
|
||||
description = ''
|
||||
Name of the generated ISO image file.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.isoBaseName = mkOption {
|
||||
default = "nixos";
|
||||
description = ''
|
||||
Prefix of the name of the generated ISO image file.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.compressImage = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether the ISO image should be compressed using
|
||||
<command>bzip2</command>.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.volumeID = mkOption {
|
||||
default = "NIXOS_BOOT_CD";
|
||||
description = ''
|
||||
Specifies the label or volume ID of the generated ISO image.
|
||||
Note that the label is used by stage 1 of the boot process to
|
||||
mount the CD, so it should be reasonably distinctive.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.contents = mkOption {
|
||||
example =
|
||||
[ { source = pkgs.memtest86 + "/memtest.bin";
|
||||
target = "boot/memtest.bin";
|
||||
}
|
||||
];
|
||||
description = ''
|
||||
This option lists files to be copied to fixed locations in the
|
||||
generated ISO image.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.storeContents = mkOption {
|
||||
example = [pkgs.stdenv];
|
||||
description = ''
|
||||
This option lists additional derivations to be included in the
|
||||
Nix store in the generated ISO image.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.includeSystemBuildDependencies = mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
description = ''
|
||||
Set this option to include all the needed sources etc in the
|
||||
image. It significantly increases image size. Use that when
|
||||
you want to be able to keep all the sources needed to build your
|
||||
system or when you are going to install the system on a computer
|
||||
with slow on non-existent network connection.
|
||||
'';
|
||||
};
|
||||
|
||||
isoImage.makeEfiBootable = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Whether the ISO image should be an efi-bootable volume.
|
||||
'';
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = {
|
||||
|
||||
boot.loader.grub.version = 2;
|
||||
|
||||
# Don't build the GRUB menu builder script, since we don't need it
|
||||
# here and it causes a cyclic dependency.
|
||||
boot.loader.grub.enable = false;
|
||||
|
||||
# !!! Hack - attributes expected by other modules.
|
||||
system.boot.loader.kernelFile = "bzImage";
|
||||
environment.systemPackages = [ pkgs.grub2 ];
|
||||
|
||||
# In stage 1 of the boot, mount the CD as the root FS by label so
|
||||
# that we don't need to know its device. We pass the label of the
|
||||
# root filesystem on the kernel command line, rather than in
|
||||
# `fileSystems' below. This allows CD-to-USB converters such as
|
||||
# UNetbootin to rewrite the kernel command line to pass the label or
|
||||
# UUID of the USB stick. It would be nicer to write
|
||||
# `root=/dev/disk/by-label/...' here, but UNetbootin doesn't
|
||||
# recognise that.
|
||||
boot.kernelParams = [ "root=LABEL=${config.isoImage.volumeID}" ];
|
||||
|
||||
# Note that /dev/root is a symlink to the actual root device
|
||||
# specified on the kernel command line, created in the stage 1 init
|
||||
# script.
|
||||
fileSystems."/".device = "/dev/root";
|
||||
|
||||
fileSystems."/nix/store" =
|
||||
{ fsType = "squashfs";
|
||||
device = "/nix-store.squashfs";
|
||||
options = "loop";
|
||||
};
|
||||
|
||||
boot.initrd.availableKernelModules = [ "squashfs" "iso9660" ];
|
||||
|
||||
boot.initrd.kernelModules = [ "loop" ];
|
||||
|
||||
# In stage 1, mount a tmpfs on top of / (the ISO image) and
|
||||
# /nix/store (the squashfs image) to make this a live CD.
|
||||
boot.initrd.postMountCommands =
|
||||
''
|
||||
mkdir -p /unionfs-chroot/ro-root
|
||||
mount --rbind $targetRoot /unionfs-chroot/ro-root
|
||||
|
||||
mkdir /unionfs-chroot/rw-root
|
||||
mount -t tmpfs -o "mode=755" none /unionfs-chroot/rw-root
|
||||
mkdir /mnt-root-union
|
||||
unionfs -o allow_other,cow,chroot=/unionfs-chroot,max_files=32768 /rw-root=RW:/ro-root=RO /mnt-root-union
|
||||
oldTargetRoot=$targetRoot
|
||||
targetRoot=/mnt-root-union
|
||||
|
||||
mkdir /unionfs-chroot/rw-store
|
||||
mount -t tmpfs -o "mode=755" none /unionfs-chroot/rw-store
|
||||
mkdir -p $oldTargetRoot/nix/store
|
||||
unionfs -o allow_other,cow,nonempty,chroot=/unionfs-chroot,max_files=32768 /rw-store=RW:/ro-root/nix/store=RO /mnt-root-union/nix/store
|
||||
'';
|
||||
|
||||
# Closures to be copied to the Nix store on the CD, namely the init
|
||||
# script and the top-level system configuration directory.
|
||||
isoImage.storeContents =
|
||||
[ config.system.build.toplevel ] ++
|
||||
optional config.isoImage.includeSystemBuildDependencies
|
||||
config.system.build.toplevel.drvPath;
|
||||
|
||||
# Create the squashfs image that contains the Nix store.
|
||||
system.build.squashfsStore = import ../../../lib/make-squashfs.nix {
|
||||
inherit (pkgs) stdenv squashfsTools perl pathsFromGraph;
|
||||
storeContents = config.isoImage.storeContents;
|
||||
};
|
||||
|
||||
# Individual files to be included on the CD, outside of the Nix
|
||||
# store on the CD.
|
||||
isoImage.contents =
|
||||
[ { source = grubImage;
|
||||
target = "/boot/grub/grub_eltorito";
|
||||
}
|
||||
{ source = pkgs.substituteAll {
|
||||
name = "grub.cfg";
|
||||
src = pkgs.writeText "grub.cfg-in" grubCfg;
|
||||
bootRoot = "/boot";
|
||||
};
|
||||
target = "/boot/grub/grub.cfg";
|
||||
}
|
||||
{ source = config.boot.kernelPackages.kernel + "/bzImage";
|
||||
target = "/boot/bzImage";
|
||||
}
|
||||
{ source = config.system.build.initialRamdisk + "/initrd";
|
||||
target = "/boot/initrd";
|
||||
}
|
||||
{ source = "${pkgs.grub2}/share/grub/unicode.pf2";
|
||||
target = "/boot/grub/unicode.pf2";
|
||||
}
|
||||
{ source = config.boot.loader.grub.splashImage;
|
||||
target = "/boot/grub/splash.png";
|
||||
}
|
||||
{ source = config.system.build.squashfsStore;
|
||||
target = "/nix-store.squashfs";
|
||||
}
|
||||
{ # Quick hack: need a mount point for the store.
|
||||
source = pkgs.runCommand "empty" {} "mkdir -p $out";
|
||||
target = "/nix/store";
|
||||
}
|
||||
] ++ optionals config.isoImage.makeEfiBootable [
|
||||
{ source = efiImg;
|
||||
target = "/boot/efi.img";
|
||||
}
|
||||
] ++ mapAttrsToList (n: v: { source = v; target = "/boot/${n}"; }) config.boot.loader.grub.extraFiles;
|
||||
|
||||
# The Grub menu.
|
||||
boot.loader.grub.extraEntries =
|
||||
''
|
||||
menuentry "NixOS ${config.system.nixosVersion} Installer" {
|
||||
linux /boot/bzImage init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}
|
||||
initrd /boot/initrd
|
||||
}
|
||||
|
||||
menuentry "Boot from hard disk" {
|
||||
set root=(hd0)
|
||||
chainloader +1
|
||||
}
|
||||
'';
|
||||
|
||||
boot.loader.grub.timeout = 10;
|
||||
|
||||
# Create the ISO image.
|
||||
system.build.isoImage = import ../../../lib/make-iso9660-image.nix ({
|
||||
inherit (pkgs) stdenv perl cdrkit pathsFromGraph;
|
||||
|
||||
inherit (config.isoImage) isoName compressImage volumeID contents;
|
||||
|
||||
bootable = true;
|
||||
bootImage = "/boot/grub/grub_eltorito";
|
||||
} // optionalAttrs config.isoImage.makeEfiBootable {
|
||||
efiBootable = true;
|
||||
efiBootImage = "boot/efi.img";
|
||||
});
|
||||
|
||||
boot.postBootCommands =
|
||||
''
|
||||
# After booting, register the contents of the Nix store on the
|
||||
# CD in the Nix database in the tmpfs.
|
||||
${config.environment.nix}/bin/nix-store --load-db < /nix/store/nix-path-registration
|
||||
|
||||
# nixos-rebuild also requires a "system" profile and an
|
||||
# /etc/NIXOS tag.
|
||||
touch /etc/NIXOS
|
||||
${config.environment.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
|
||||
'';
|
||||
|
||||
# Add vfat support to the initrd to enable people to copy the
|
||||
# contents of the CD to a bootable USB stick. Need unionfs-fuse for union mounts
|
||||
boot.initrd.supportedFilesystems = [ "vfat" "unionfs-fuse" ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./installation-cd-base.nix ];
|
||||
|
||||
# Build the build-time dependencies of this configuration on the DVD
|
||||
# to speed up installation.
|
||||
isoImage.storeContents = [ config.system.build.toplevel.drvPath ];
|
||||
|
||||
# Include lots of packages.
|
||||
environment.systemPackages =
|
||||
[ pkgs.utillinuxCurses
|
||||
pkgs.upstartJobControl
|
||||
pkgs.iproute
|
||||
pkgs.bc
|
||||
pkgs.fuse
|
||||
pkgs.zsh
|
||||
pkgs.sqlite
|
||||
pkgs.gnupg
|
||||
pkgs.manpages
|
||||
pkgs.pinentry
|
||||
pkgs.screen
|
||||
pkgs.patch
|
||||
pkgs.which
|
||||
pkgs.diffutils
|
||||
pkgs.file
|
||||
pkgs.irssi
|
||||
pkgs.mcabber
|
||||
pkgs.mutt
|
||||
pkgs.emacs
|
||||
pkgs.vimHugeX
|
||||
pkgs.bvi
|
||||
pkgs.ddrescue
|
||||
pkgs.cdrkit
|
||||
pkgs.btrfsProgs
|
||||
pkgs.xfsprogs
|
||||
pkgs.jfsutils
|
||||
pkgs.jfsrec
|
||||
pkgs.ntfs3g
|
||||
pkgs.subversion16
|
||||
pkgs.monotone
|
||||
pkgs.git
|
||||
pkgs.darcs
|
||||
pkgs.mercurial
|
||||
pkgs.bazaar
|
||||
pkgs.cvs
|
||||
pkgs.pciutils
|
||||
pkgs.hddtemp
|
||||
pkgs.sdparm
|
||||
pkgs.hdparm
|
||||
pkgs.usbutils
|
||||
pkgs.openssh
|
||||
pkgs.lftp
|
||||
pkgs.w3m
|
||||
pkgs.openssl
|
||||
pkgs.ncat
|
||||
pkgs.lynx
|
||||
pkgs.wget
|
||||
pkgs.elinks
|
||||
pkgs.socat
|
||||
pkgs.squid
|
||||
pkgs.unrar
|
||||
pkgs.zip
|
||||
pkgs.unzip
|
||||
pkgs.lzma
|
||||
pkgs.cabextract
|
||||
pkgs.cpio
|
||||
pkgs.lsof
|
||||
pkgs.ltrace
|
||||
pkgs.perl
|
||||
pkgs.python
|
||||
pkgs.ruby
|
||||
pkgs.guile
|
||||
pkgs.clisp
|
||||
pkgs.tcl
|
||||
];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
# A dummy /etc/nixos/configuration.nix in the booted CD that
|
||||
# rebuilds the CD's configuration (and allows the configuration to
|
||||
# be modified, of course, providing a true live CD). Problem is
|
||||
# that we don't really know how the CD was built - the Nix
|
||||
# expression language doesn't allow us to query the expression being
|
||||
# evaluated. So we'll just hope for the best.
|
||||
dummyConfiguration = pkgs.writeText "configuration.nix"
|
||||
''
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{ # Add your own options below, e.g.:
|
||||
# services.openssh.enable = true;
|
||||
nixpkgs.config.platform = pkgs.platforms.fuloong2f_n32;
|
||||
}
|
||||
'';
|
||||
|
||||
|
||||
pkgs2storeContents = l : map (x: { object = x; symlink = "none"; }) l;
|
||||
|
||||
# A clue for the kernel loading
|
||||
kernelParams = pkgs.writeText "kernel-params.txt" ''
|
||||
Kernel Parameters:
|
||||
init=/boot/init systemConfig=/boot/init ${toString config.boot.kernelParams}
|
||||
'';
|
||||
|
||||
# System wide nixpkgs config
|
||||
nixpkgsUserConfig = pkgs.writeText "config.nix" ''
|
||||
pkgs:
|
||||
{
|
||||
platform = pkgs.platforms.fuloong2f_n32;
|
||||
}
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
imports = [ ./system-tarball.nix ];
|
||||
|
||||
# Disable some other stuff we don't need.
|
||||
security.sudo.enable = false;
|
||||
|
||||
# Include only the en_US locale. This saves 75 MiB or so compared to
|
||||
# the full glibcLocales package.
|
||||
i18n.supportedLocales = ["en_US.UTF-8/UTF-8" "en_US/ISO-8859-1"];
|
||||
|
||||
# Include some utilities that are useful for installing or repairing
|
||||
# the system.
|
||||
environment.systemPackages =
|
||||
[ pkgs.subversion # for nixos-checkout
|
||||
pkgs.w3m # needed for the manual anyway
|
||||
pkgs.testdisk # useful for repairing boot problems
|
||||
pkgs.mssys # for writing Microsoft boot sectors / MBRs
|
||||
pkgs.parted
|
||||
pkgs.ddrescue
|
||||
pkgs.ccrypt
|
||||
pkgs.cryptsetup # needed for dm-crypt volumes
|
||||
|
||||
# Some networking tools.
|
||||
pkgs.sshfsFuse
|
||||
pkgs.socat
|
||||
pkgs.screen
|
||||
pkgs.wpa_supplicant # !!! should use the wpa module
|
||||
|
||||
# Hardware-related tools.
|
||||
pkgs.sdparm
|
||||
pkgs.hdparm
|
||||
pkgs.dmraid
|
||||
|
||||
# Tools to create / manipulate filesystems.
|
||||
pkgs.ntfsprogs # for resizing NTFS partitions
|
||||
pkgs.btrfsProgs
|
||||
pkgs.jfsutils
|
||||
pkgs.jfsrec
|
||||
|
||||
# Some compression/archiver tools.
|
||||
pkgs.unrar
|
||||
pkgs.unzip
|
||||
pkgs.zip
|
||||
pkgs.xz
|
||||
pkgs.dar # disk archiver
|
||||
|
||||
# Some editors.
|
||||
pkgs.nvi
|
||||
pkgs.bvi # binary editor
|
||||
pkgs.joe
|
||||
];
|
||||
|
||||
# The initrd has to contain any module that might be necessary for
|
||||
# mounting the CD/DVD.
|
||||
boot.initrd.availableKernelModules =
|
||||
[ "vfat" "reiserfs" ];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_3_10;
|
||||
boot.kernelParams = [ "console=tty1" ];
|
||||
|
||||
boot.postBootCommands =
|
||||
''
|
||||
mkdir -p /mnt
|
||||
|
||||
cp ${dummyConfiguration} /etc/nixos/configuration.nix
|
||||
'';
|
||||
|
||||
# Some more help text.
|
||||
services.mingetty.helpLine =
|
||||
''
|
||||
|
||||
Log in as "root" with an empty password. ${
|
||||
if config.services.xserver.enable then
|
||||
"Type `start xserver' to start\nthe graphical user interface."
|
||||
else ""
|
||||
}
|
||||
'';
|
||||
|
||||
# Include the firmware for various wireless cards.
|
||||
networking.enableRalinkFirmware = true;
|
||||
networking.enableIntel2200BGFirmware = true;
|
||||
|
||||
# To speed up further installation of packages, include the complete stdenv
|
||||
# in the Nix store of the tarball.
|
||||
tarball.storeContents = pkgs2storeContents [ pkgs.stdenv ]
|
||||
++ [
|
||||
{
|
||||
object = config.system.build.bootStage2;
|
||||
symlink = "/boot/init";
|
||||
}
|
||||
{
|
||||
object = config.system.build.toplevel;
|
||||
symlink = "/boot/system";
|
||||
}
|
||||
];
|
||||
|
||||
tarball.contents = [
|
||||
{ source = kernelParams;
|
||||
target = "/kernelparams.txt";
|
||||
}
|
||||
{ source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile;
|
||||
target = "/boot/" + config.system.boot.loader.kernelFile;
|
||||
}
|
||||
{ source = nixpkgsUserConfig;
|
||||
target = "/root/.nixpkgs/config.nix";
|
||||
}
|
||||
];
|
||||
|
||||
# Allow sshd to be started manually through "start sshd". It should
|
||||
# not be started by default on the installation CD because the
|
||||
# default root password is empty.
|
||||
services.openssh.enable = true;
|
||||
|
||||
jobs.openssh.startOn = pkgs.lib.mkOverrideTemplate 50 {} "";
|
||||
|
||||
boot.loader.grub.enable = false;
|
||||
boot.loader.generationsDir.enable = false;
|
||||
system.boot.loader.kernelFile = "vmlinux";
|
||||
|
||||
nixpkgs.config = {
|
||||
platform = pkgs.platforms.fuloong2f_n32;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
Let all the files in the system tarball sit in a directory served by NFS (the
|
||||
NFS root) like this in exportfs:
|
||||
/home/pcroot 192.168.1.0/24(rw,no_root_squash,no_all_squash)
|
||||
|
||||
Run "exportfs -a" after editing /etc/exportfs, for the nfs server to be aware
|
||||
of the changes.
|
||||
|
||||
Use a tftp server serving the root of boot/ (from the system tarball).
|
||||
|
||||
In order to have PXE boot, use the boot/dhcpd.conf-example file for your dhcpd
|
||||
server, as it will point your PXE clients to pxelinux.0 from the tftp server.
|
||||
Adapt the configuration to your network.
|
||||
|
||||
Adapt the pxelinux configuration (boot/pxelinux.cfg/default) to set the path to
|
||||
your nfrroot. If you use ip=dhcp in the kernel, the nfs server ip will be taken
|
||||
from dhcp and so you don't have to specify it.
|
||||
|
||||
The linux in bzImage includes network drivers for some usual cards.
|
||||
|
||||
|
||||
QEMU Testing
|
||||
---------------
|
||||
|
||||
You can test qemu pxe boot without having a DHCP server adapted, but having
|
||||
nfsroot, like this:
|
||||
qemu-system-x86_64 -tftp /home/pcroot/boot -net nic -net user,bootfile=pxelinux.0 -boot n
|
||||
|
||||
I don't know how to use NFS through the qemu '-net user' though.
|
||||
|
||||
|
||||
QEMU Testing with NFS root and bridged network
|
||||
-------------------------------------------------
|
||||
|
||||
This allows testing with qemu as any other host in your LAN.
|
||||
|
||||
Testing with the real dhcpd server requires setting up a bridge and having a
|
||||
tap device.
|
||||
tunctl -t tap0
|
||||
brctl addbr br0
|
||||
brctl addif br0 eth0
|
||||
brctl addif tap0 eth0
|
||||
ifconfig eth0 0.0.0.0 up
|
||||
ifconfig tap0 0.0.0.0 up
|
||||
ifconfig br0 up # With your ip configuration
|
||||
|
||||
Then you can run qemu:
|
||||
qemu-system-x86_64 -boot n -net tap,ifname=tap0,script=no -net nic,model=e1000
|
||||
|
||||
|
||||
Using the system-tarball-pc in a chroot
|
||||
--------------------------------------------------
|
||||
|
||||
Installation:
|
||||
mkdir nixos-chroot && cd nixos-chroot
|
||||
tar xf your-system-tarball.tar.xz
|
||||
mkdir sys dev proc tmp root var run
|
||||
mount --bind /sys sys
|
||||
mount --bind /dev dev
|
||||
mount --bind /proc proc
|
||||
|
||||
Activate the system: look for a directory in nix/store similar to:
|
||||
"/nix/store/y0d1lcj9fppli0hl3x0m0ba5g1ndjv2j-nixos-feb97bx-53f008"
|
||||
Having found it, activate that nixos system *twice*:
|
||||
chroot . /nix/store/SOMETHING-nixos-SOMETHING/activate
|
||||
chroot . /nix/store/SOMETHING-nixos-SOMETHING/activate
|
||||
|
||||
This runs a 'hostname' command. Restore your old hostname with:
|
||||
hostname OLDHOSTNAME
|
||||
|
||||
Copy your system resolv.conf to the /etc/resolv.conf inside the chroot:
|
||||
cp /etc/resolv.conf etc
|
||||
|
||||
Then you can get an interactive shell in the nixos chroot. '*' means
|
||||
to run inside the chroot interactive shell
|
||||
chroot . /bin/sh
|
||||
* source /etc/profile
|
||||
|
||||
Populate the nix database: that should be done in the init script if you
|
||||
had booted this nixos. Run:
|
||||
* `grep local-cmds run/current-system/init`
|
||||
|
||||
Then you can proceed normally subscribing to a nixos channel:
|
||||
nix-channel --add http://nixos.org/channels/nixos-unstable
|
||||
nix-channel --update
|
||||
|
||||
Testing:
|
||||
nix-env -i hello
|
||||
which hello
|
||||
hello
|
||||
@@ -0,0 +1,164 @@
|
||||
# This module contains the basic configuration for building a NixOS
|
||||
# tarball, that can directly boot, maybe using PXE or unpacking on a fs.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
pkgs2storeContents = l : map (x: { object = x; symlink = "none"; }) l;
|
||||
|
||||
# For PXE kernel loading
|
||||
pxeconfig = pkgs.writeText "pxeconfig-default" ''
|
||||
default menu.c32
|
||||
prompt 0
|
||||
|
||||
label bootlocal
|
||||
menu default
|
||||
localboot 0
|
||||
timeout 80
|
||||
TOTALTIMEOUT 9000
|
||||
|
||||
label nixos
|
||||
MENU LABEL ^NixOS using nfsroot
|
||||
KERNEL bzImage
|
||||
append ip=dhcp nfsroot=/home/pcroot systemConfig=${config.system.build.toplevel} init=${config.system.build.toplevel}/init rw
|
||||
|
||||
# I don't know how to make this boot with nfsroot (using the initrd)
|
||||
label nixos_initrd
|
||||
MENU LABEL NixOS booting the poor ^initrd.
|
||||
KERNEL bzImage
|
||||
append initrd=initrd ip=dhcp nfsroot=/home/pcroot systemConfig=${config.system.build.toplevel} init=${config.system.build.toplevel}/init rw
|
||||
|
||||
label memtest
|
||||
MENU LABEL ^${pkgs.memtest86.name}
|
||||
KERNEL memtest
|
||||
'';
|
||||
|
||||
dhcpdExampleConfig = pkgs.writeText "dhcpd.conf-example" ''
|
||||
# Example configuration for booting PXE.
|
||||
allow booting;
|
||||
allow bootp;
|
||||
|
||||
# Adapt this to your network configuration.
|
||||
option domain-name "local";
|
||||
option subnet-mask 255.255.255.0;
|
||||
option broadcast-address 192.168.1.255;
|
||||
option domain-name-servers 192.168.1.1;
|
||||
option routers 192.168.1.1;
|
||||
|
||||
# PXE-specific configuration directives...
|
||||
# Some BIOS don't accept slashes for paths inside the tftp servers,
|
||||
# and will report Access Violation if they see slashes.
|
||||
filename "pxelinux.0";
|
||||
# For the TFTP and NFS root server. Set the IP of your server.
|
||||
next-server 192.168.1.34;
|
||||
|
||||
subnet 192.168.1.0 netmask 255.255.255.0 {
|
||||
range 192.168.1.50 192.168.1.55;
|
||||
}
|
||||
'';
|
||||
|
||||
readme = ./system-tarball-pc-readme.txt;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
imports =
|
||||
[ ./system-tarball.nix
|
||||
|
||||
# Profiles of this basic installation.
|
||||
../../profiles/all-hardware.nix
|
||||
../../profiles/base.nix
|
||||
../../profiles/installation-device.nix
|
||||
];
|
||||
|
||||
# To speed up further installation of packages, include the complete stdenv
|
||||
# in the Nix store of the tarball.
|
||||
tarball.storeContents = pkgs2storeContents [ pkgs.stdenv ];
|
||||
|
||||
tarball.contents =
|
||||
[ { source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile;
|
||||
target = "/boot/" + config.system.boot.loader.kernelFile;
|
||||
}
|
||||
{ source = "${pkgs.syslinux}/share/syslinux/pxelinux.0";
|
||||
target = "/boot/pxelinux.0";
|
||||
}
|
||||
{ source = "${pkgs.syslinux}/share/syslinux/menu.c32";
|
||||
target = "/boot/menu.c32";
|
||||
}
|
||||
{ source = pxeconfig;
|
||||
target = "/boot/pxelinux.cfg/default";
|
||||
}
|
||||
{ source = readme;
|
||||
target = "/readme.txt";
|
||||
}
|
||||
{ source = dhcpdExampleConfig;
|
||||
target = "/boot/dhcpd.conf-example";
|
||||
}
|
||||
{ source = "${pkgs.memtest86}/memtest.bin";
|
||||
# We can't leave '.bin', because pxelinux interprets this specially,
|
||||
# and it would not load the image fine.
|
||||
# http://forum.canardpc.com/threads/46464-0104-when-launched-via-pxe
|
||||
target = "/boot/memtest";
|
||||
}
|
||||
];
|
||||
|
||||
# Allow sshd to be started manually through "start sshd". It should
|
||||
# not be started by default on the installation CD because the
|
||||
# default root password is empty.
|
||||
services.openssh.enable = true;
|
||||
jobs.openssh.startOn = pkgs.lib.mkOverrideTemplate 50 {} "";
|
||||
|
||||
# To be able to use the systemTarball to catch troubles.
|
||||
boot.crashDump = {
|
||||
enable = true;
|
||||
kernelPackages = pkgs.linuxPackages_3_4;
|
||||
};
|
||||
|
||||
# No grub for the tarball.
|
||||
boot.loader.grub.enable = false;
|
||||
|
||||
/* fake entry, just to have a happy stage-1. Users
|
||||
may boot without having stage-1 though */
|
||||
fileSystems = [
|
||||
{ mountPoint = "/";
|
||||
device = "/dev/something";
|
||||
}
|
||||
];
|
||||
|
||||
nixpkgs.config = {
|
||||
packageOverrides = p: rec {
|
||||
linux_3_4 = p.linux_3_4.override {
|
||||
extraConfig = ''
|
||||
# Enable drivers in kernel for most NICs.
|
||||
E1000 y
|
||||
# E1000E y
|
||||
# ATH5K y
|
||||
8139TOO y
|
||||
NE2K_PCI y
|
||||
ATL1 y
|
||||
ATL1E y
|
||||
ATL1C y
|
||||
VORTEX y
|
||||
VIA_RHINE y
|
||||
R8169 y
|
||||
|
||||
# Enable nfs root boot
|
||||
UNIX y # http://www.linux-mips.org/archives/linux-mips/2006-11/msg00113.html
|
||||
IP_PNP y
|
||||
IP_PNP_DHCP y
|
||||
FSCACHE y
|
||||
NFS_FS y
|
||||
NFS_FSCACHE y
|
||||
ROOT_NFS y
|
||||
|
||||
# Enable devtmpfs
|
||||
DEVTMPFS y
|
||||
DEVTMPFS_MOUNT y
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
# This module contains the basic configuration for building a NixOS
|
||||
# tarball for the sheevaplug.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
# A dummy /etc/nixos/configuration.nix in the booted CD that
|
||||
# rebuilds the CD's configuration (and allows the configuration to
|
||||
# be modified, of course, providing a true live CD). Problem is
|
||||
# that we don't really know how the CD was built - the Nix
|
||||
# expression language doesn't allow us to query the expression being
|
||||
# evaluated. So we'll just hope for the best.
|
||||
dummyConfiguration = pkgs.writeText "configuration.nix"
|
||||
''
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Add your own options below and run "nixos-rebuild switch".
|
||||
# E.g.,
|
||||
# services.openssh.enable = true;
|
||||
}
|
||||
'';
|
||||
|
||||
|
||||
pkgs2storeContents = l : map (x: { object = x; symlink = "none"; }) l;
|
||||
|
||||
# A clue for the kernel loading
|
||||
kernelParams = pkgs.writeText "kernel-params.txt" ''
|
||||
Kernel Parameters:
|
||||
init=${config.system.build.toplevel}/init ${toString config.boot.kernelParams}
|
||||
'';
|
||||
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
imports = [ ./system-tarball.nix ];
|
||||
|
||||
# Disable some other stuff we don't need.
|
||||
security.sudo.enable = false;
|
||||
|
||||
# Include only the en_US locale. This saves 75 MiB or so compared to
|
||||
# the full glibcLocales package.
|
||||
i18n.supportedLocales = ["en_US.UTF-8/UTF-8" "en_US/ISO-8859-1"];
|
||||
|
||||
# Include some utilities that are useful for installing or repairing
|
||||
# the system.
|
||||
environment.systemPackages =
|
||||
[ pkgs.subversion # for nixos-checkout
|
||||
pkgs.w3m # needed for the manual anyway
|
||||
pkgs.ddrescue
|
||||
pkgs.ccrypt
|
||||
pkgs.cryptsetup # needed for dm-crypt volumes
|
||||
|
||||
# Some networking tools.
|
||||
pkgs.sshfsFuse
|
||||
pkgs.socat
|
||||
pkgs.screen
|
||||
pkgs.wpa_supplicant # !!! should use the wpa module
|
||||
|
||||
# Hardware-related tools.
|
||||
pkgs.sdparm
|
||||
pkgs.hdparm
|
||||
pkgs.dmraid
|
||||
|
||||
# Tools to create / manipulate filesystems.
|
||||
pkgs.btrfsProgs
|
||||
|
||||
# Some compression/archiver tools.
|
||||
pkgs.unrar
|
||||
pkgs.unzip
|
||||
pkgs.zip
|
||||
pkgs.xz
|
||||
pkgs.dar # disk archiver
|
||||
|
||||
# Some editors.
|
||||
pkgs.nvi
|
||||
pkgs.bvi # binary editor
|
||||
pkgs.joe
|
||||
];
|
||||
|
||||
boot.loader.grub.enable = false;
|
||||
boot.loader.generationsDir.enable = false;
|
||||
system.boot.loader.kernelFile = "uImage";
|
||||
|
||||
boot.initrd.availableKernelModules =
|
||||
[ "mvsdio" "mmc_block" "reiserfs" "ext3" "ums-cypress" "rtc_mv"
|
||||
"ext4" ];
|
||||
|
||||
boot.postBootCommands =
|
||||
''
|
||||
mkdir -p /mnt
|
||||
|
||||
cp ${dummyConfiguration} /etc/nixos/configuration.nix
|
||||
'';
|
||||
|
||||
boot.initrd.extraUtilsCommands =
|
||||
''
|
||||
cp ${pkgs.utillinux}/sbin/hwclock $out/bin
|
||||
'';
|
||||
|
||||
boot.initrd.postDeviceCommands =
|
||||
''
|
||||
hwclock -s
|
||||
'';
|
||||
|
||||
boot.kernelParams =
|
||||
[
|
||||
"selinux=0"
|
||||
"console=tty1"
|
||||
# "console=ttyS0,115200n8" # serial console
|
||||
];
|
||||
|
||||
boot.kernelPackages = pkgs.linuxPackages_3_4;
|
||||
|
||||
boot.supportedFilesystems = [ "reiserfs" ];
|
||||
|
||||
/* fake entry, just to have a happy stage-1. Users
|
||||
may boot without having stage-1 though */
|
||||
fileSystems = [
|
||||
{ mountPoint = "/";
|
||||
device = "/dev/something";
|
||||
}
|
||||
];
|
||||
|
||||
services.mingetty = {
|
||||
# Some more help text.
|
||||
helpLine = ''
|
||||
Log in as "root" with an empty password. ${
|
||||
if config.services.xserver.enable then
|
||||
"Type `start xserver' to start\nthe graphical user interface."
|
||||
else ""
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
# Setting vesa, we don't get the nvidia driver, which can't work in arm.
|
||||
services.xserver.videoDriver = "vesa";
|
||||
services.xserver.videoDrivers = [];
|
||||
services.nixosManual.enable = false;
|
||||
|
||||
# Include the firmware for various wireless cards.
|
||||
networking.enableRalinkFirmware = true;
|
||||
networking.enableIntel2200BGFirmware = true;
|
||||
|
||||
# To speed up further installation of packages, include the complete stdenv
|
||||
# in the Nix store of the tarball.
|
||||
tarball.storeContents = pkgs2storeContents [ pkgs.stdenv ];
|
||||
tarball.contents = [
|
||||
{ source = kernelParams;
|
||||
target = "/kernelparams.txt";
|
||||
}
|
||||
{ source = config.boot.kernelPackages.kernel + "/" + config.system.boot.loader.kernelFile;
|
||||
target = "/boot/" + config.system.boot.loader.kernelFile;
|
||||
}
|
||||
{ source = pkgs.ubootSheevaplug;
|
||||
target = "/boot/uboot";
|
||||
}
|
||||
];
|
||||
|
||||
# Allow sshd to be started manually through "start sshd". It should
|
||||
# not be started by default on the installation CD because the
|
||||
# default root password is empty.
|
||||
services.openssh.enable = true;
|
||||
jobs.openssh.startOn = pkgs.lib.mkOverrideTemplate 50 {} "";
|
||||
|
||||
# cpufrequtils fails to build on non-pc
|
||||
powerManagement.enable = false;
|
||||
|
||||
nixpkgs.config = {
|
||||
platform = pkgs.platforms.sheevaplug;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
# This module creates a bootable ISO image containing the given NixOS
|
||||
# configuration. The derivation for the ISO image will be placed in
|
||||
# config.system.build.tarball.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
versionFile = pkgs.writeText "nixos-version" config.system.nixosVersion;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
tarball.contents = mkOption {
|
||||
example =
|
||||
[ { source = pkgs.memtest86 + "/memtest.bin";
|
||||
target = "boot/memtest.bin";
|
||||
}
|
||||
];
|
||||
description = ''
|
||||
This option lists files to be copied to fixed locations in the
|
||||
generated ISO image.
|
||||
'';
|
||||
};
|
||||
|
||||
tarball.storeContents = mkOption {
|
||||
example = [pkgs.stdenv];
|
||||
description = ''
|
||||
This option lists additional derivations to be included in the
|
||||
Nix store in the generated ISO image.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
# 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.
|
||||
fileSystems = [ ];
|
||||
|
||||
# boot.initrd.availableKernelModules = [ "mvsdio" "mmc_block" "reiserfs" "ext3" "ext4" ];
|
||||
|
||||
# boot.initrd.kernelModules = [ "rtc_mv" ];
|
||||
|
||||
# Closures to be copied to the Nix store on the CD, namely the init
|
||||
# script and the top-level system configuration directory.
|
||||
tarball.storeContents =
|
||||
[ { object = config.system.build.toplevel;
|
||||
symlink = "/run/current-system";
|
||||
}
|
||||
];
|
||||
|
||||
# Individual files to be included on the CD, outside of the Nix
|
||||
# store on the CD.
|
||||
tarball.contents =
|
||||
[ { source = config.system.build.initialRamdisk + "/initrd";
|
||||
target = "/boot/initrd";
|
||||
}
|
||||
{ source = versionFile;
|
||||
target = "/nixos-version.txt";
|
||||
}
|
||||
];
|
||||
|
||||
# Create the tarball
|
||||
system.build.tarball = import ../../../lib/make-system-tarball.nix {
|
||||
inherit (pkgs) stdenv perl xz pathsFromGraph;
|
||||
|
||||
inherit (config.tarball) contents storeContents;
|
||||
};
|
||||
|
||||
boot.postBootCommands =
|
||||
''
|
||||
# After booting, register the contents of the Nix store on the
|
||||
# CD in the Nix database in the tmpfs.
|
||||
if [ -f /nix-path-registration ]; then
|
||||
${config.environment.nix}/bin/nix-store --load-db < /nix-path-registration &&
|
||||
rm /nix-path-registration
|
||||
fi
|
||||
|
||||
# nixos-rebuild also requires a "system" profile and an
|
||||
# /etc/NIXOS tag.
|
||||
touch /etc/NIXOS
|
||||
${config.environment.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set /run/current-system
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
# List all devices which are detected by nixos-hardware-scan.
|
||||
# Common devices are enabled by default.
|
||||
{config, pkgs, ...}:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
config = mkDefault {
|
||||
# Wireless card firmware
|
||||
networking.enableIntel2200BGFirmware = true;
|
||||
networking.enableIntel3945ABGFirmware = true;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
# List all devices which are _not_ detected by nixos-hardware-scan.
|
||||
# Common devices are enabled by default.
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
hardware.enableAllFirmware = true;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
getVersion() {
|
||||
local dir="$1"
|
||||
rev=
|
||||
if [ -e "$dir/.git" ]; then
|
||||
if [ -z "$(type -P git)" ]; then
|
||||
echo "warning: Git not found; cannot figure out revision of $dir" >&2
|
||||
return
|
||||
fi
|
||||
cd "$dir"
|
||||
rev=$(git rev-parse --short HEAD)
|
||||
if git describe --always --dirty | grep -q dirty; then
|
||||
rev+=M
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if nixos=$(nix-instantiate --find-file nixos "$@"); then
|
||||
getVersion $nixos
|
||||
if [ -n "$rev" ]; then
|
||||
suffix="pre-$rev"
|
||||
if nixpkgs=$(nix-instantiate --find-file nixpkgs "$@"); then
|
||||
getVersion $nixpkgs
|
||||
if [ -n "$rev" ]; then
|
||||
suffix+="-$rev"
|
||||
fi
|
||||
fi
|
||||
echo $suffix
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,9 @@
|
||||
{ system ? builtins.currentSystem
|
||||
, networkExpr
|
||||
}:
|
||||
|
||||
let nodes = import networkExpr; in
|
||||
|
||||
with import ../../../../lib/testing.nix { inherit system; };
|
||||
|
||||
(complete { inherit nodes; testScript = ""; }).driver
|
||||
@@ -0,0 +1,62 @@
|
||||
#! @shell@ -e
|
||||
|
||||
# Shows the usage of this command to the user
|
||||
|
||||
showUsage()
|
||||
{
|
||||
echo "Usage: $0 network_expr"
|
||||
echo "Options:"
|
||||
echo
|
||||
echo "--no-out-link Do not create a 'result' symlink"
|
||||
echo "--show-trace Shows the output trace"
|
||||
echo "-h,--help Shows the usage of this command"
|
||||
}
|
||||
|
||||
# Parse valid argument options
|
||||
|
||||
PARAMS=`getopt -n $0 -o h -l no-out-link,show-trace,help -- "$@"`
|
||||
|
||||
if [ $? != 0 ]
|
||||
then
|
||||
showUsage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
eval set -- "$PARAMS"
|
||||
|
||||
# Evaluate valid options
|
||||
|
||||
while [ "$1" != "--" ]
|
||||
do
|
||||
case "$1" in
|
||||
--no-out-link)
|
||||
noOutLinkArg="--no-out-link"
|
||||
;;
|
||||
--show-trace)
|
||||
showTraceArg="--show-trace"
|
||||
;;
|
||||
-h|--help)
|
||||
showUsage
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
shift
|
||||
|
||||
# Validate the given options
|
||||
|
||||
if [ "$1" = "" ]
|
||||
then
|
||||
echo "ERROR: A network expression must be specified!" >&2
|
||||
exit 1
|
||||
else
|
||||
networkExpr=$(readlink -f $1)
|
||||
fi
|
||||
|
||||
# Build a network of VMs
|
||||
|
||||
nix-build '<nixos/modules/installer/tools/nixos-build-vms/build-vms.nix>' \
|
||||
--argstr networkExpr $networkExpr $noOutLinkArg $showTraceArg
|
||||
@@ -0,0 +1,55 @@
|
||||
# This module generates the nixos-checkout script, which replaces the
|
||||
# NixOS and Nixpkgs source trees in /etc/nixos/{nixos,nixpkgs} with
|
||||
# Git checkouts.
|
||||
|
||||
{config, pkgs, ...}:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
nixosCheckout = pkgs.substituteAll {
|
||||
name = "nixos-checkout";
|
||||
dir = "bin";
|
||||
isExecutable = true;
|
||||
src = pkgs.writeScript "nixos-checkout"
|
||||
''
|
||||
#! ${pkgs.stdenv.shell} -e
|
||||
|
||||
if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then
|
||||
echo "Usage: `basename $0` [PREFIX]. See NixOS Manual for more info."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
prefix="$1"
|
||||
if [ -z "$prefix" ]; then prefix=/etc/nixos; fi
|
||||
mkdir -p "$prefix"
|
||||
cd "$prefix"
|
||||
|
||||
if [ -z "$(type -P git)" ]; then
|
||||
echo "installing Git..."
|
||||
nix-env -iA nixos.pkgs.git || nix-env -i git
|
||||
fi
|
||||
|
||||
# Move any old nixos or nixpkgs directories out of the way.
|
||||
backupTimestamp=$(date "+%Y%m%d%H%M%S")
|
||||
|
||||
if [ -e nixos -a ! -e nixos/.git ]; then
|
||||
mv nixos nixos-$backupTimestamp
|
||||
fi
|
||||
|
||||
if [ -e nixpkgs -a ! -e nixpkgs/.git ]; then
|
||||
mv nixpkgs nixpkgs-$backupTimestamp
|
||||
fi
|
||||
|
||||
# Check out the NixOS and Nixpkgs sources.
|
||||
git clone git://github.com/NixOS/nixos.git nixos
|
||||
git clone git://github.com/NixOS/nixpkgs.git nixpkgs
|
||||
'';
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
environment.systemPackages = [ nixosCheckout ];
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#! @shell@ -e
|
||||
|
||||
mkdir -p /var/elliptic-keys
|
||||
chmod 0755 /var/elliptic-keys
|
||||
cd /var/elliptic-keys
|
||||
touch private
|
||||
chmod 0700 private
|
||||
dd if=/dev/urandom bs=128 count=1 of=private
|
||||
chmod 0500 private
|
||||
public=$(seccure-key -F private 2>&1)
|
||||
echo ${public#*The public key is: } > public
|
||||
chmod 0555 public
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
#! @perl@/bin/perl -w
|
||||
|
||||
use File::Spec;
|
||||
use File::Basename;
|
||||
|
||||
|
||||
my @attrs = ();
|
||||
my @kernelModules = ();
|
||||
my @initrdKernelModules = ();
|
||||
my @modulePackages = ();
|
||||
my @imports = ("<nixos/modules/installer/scan/not-detected.nix>");
|
||||
|
||||
|
||||
sub debug {
|
||||
return unless defined $ENV{"DEBUG"};
|
||||
print STDERR @_;
|
||||
}
|
||||
|
||||
|
||||
# Read a file, returning undef if the file cannot be opened.
|
||||
sub readFile {
|
||||
my $filename = shift;
|
||||
my $res;
|
||||
if (open FILE, "<$filename") {
|
||||
my $prev = $/;
|
||||
undef $/;
|
||||
$res = <FILE>;
|
||||
$/ = $prev;
|
||||
close FILE;
|
||||
chomp $res;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
my $cpuinfo = readFile "/proc/cpuinfo";
|
||||
|
||||
|
||||
sub hasCPUFeature {
|
||||
my $feature = shift;
|
||||
return $cpuinfo =~ /^flags\s*:.* $feature( |$)/m;
|
||||
}
|
||||
|
||||
|
||||
# Detect the number of CPU cores.
|
||||
my $cpus = scalar (grep {/^processor\s*:/} (split '\n', $cpuinfo));
|
||||
|
||||
|
||||
# Virtualization support?
|
||||
push @kernelModules, "kvm-intel" if hasCPUFeature "vmx";
|
||||
push @kernelModules, "kvm-amd" if hasCPUFeature "svm";
|
||||
|
||||
|
||||
# Look at the PCI devices and add necessary modules. Note that most
|
||||
# modules are auto-detected so we don't need to list them here.
|
||||
# However, some are needed in the initrd to boot the system.
|
||||
|
||||
my $videoDriver;
|
||||
|
||||
sub pciCheck {
|
||||
my $path = shift;
|
||||
my $vendor = readFile "$path/vendor";
|
||||
my $device = readFile "$path/device";
|
||||
my $class = readFile "$path/class";
|
||||
|
||||
my $module;
|
||||
if (-e "$path/driver/module") {
|
||||
$module = basename `readlink -f $path/driver/module`;
|
||||
chomp $module;
|
||||
}
|
||||
|
||||
debug "$path: $vendor $device $class";
|
||||
debug " $module" if defined $module;
|
||||
debug "\n";
|
||||
|
||||
if (defined $module) {
|
||||
# See the bottom of http://pciids.sourceforge.net/pci.ids for
|
||||
# device classes.
|
||||
if (# Mass-storage controller. Definitely important.
|
||||
$class =~ /^0x01/ ||
|
||||
|
||||
# Firewire controller. A disk might be attached.
|
||||
$class =~ /^0x0c00/ ||
|
||||
|
||||
# USB controller. Needed if we want to use the
|
||||
# keyboard when things go wrong in the initrd.
|
||||
$class =~ /^0x0c03/
|
||||
)
|
||||
{
|
||||
push @initrdKernelModules, $module;
|
||||
}
|
||||
}
|
||||
|
||||
# broadcom STA driver (wl.ko)
|
||||
# list taken from http://www.broadcom.com/docs/linux_sta/README.txt
|
||||
if ($vendor eq "0x14e4" &&
|
||||
($device eq "0x4311" || $device eq "0x4312" || $device eq "0x4313" ||
|
||||
$device eq "0x4315" || $device eq "0x4327" || $device eq "0x4328" ||
|
||||
$device eq "0x4329" || $device eq "0x432a" || $device eq "0x432b" ||
|
||||
$device eq "0x432c" || $device eq "0x432d" || $device eq "0x4353" ||
|
||||
$device eq "0x4357" || $device eq "0x4358" || $device eq "0x4359" ) )
|
||||
{
|
||||
push @modulePackages, "config.boot.kernelPackages.broadcom_sta";
|
||||
push @kernelModules, "wl";
|
||||
}
|
||||
|
||||
# Can't rely on $module here, since the module may not be loaded
|
||||
# due to missing firmware. Ideally we would check modules.pcimap
|
||||
# here.
|
||||
push @attrs, "networking.enableIntel2200BGFirmware = true;" if
|
||||
$vendor eq "0x8086" &&
|
||||
($device eq "0x1043" || $device eq "0x104f" || $device eq "0x4220" ||
|
||||
$device eq "0x4221" || $device eq "0x4223" || $device eq "0x4224");
|
||||
|
||||
push @attrs, "networking.enableIntel3945ABGFirmware = true;" if
|
||||
$vendor eq "0x8086" &&
|
||||
($device eq "0x4229" || $device eq "0x4230" ||
|
||||
$device eq "0x4222" || $device eq "0x4227");
|
||||
|
||||
# Assume that all NVIDIA cards are supported by the NVIDIA driver.
|
||||
# There may be exceptions (e.g. old cards).
|
||||
$videoDriver = "nvidia" if $vendor eq "0x10de" && $class =~ /^0x03/;
|
||||
}
|
||||
|
||||
foreach my $path (glob "/sys/bus/pci/devices/*") {
|
||||
pciCheck $path;
|
||||
}
|
||||
|
||||
|
||||
# Idem for USB devices.
|
||||
|
||||
sub usbCheck {
|
||||
my $path = shift;
|
||||
my $class = readFile "$path/bInterfaceClass";
|
||||
my $subclass = readFile "$path/bInterfaceSubClass";
|
||||
my $protocol = readFile "$path/bInterfaceProtocol";
|
||||
|
||||
my $module;
|
||||
if (-e "$path/driver/module") {
|
||||
$module = basename `readlink -f $path/driver/module`;
|
||||
chomp $module;
|
||||
}
|
||||
|
||||
debug "$path: $class $subclass $protocol";
|
||||
debug " $module" if defined $module;
|
||||
debug "\n";
|
||||
|
||||
if (defined $module) {
|
||||
if (# Mass-storage controller. Definitely important.
|
||||
$class eq "08" ||
|
||||
|
||||
# Keyboard. Needed if we want to use the
|
||||
# keyboard when things go wrong in the initrd.
|
||||
($class eq "03" && $protocol eq "01")
|
||||
)
|
||||
{
|
||||
push @initrdKernelModules, $module;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach my $path (glob "/sys/bus/usb/devices/*") {
|
||||
if (-e "$path/bInterfaceClass") {
|
||||
usbCheck $path;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Add the modules for all block devices.
|
||||
|
||||
foreach my $path (glob "/sys/class/block/*") {
|
||||
my $module;
|
||||
if (-e "$path/device/driver/module") {
|
||||
$module = basename `readlink -f $path/device/driver/module`;
|
||||
chomp $module;
|
||||
push @initrdKernelModules, $module;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($videoDriver) {
|
||||
push @attrs, "services.xserver.videoDrivers = [ \"$videoDriver\" ];";
|
||||
}
|
||||
|
||||
|
||||
# Check if we're a VirtualBox guest. If so, enable the guest
|
||||
# additions.
|
||||
my $dmi = `@dmidecode@/sbin/dmidecode`;
|
||||
if ($dmi =~ /Manufacturer: innotek/) {
|
||||
push @attrs, "services.virtualbox.enable = true;"
|
||||
}
|
||||
|
||||
|
||||
# Generate the configuration file.
|
||||
|
||||
sub removeDups {
|
||||
my %seen;
|
||||
my @res = ();
|
||||
foreach my $s (@_) {
|
||||
if (!defined $seen{$s}) {
|
||||
$seen{$s} = "";
|
||||
push @res, $s;
|
||||
}
|
||||
}
|
||||
return @res;
|
||||
}
|
||||
|
||||
sub toNixExpr {
|
||||
my $res = "";
|
||||
foreach my $s (@_) {
|
||||
$res .= " \"$s\"";
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
sub multiLineList {
|
||||
my $indent = shift;
|
||||
my $res = "";
|
||||
$res = "\n" if scalar @_ > 0;
|
||||
foreach my $s (@_) {
|
||||
$res .= "$indent$s\n";
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
my $initrdKernelModules = toNixExpr(removeDups @initrdKernelModules);
|
||||
my $kernelModules = toNixExpr(removeDups @kernelModules);
|
||||
my $modulePackages = toNixExpr(removeDups @modulePackages);
|
||||
my $attrs = multiLineList(" ", removeDups @attrs);
|
||||
my $imports = multiLineList(" ", removeDups @imports);
|
||||
|
||||
|
||||
print <<EOF ;
|
||||
# This is a generated file. Do not modify!
|
||||
# Make changes to /etc/nixos/configuration.nix instead.
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [$imports ];
|
||||
|
||||
boot.initrd.kernelModules = [$initrdKernelModules ];
|
||||
boot.kernelModules = [$kernelModules ];
|
||||
boot.extraModulePackages = [$modulePackages ];
|
||||
|
||||
nix.maxJobs = $cpus;
|
||||
$attrs}
|
||||
EOF
|
||||
# workaround for a bug in substituteAll
|
||||
@@ -0,0 +1,238 @@
|
||||
#! @shell@
|
||||
|
||||
# - [mount target device] <- currently disabled
|
||||
# - make Nix store etc.
|
||||
# - copy closure of Nix to target device
|
||||
# - register validity
|
||||
# - with a chroot to the target device:
|
||||
# * nix-env -p /nix/var/nix/profiles/system -i <nix-expr for the configuration>
|
||||
# * run the activation script of the configuration (also installs Grub)
|
||||
|
||||
# Parse the command line for the -I flag
|
||||
extraBuildFlags=()
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
i="$1"; shift 1
|
||||
case "$i" in
|
||||
-I)
|
||||
given_path="$1"; shift 1
|
||||
absolute_path=$(readlink -m $given_path)
|
||||
extraBuildFlags+=("$i" "/mnt$absolute_path")
|
||||
;;
|
||||
*)
|
||||
echo "$0: unknown option \`$i'"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
set -e
|
||||
shopt -s nullglob
|
||||
|
||||
if test -z "$mountPoint"; then
|
||||
mountPoint=/mnt
|
||||
fi
|
||||
|
||||
if test -z "$NIXOS_CONFIG"; then
|
||||
NIXOS_CONFIG=/etc/nixos/configuration.nix
|
||||
fi
|
||||
|
||||
if ! test -e "$mountPoint"; then
|
||||
echo "mount point $mountPoint doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! grep -F -q " $mountPoint " /proc/mounts; then
|
||||
echo "$mountPoint doesn't appear to be a mount point"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! test -e "$mountPoint/$NIXOS_CONFIG"; then
|
||||
echo "configuration file $mountPoint/$NIXOS_CONFIG doesn't exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Mount some stuff in the target root directory. We bind-mount /etc
|
||||
# into the chroot because we need networking and the nixbld user
|
||||
# accounts in /etc/passwd. But we do need the target's /etc/nixos.
|
||||
mkdir -m 0755 -p $mountPoint/dev $mountPoint/proc $mountPoint/sys $mountPoint/mnt $mountPoint/mnt2 $mountPoint/mnt-nixos $mountPoint/mnt-nixpkgs $mountPoint/etc /etc/nixos
|
||||
mount --make-private / # systemd makes / shared, which is annoying
|
||||
mount --bind / $mountPoint/mnt
|
||||
mount --bind /nix $mountPoint/mnt/nix
|
||||
mount --bind /nix/store $mountPoint/mnt/nix/store
|
||||
mount --bind /dev $mountPoint/dev
|
||||
mount --bind /dev/shm $mountPoint/dev/shm
|
||||
mount --bind /proc $mountPoint/proc
|
||||
mount --bind /sys $mountPoint/sys
|
||||
mount --bind /sys/firmware/efi/efivars $mountPoint/sys/firmware/efi/efivars &>/dev/null || true
|
||||
mount --bind $mountPoint/etc/nixos $mountPoint/mnt2
|
||||
mount --bind /etc $mountPoint/etc
|
||||
mount --bind $mountPoint/mnt2 $mountPoint/etc/nixos
|
||||
|
||||
cleanup() {
|
||||
set +e
|
||||
mountpoint -q $mountPoint/etc/nixos && umount $mountPoint/etc/nixos
|
||||
mountpoint -q $mountPoint/etc && umount $mountPoint/etc
|
||||
umount $mountPoint/mnt2
|
||||
umount $mountPoint/mnt-nixos
|
||||
umount $mountPoint/mnt-nixpkgs
|
||||
umount $mountPoint/sys/firmware/efi/efivars &>/dev/null || true
|
||||
umount $mountPoint/sys
|
||||
umount $mountPoint/proc
|
||||
umount $mountPoint/dev/shm
|
||||
umount $mountPoint/dev
|
||||
umount $mountPoint/mnt/nix/store
|
||||
umount $mountPoint/mnt/nix
|
||||
umount $mountPoint/mnt
|
||||
rmdir $mountPoint/mnt $mountPoint/mnt2 $mountPoint/mnt-nixos $mountPoint/mnt-nixpkgs
|
||||
}
|
||||
|
||||
trap "cleanup" EXIT
|
||||
|
||||
mkdir -m 01777 -p $mountPoint/tmp
|
||||
mkdir -m 0755 -p $mountPoint/var
|
||||
|
||||
|
||||
# Create the necessary Nix directories on the target device, if they
|
||||
# don't already exist.
|
||||
mkdir -m 0755 -p \
|
||||
$mountPoint/nix/var/nix/gcroots \
|
||||
$mountPoint/nix/var/nix/temproots \
|
||||
$mountPoint/nix/var/nix/manifests \
|
||||
$mountPoint/nix/var/nix/userpool \
|
||||
$mountPoint/nix/var/nix/profiles \
|
||||
$mountPoint/nix/var/nix/db \
|
||||
$mountPoint/nix/var/log/nix/drvs
|
||||
|
||||
mkdir -m 1775 -p $mountPoint/nix/store
|
||||
build_users_group=$(@perl@/bin/perl -I @nix@/lib/perl5/site_perl/*/* -e 'use Nix::Config; Nix::Config::readConfig; print $Nix::Config::config{"build-users-group"};')
|
||||
if test -n "$build_users_group"; then
|
||||
chown root:"$build_users_group" $mountPoint/nix/store
|
||||
else
|
||||
chown root $mountPoint/nix/store
|
||||
fi
|
||||
|
||||
|
||||
# Get the store paths to copy from the references graph.
|
||||
storePaths=$(@perl@/bin/perl @pathsFromGraph@ @nixClosure@)
|
||||
|
||||
|
||||
# Copy Nix to the Nix store on the target device.
|
||||
echo "copying Nix to $mountPoint...."
|
||||
for i in $storePaths; do
|
||||
echo " $i"
|
||||
chattr -R -i $mountPoint/$i 2> /dev/null || true # clear immutable bit
|
||||
rsync -a $i $mountPoint/nix/store/
|
||||
done
|
||||
|
||||
|
||||
# We don't have locale-archive in the chroot, so clear $LANG.
|
||||
export LANG=
|
||||
export LC_ALL=
|
||||
export LC_TIME=
|
||||
|
||||
|
||||
# There is no daemon in the chroot
|
||||
unset NIX_REMOTE
|
||||
|
||||
|
||||
# Create a temporary Nix config file that causes the nixbld users to
|
||||
# be used.
|
||||
if test -n "$build_users_group"; then
|
||||
echo "build-users-group = $build_users_group" > $mountPoint/tmp/nix.conf
|
||||
fi
|
||||
binary_caches=$(@perl@/bin/perl -I @nix@/lib/perl5/site_perl/*/* -e 'use Nix::Config; Nix::Config::readConfig; print $Nix::Config::config{"binary-caches"};')
|
||||
if test -n "$binary_caches"; then
|
||||
echo "binary-caches = $binary_caches" >> $mountPoint/tmp/nix.conf
|
||||
fi
|
||||
export NIX_CONF_DIR=/tmp
|
||||
|
||||
|
||||
# Register the paths in the Nix closure as valid. This is necessary
|
||||
# to prevent them from being deleted the first time we install
|
||||
# something. (I.e., Nix will see that, e.g., the glibc path is not
|
||||
# valid, delete it to get it out of the way, but as a result nothing
|
||||
# will work anymore.)
|
||||
chroot $mountPoint @nix@/bin/nix-store --register-validity < @nixClosure@
|
||||
|
||||
|
||||
# Create the required /bin/sh symlink; otherwise lots of things
|
||||
# (notably the system() function) won't work.
|
||||
mkdir -m 0755 -p $mountPoint/bin
|
||||
# !!! assuming that @shell@ is in the closure
|
||||
ln -sf @shell@ $mountPoint/bin/sh
|
||||
|
||||
|
||||
if test -n "$NIXOS_PREPARE_CHROOT_ONLY"; then
|
||||
echo "User requested only to prepare chroot. Exiting."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# Make the build below copy paths from the CD if possible. Note that
|
||||
# /mnt in the chroot is the root of the CD.
|
||||
export NIX_OTHER_STORES=/mnt/nix:$NIX_OTHER_STORES
|
||||
|
||||
p=@nix@/libexec/nix/substituters
|
||||
export NIX_SUBSTITUTERS=$p/copy-from-other-stores.pl:$p/download-from-binary-cache.pl
|
||||
|
||||
|
||||
# Make manifests available in the chroot.
|
||||
rm -f $mountPoint/nix/var/nix/manifests/*
|
||||
for i in /nix/var/nix/manifests/*.nixmanifest; do
|
||||
chroot $mountPoint @nix@/bin/nix-store -r "$(readlink -f "$i")" > /dev/null
|
||||
cp -pd "$i" $mountPoint/nix/var/nix/manifests/
|
||||
done
|
||||
|
||||
|
||||
# Get the absolute path to the NixOS/Nixpkgs sources.
|
||||
mount --bind $(readlink -f $(nix-instantiate --find-file nixpkgs)) $mountPoint/mnt-nixpkgs
|
||||
mount --bind $(readlink -f $(nix-instantiate --find-file nixos)) $mountPoint/mnt-nixos
|
||||
|
||||
|
||||
# Build the specified Nix expression in the target store and install
|
||||
# it into the system configuration profile.
|
||||
echo "building the system configuration..."
|
||||
NIX_PATH="nixpkgs=/mnt-nixpkgs:nixos=/mnt-nixos:nixos-config=$NIXOS_CONFIG" NIXOS_CONFIG= \
|
||||
chroot $mountPoint @nix@/bin/nix-env \
|
||||
"${extraBuildFlags[@]}" -p /nix/var/nix/profiles/system -f '<nixos>' --set -A system --show-trace
|
||||
|
||||
|
||||
# Copy the NixOS/Nixpkgs sources to the target as the initial contents
|
||||
# of the NixOS channel.
|
||||
mkdir -m 0755 -p $mountPoint/nix/var/nix/profiles
|
||||
mkdir -m 1777 -p $mountPoint/nix/var/nix/profiles/per-user
|
||||
mkdir -m 0755 -p $mountPoint/nix/var/nix/profiles/per-user/root
|
||||
srcs=$(nix-env "${extraBuildFlags[@]}" -p /nix/var/nix/profiles/per-user/root/channels -q nixos --no-name --out-path 2>/dev/null || echo -n "")
|
||||
if test -n "$srcs"; then
|
||||
echo "copying NixOS/Nixpkgs sources..."
|
||||
chroot $mountPoint @nix@/bin/nix-env \
|
||||
"${extraBuildFlags[@]}" -p /nix/var/nix/profiles/per-user/root/channels -i "$srcs" --quiet
|
||||
fi
|
||||
mkdir -m 0700 -p $mountPoint/root/.nix-defexpr
|
||||
ln -sfn /nix/var/nix/profiles/per-user/root/channels $mountPoint/root/.nix-defexpr/channels
|
||||
|
||||
|
||||
# We're done building/downloading, so we don't need the /etc bind
|
||||
# mount anymore. In fact, below we want to modify the target's /etc.
|
||||
umount $mountPoint/etc/nixos
|
||||
umount $mountPoint/etc
|
||||
|
||||
|
||||
# Grub needs an mtab.
|
||||
ln -sfn /proc/mounts $mountPoint/etc/mtab
|
||||
|
||||
|
||||
# Mark the target as a NixOS installation, otherwise
|
||||
# switch-to-configuration will chicken out.
|
||||
touch $mountPoint/etc/NIXOS
|
||||
|
||||
|
||||
# Switch to the new system configuration. This will install Grub with
|
||||
# a menu default pointing at the kernel/initrd/etc of the new
|
||||
# configuration.
|
||||
echo "finalising the installation..."
|
||||
NIXOS_INSTALL_GRUB=1 chroot $mountPoint \
|
||||
/nix/var/nix/profiles/system/bin/switch-to-configuration boot
|
||||
@@ -0,0 +1,395 @@
|
||||
#! @shell@ -e
|
||||
|
||||
# Allow the location of NixOS sources and the system configuration
|
||||
# file to be overridden.
|
||||
|
||||
: ${mountPoint=/mnt}
|
||||
: ${NIXOS_CONFIG=/etc/nixos/configuration.nix}
|
||||
export NIXOS_CONFIG
|
||||
|
||||
usage () {
|
||||
echo 1>&2 "
|
||||
Usage: $0 [-v] [-d] [-l] [--xml] OPTION_NAME
|
||||
$0 --install
|
||||
|
||||
This program allows you to inspect the current value of NixOS
|
||||
configuration options. It can also generate a basic NixOS
|
||||
configuration file.
|
||||
|
||||
Options:
|
||||
|
||||
-i | --install Write a template NixOS configuration file to
|
||||
${mountPoint:+$mountPoint/}$NIXOS_CONFIG.
|
||||
-v | --value Display the current value, based on your
|
||||
configuration.
|
||||
-d | --description Display the default value, the example and the
|
||||
description.
|
||||
-l | --lookup Display where the option is defined and where it
|
||||
is declared.
|
||||
--xml Print an XML representation of the result.
|
||||
Implies -vdl options.
|
||||
--help Show this message.
|
||||
|
||||
Environment variables affecting $0:
|
||||
|
||||
\$mountPoint Path to the target file system.
|
||||
\$NIXOS_CONFIG Path to your configuration file.
|
||||
|
||||
"
|
||||
|
||||
exit 1;
|
||||
}
|
||||
|
||||
#####################
|
||||
# Process Arguments #
|
||||
#####################
|
||||
|
||||
desc=false
|
||||
defs=false
|
||||
value=false
|
||||
xml=false
|
||||
install=false
|
||||
verbose=false
|
||||
|
||||
option=""
|
||||
|
||||
argfun=""
|
||||
for arg; do
|
||||
if test -z "$argfun"; then
|
||||
case $arg in
|
||||
-*)
|
||||
longarg=""
|
||||
sarg="$arg"
|
||||
while test "$sarg" != "-"; do
|
||||
case $sarg in
|
||||
--*) longarg=$arg; sarg="--";;
|
||||
-d*) longarg="$longarg --description";;
|
||||
-v*) longarg="$longarg --value";;
|
||||
-l*) longarg="$longarg --lookup";;
|
||||
-i*) longarg="$longarg --install";;
|
||||
-*) usage;;
|
||||
esac
|
||||
# remove the first letter option
|
||||
sarg="-${sarg#??}"
|
||||
done
|
||||
;;
|
||||
*) longarg=$arg;;
|
||||
esac
|
||||
for larg in $longarg; do
|
||||
case $larg in
|
||||
--description) desc=true;;
|
||||
--value) value=true;;
|
||||
--lookup) defs=true;;
|
||||
--xml) xml=true;;
|
||||
--install) install=true;;
|
||||
--verbose) verbose=true;;
|
||||
--help) usage;;
|
||||
-*) usage;;
|
||||
*) if test -z "$option"; then
|
||||
option="$larg"
|
||||
else
|
||||
usage
|
||||
fi;;
|
||||
esac
|
||||
done
|
||||
else
|
||||
case $argfun in
|
||||
set_*)
|
||||
var=$(echo $argfun | sed 's,^set_,,')
|
||||
eval $var=$arg
|
||||
;;
|
||||
esac
|
||||
argfun=""
|
||||
fi
|
||||
done
|
||||
|
||||
if $xml; then
|
||||
value=true
|
||||
desc=true
|
||||
defs=true
|
||||
fi
|
||||
|
||||
# --install cannot be used with -d -v -l without option name.
|
||||
if $value || $desc || $defs && $install && test -z "$option"; then
|
||||
usage
|
||||
fi
|
||||
|
||||
generate=false
|
||||
if ! $defs && ! $desc && ! $value && $install && test -z "$option"; then
|
||||
generate=true
|
||||
fi
|
||||
|
||||
if ! $defs && ! $desc; then
|
||||
value=true
|
||||
fi
|
||||
|
||||
if $verbose; then
|
||||
set -x
|
||||
else
|
||||
set +x
|
||||
fi
|
||||
|
||||
#############################
|
||||
# Process the configuration #
|
||||
#############################
|
||||
|
||||
evalNix(){
|
||||
nix-instantiate - --eval-only "$@"
|
||||
}
|
||||
|
||||
evalAttr(){
|
||||
local prefix=$1
|
||||
local suffix=$2
|
||||
local strict=$3
|
||||
echo "(import <nixos> {}).$prefix${option:+.$option}${suffix:+.$suffix}" |
|
||||
evalNix ${strict:+--strict}
|
||||
}
|
||||
|
||||
evalOpt(){
|
||||
evalAttr "eval.options" "$@"
|
||||
}
|
||||
|
||||
evalCfg(){
|
||||
evalAttr "config" "$@"
|
||||
}
|
||||
|
||||
findSources(){
|
||||
local suffix=$1
|
||||
echo "builtins.map (f: f.source) (import <nixos> {}).eval.options${option:+.$option}.$suffix" |
|
||||
evalNix --strict
|
||||
}
|
||||
|
||||
# Given a result from nix-instantiate, recover the list of attributes it
|
||||
# contains.
|
||||
attrNames() {
|
||||
local attributeset=$1
|
||||
# sed is used to replace un-printable subset by 0s, and to remove most of
|
||||
# the inner-attribute set, which reduce the likelyhood to encounter badly
|
||||
# pre-processed input.
|
||||
echo "builtins.attrNames $attributeset" | \
|
||||
sed 's,<[A-Z]*>,0,g; :inner; s/{[^\{\}]*};/0;/g; t inner;' | \
|
||||
evalNix --strict
|
||||
}
|
||||
|
||||
# map a simple list which contains strings or paths.
|
||||
nixMap() {
|
||||
local fun="$1"
|
||||
local list="$2"
|
||||
local elem
|
||||
for elem in $list; do
|
||||
test $elem = '[' -o $elem = ']' && continue;
|
||||
$fun $elem
|
||||
done
|
||||
}
|
||||
|
||||
if $install; then
|
||||
NIXOS_CONFIG="$mountPoint$NIXOS_CONFIG"
|
||||
fi
|
||||
|
||||
if $generate; then
|
||||
mkdir -p $(dirname "$NIXOS_CONFIG")
|
||||
|
||||
# Scan the hardware and add the result to /etc/nixos/hardware-scan.nix.
|
||||
hardware_config="${NIXOS_CONFIG%/configuration.nix}/hardware-configuration.nix"
|
||||
if test -e "$hardware_config"; then
|
||||
echo "A hardware configuration file exists, generation skipped."
|
||||
else
|
||||
echo "Generating a hardware configuration file in $hardware_config..."
|
||||
nixos-hardware-scan > "$hardware_config"
|
||||
fi
|
||||
|
||||
if test -e "$NIXOS_CONFIG"; then
|
||||
echo 1>&2 "error: Cannot generate a template configuration because a configuration file exists."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
nl="
|
||||
"
|
||||
if test -e /sys/firmware/efi/efivars; then
|
||||
l1=" # Use the gummiboot efi boot loader."
|
||||
l2=" boot.loader.grub.enable = false;"
|
||||
l3=" boot.loader.gummiboot.enable = true;"
|
||||
l4=" boot.loader.efi.canTouchEfiVariables = true;"
|
||||
# !!! Remove me when nixos is on 3.10 or greater by default
|
||||
l5=" # EFI booting requires kernel >= 3.10"
|
||||
l6=" boot.kernelPackages = pkgs.linuxPackages_3_10;"
|
||||
bootloader_config="$l1$nl$l2$nl$l3$nl$l4$nl$nl$l5$nl$l6"
|
||||
else
|
||||
l1=" # Use the Grub2 boot loader."
|
||||
l2=" boot.loader.grub.enable = true;"
|
||||
l3=" boot.loader.grub.version = 2;"
|
||||
l4=" # Define on which hard drive you want to install Grub."
|
||||
l5=' # boot.loader.grub.device = "/dev/sda";'
|
||||
bootloader_config="$l1$nl$l2$nl$l3$nl$nl$l4$nl$l5"
|
||||
fi
|
||||
|
||||
echo "Generating a basic configuration file in $NIXOS_CONFIG..."
|
||||
|
||||
# Generate a template configuration file where the user has to
|
||||
# fill the gaps.
|
||||
cat <<EOF > "$NIXOS_CONFIG"
|
||||
# Edit this configuration file to define what should be installed on
|
||||
# the system. Help is available in the configuration.nix(5) man page
|
||||
# or the NixOS manual available on virtual console 8 (Alt+F8).
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
boot.initrd.kernelModules =
|
||||
[ # Specify all kernel modules that are necessary for mounting the root
|
||||
# filesystem.
|
||||
# "xfs" "ata_piix"
|
||||
# fbcon # Uncomment this when EFI booting to see the console before the root partition is mounted
|
||||
];
|
||||
|
||||
$bootloader_config
|
||||
|
||||
# networking.hostName = "nixos"; # Define your hostname.
|
||||
# networking.wireless.enable = true; # Enables Wireless.
|
||||
|
||||
# Add filesystem entries for each partition that you want to see
|
||||
# mounted at boot time. This should include at least the root
|
||||
# filesystem.
|
||||
|
||||
# fileSystems."/".device = "/dev/disk/by-label/nixos";
|
||||
|
||||
# fileSystems."/data" = # where you want to mount the device
|
||||
# { device = "/dev/sdb"; # the device
|
||||
# fsType = "ext3"; # the type of the partition
|
||||
# options = "data=journal";
|
||||
# };
|
||||
|
||||
# List swap partitions activated at boot time.
|
||||
swapDevices =
|
||||
[ # { device = "/dev/disk/by-label/swap"; }
|
||||
];
|
||||
|
||||
# Select internationalisation properties.
|
||||
# i18n = {
|
||||
# consoleFont = "lat9w-16";
|
||||
# consoleKeyMap = "us";
|
||||
# defaultLocale = "en_US.UTF-8";
|
||||
# };
|
||||
|
||||
# List services that you want to enable:
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
# services.openssh.enable = true;
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
# services.printing.enable = true;
|
||||
|
||||
# Enable the X11 windowing system.
|
||||
# services.xserver.enable = true;
|
||||
# services.xserver.layout = "us";
|
||||
# services.xserver.xkbOptions = "eurosign:e";
|
||||
|
||||
# Enable the KDE Desktop Environment.
|
||||
# services.xserver.displayManager.kdm.enable = true;
|
||||
# services.xserver.desktopManager.kde4.enable = true;
|
||||
}
|
||||
EOF
|
||||
|
||||
exit 0
|
||||
fi;
|
||||
|
||||
# This duplicates the work made below, but it is useful for processing
|
||||
# the output of nixos-option with other tools such as nixos-gui.
|
||||
if $xml; then
|
||||
evalNix --xml --no-location <<EOF
|
||||
let
|
||||
reach = attrs: attrs${option:+.$option};
|
||||
nixos = import <nixos> {};
|
||||
nixpkgs = import <nixpkgs> {};
|
||||
sources = builtins.map (f: f.source);
|
||||
opt = reach nixos.eval.options;
|
||||
cfg = reach nixos.config;
|
||||
in
|
||||
|
||||
with nixpkgs.lib;
|
||||
|
||||
let
|
||||
optStrict = v:
|
||||
let
|
||||
traverse = x :
|
||||
if isAttrs x then
|
||||
if x ? outPath then true
|
||||
else all id (mapAttrsFlatten (n: traverseNoAttrs) x)
|
||||
else traverseNoAttrs x;
|
||||
traverseNoAttrs = x:
|
||||
# do not continue in attribute sets
|
||||
if isAttrs x then true
|
||||
else if isList x then all id (map traverse x)
|
||||
else true;
|
||||
in assert traverse v; v;
|
||||
in
|
||||
|
||||
if isOption opt then
|
||||
optStrict ({}
|
||||
// optionalAttrs (opt ? default) { inherit (opt) default; }
|
||||
// optionalAttrs (opt ? example) { inherit (opt) example; }
|
||||
// optionalAttrs (opt ? description) { inherit (opt) description; }
|
||||
// optionalAttrs (opt ? type) { typename = opt.type.name; }
|
||||
// optionalAttrs (opt ? options) { inherit (opt) options; }
|
||||
// {
|
||||
# to disambiguate the xml output.
|
||||
_isOption = true;
|
||||
declarations = sources opt.declarations;
|
||||
definitions = sources opt.definitions;
|
||||
value = cfg;
|
||||
})
|
||||
else
|
||||
opt
|
||||
EOF
|
||||
exit $?
|
||||
fi
|
||||
|
||||
if test "$(evalOpt "_type" 2> /dev/null)" = '"option"'; then
|
||||
$value && evalCfg;
|
||||
|
||||
if $desc; then
|
||||
$value && echo;
|
||||
|
||||
if default=$(evalOpt "default" - 2> /dev/null); then
|
||||
echo "Default: $default"
|
||||
else
|
||||
echo "Default: <None>"
|
||||
fi
|
||||
if example=$(evalOpt "example" - 2> /dev/null); then
|
||||
echo "Example: $example"
|
||||
fi
|
||||
echo "Description:"
|
||||
eval printf $(evalOpt "description")
|
||||
fi
|
||||
|
||||
if $defs; then
|
||||
$desc || $value && echo;
|
||||
|
||||
printPath () { echo " $1"; }
|
||||
|
||||
echo "Declared by:"
|
||||
nixMap printPath "$(findSources "declarations")"
|
||||
echo ""
|
||||
echo "Defined by:"
|
||||
nixMap printPath "$(findSources "definitions")"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
else
|
||||
# echo 1>&2 "Warning: This value is not an option."
|
||||
|
||||
result=$(evalCfg)
|
||||
if names=$(attrNames "$result" 2> /dev/null); then
|
||||
echo 1>&2 "This attribute set contains:"
|
||||
escapeQuotes () { eval echo "$1"; }
|
||||
nixMap escapeQuotes "$names"
|
||||
else
|
||||
echo 1>&2 "An error occured while looking for attribute names."
|
||||
echo $result
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,222 @@
|
||||
#! @shell@ -e
|
||||
|
||||
showSyntax() {
|
||||
# !!! more or less cut&paste from
|
||||
# system/switch-to-configuration.sh (which we call, of course).
|
||||
cat <<EOF
|
||||
Usage: $0 [OPTIONS...] OPERATION
|
||||
|
||||
The operation is one of the following:
|
||||
|
||||
switch: make the configuration the boot default and activate now
|
||||
boot: make the configuration the boot default
|
||||
test: activate the configuration, but don't make it the boot default
|
||||
build: build the configuration, but don't make it the default or
|
||||
activate it
|
||||
build-vm: build a virtual machine containing the configuration
|
||||
(useful for testing)
|
||||
build-vm-with-bootloader:
|
||||
like build-vm, but include a boot loader in the VM
|
||||
dry-run: just show what store paths would be built/downloaded
|
||||
|
||||
Options:
|
||||
|
||||
--upgrade fetch the latest version of NixOS before rebuilding
|
||||
--install-grub (re-)install the Grub bootloader
|
||||
--no-build-nix don't build the latest Nix from Nixpkgs before
|
||||
building NixOS
|
||||
--rollback restore the previous NixOS configuration (only
|
||||
with switch, boot, test, build)
|
||||
--profile-name / -p install in the specified system profile
|
||||
--fast same as --no-build-nix --show-trace
|
||||
|
||||
Various nix-build options are also accepted, in particular:
|
||||
|
||||
--show-trace show a detailed stack trace for evaluation errors
|
||||
|
||||
Environment variables affecting nixos-rebuild:
|
||||
|
||||
\$NIX_PATH Nix expression search path
|
||||
\$NIXOS_CONFIG path to the NixOS system configuration specification
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
|
||||
# Parse the command line.
|
||||
extraBuildFlags=()
|
||||
action=
|
||||
buildNix=1
|
||||
rollback=
|
||||
upgrade=
|
||||
repair=
|
||||
profile=/nix/var/nix/profiles/system
|
||||
|
||||
while [ "$#" -gt 0 ]; do
|
||||
i="$1"; shift 1
|
||||
case "$i" in
|
||||
--help)
|
||||
showSyntax
|
||||
;;
|
||||
switch|boot|test|build|dry-run|build-vm|build-vm-with-bootloader)
|
||||
action="$i"
|
||||
;;
|
||||
--install-grub)
|
||||
export NIXOS_INSTALL_GRUB=1
|
||||
;;
|
||||
--no-build-nix)
|
||||
buildNix=
|
||||
;;
|
||||
--rollback)
|
||||
rollback=1
|
||||
;;
|
||||
--upgrade)
|
||||
upgrade=1
|
||||
;;
|
||||
--repair)
|
||||
repair=1
|
||||
extraBuildFlags+=("$i")
|
||||
;;
|
||||
--show-trace|--no-build-hook|--keep-failed|-K|--keep-going|-k|--verbose|-v|-vv|-vvv|-vvvv|-vvvvv|--fallback|--repair)
|
||||
extraBuildFlags+=("$i")
|
||||
;;
|
||||
--max-jobs|-j|--cores|-I)
|
||||
j="$1"; shift 1
|
||||
extraBuildFlags+=("$i" "$j")
|
||||
;;
|
||||
--option)
|
||||
j="$1"; shift 1
|
||||
k="$1"; shift 1
|
||||
extraBuildFlags+=("$i" "$j" "$k")
|
||||
;;
|
||||
--fast)
|
||||
buildNix=
|
||||
extraBuildFlags+=(--show-trace)
|
||||
;;
|
||||
--profile-name|-p)
|
||||
if [ -z "$1" ]; then
|
||||
echo "$0: ‘--profile-name’ requires an argument"
|
||||
exit 1
|
||||
fi
|
||||
if [ "$1" != system ]; then
|
||||
profile="/nix/var/nix/profiles/system-profiles/$1"
|
||||
mkdir -p -m 0755 "$(dirname "$profile")"
|
||||
fi
|
||||
shift 1
|
||||
;;
|
||||
*)
|
||||
echo "$0: unknown option \`$i'"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$action" ]; then showSyntax; fi
|
||||
|
||||
if [ -n "$rollback" ]; then
|
||||
buildNix=
|
||||
fi
|
||||
|
||||
|
||||
tmpDir=$(mktemp -t -d nixos-rebuild.XXXXXX)
|
||||
trap 'rm -rf "$tmpDir"' EXIT
|
||||
|
||||
|
||||
# If the Nix daemon is running, then use it. This allows us to use
|
||||
# the latest Nix from Nixpkgs (below) for expression evaluation, while
|
||||
# still using the old Nix (via the daemon) for actual store access.
|
||||
# This matters if the new Nix in Nixpkgs has a schema change. It
|
||||
# would upgrade the schema, which should only happen once we actually
|
||||
# switch to the new configuration.
|
||||
# If --repair is given, don't try to use the Nix daemon, because the
|
||||
# flag can only be used directly.
|
||||
if [ -z "$repair" ] && systemctl show nix-daemon.socket nix-daemon.service | grep -q ActiveState=active; then
|
||||
export NIX_REMOTE=${NIX_REMOTE:-daemon}
|
||||
fi
|
||||
|
||||
|
||||
# If ‘--upgrade’ is given, run ‘nix-channel --update nixos’.
|
||||
if [ -n "$upgrade" ]; then
|
||||
nix-channel --update nixos
|
||||
fi
|
||||
|
||||
|
||||
# First build Nix, since NixOS may require a newer version than the
|
||||
# current one. Of course, the same goes for Nixpkgs, but Nixpkgs is
|
||||
# more conservative.
|
||||
if [ "$action" != dry-run -a -n "$buildNix" ]; then
|
||||
echo "building Nix..." >&2
|
||||
if ! nix-build '<nixos>' -A config.environment.nix -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null; then
|
||||
if ! nix-build '<nixos>' -A nixFallback -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null; then
|
||||
nix-build '<nixpkgs>' -A nixUnstable -o $tmpDir/nix "${extraBuildFlags[@]}" > /dev/null
|
||||
fi
|
||||
fi
|
||||
PATH=$tmpDir/nix/bin:$PATH
|
||||
fi
|
||||
|
||||
|
||||
# Update the version suffix if we're building from Git (so that
|
||||
# nixos-version shows something useful).
|
||||
if nixos=$(nix-instantiate --find-file nixos "${extraBuildFlags[@]}"); then
|
||||
suffix=$(@shell@ $nixos/modules/installer/tools/get-version-suffix "${extraBuildFlags[@]}")
|
||||
if [ -n "$suffix" ]; then
|
||||
echo -n "$suffix" > "$nixos/.version-suffix" || true
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if [ "$action" = dry-run ]; then
|
||||
extraBuildFlags+=(--dry-run)
|
||||
fi
|
||||
|
||||
|
||||
# Either upgrade the configuration in the system profile (for "switch"
|
||||
# or "boot"), or just build it and create a symlink "result" in the
|
||||
# current directory (for "build" and "test").
|
||||
if [ -z "$rollback" ]; then
|
||||
echo "building the system configuration..." >&2
|
||||
if [ "$action" = switch -o "$action" = boot ]; then
|
||||
nix-env "${extraBuildFlags[@]}" -p "$profile" -f '<nixos>' --set -A system
|
||||
pathToConfig="$profile"
|
||||
elif [ "$action" = test -o "$action" = build -o "$action" = dry-run ]; then
|
||||
nix-build '<nixos>' -A system -K -k "${extraBuildFlags[@]}" > /dev/null
|
||||
pathToConfig=./result
|
||||
elif [ "$action" = build-vm ]; then
|
||||
nix-build '<nixos>' -A vm -K -k "${extraBuildFlags[@]}" > /dev/null
|
||||
pathToConfig=./result
|
||||
elif [ "$action" = build-vm-with-bootloader ]; then
|
||||
nix-build '<nixos>' -A vmWithBootLoader -K -k "${extraBuildFlags[@]}" > /dev/null
|
||||
pathToConfig=./result
|
||||
else
|
||||
showSyntax
|
||||
fi
|
||||
else # [ -n "$rollback" ]
|
||||
if [ "$action" = switch -o "$action" = boot ]; then
|
||||
nix-env --rollback -p "$profile"
|
||||
pathToConfig="$profile"
|
||||
elif [ "$action" = test -o "$action" = build ]; then
|
||||
systemNumber=$(
|
||||
nix-env -p "$profile" --list-generations |
|
||||
sed -n '/current/ {g; p;}; s/ *\([0-9]*\).*/\1/; h'
|
||||
)
|
||||
ln -sT "$profile"-${systemNumber}-link ./result
|
||||
pathToConfig=./result
|
||||
else
|
||||
showSyntax
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# If we're not just building, then make the new configuration the boot
|
||||
# default and/or activate it now.
|
||||
if [ "$action" = switch -o "$action" = boot -o "$action" = test ]; then
|
||||
$pathToConfig/bin/switch-to-configuration "$action"
|
||||
fi
|
||||
|
||||
|
||||
if [ "$action" = build-vm ]; then
|
||||
cat >&2 <<EOF
|
||||
|
||||
Done. The virtual machine can be started by running $(echo $pathToConfig/bin/run-*-vm).
|
||||
EOF
|
||||
fi
|
||||
@@ -0,0 +1,2 @@
|
||||
#! @shell@
|
||||
echo "@nixosVersion@ (@nixosCodeName@)"
|
||||
@@ -0,0 +1,112 @@
|
||||
# This module generates nixos-install, nixos-rebuild,
|
||||
# nixos-hardware-scan, etc.
|
||||
|
||||
{ config, pkgs, modulesPath, ... }:
|
||||
|
||||
let
|
||||
### implementation
|
||||
cfg = config.installer;
|
||||
|
||||
makeProg = args: pkgs.substituteAll (args // {
|
||||
dir = "bin";
|
||||
isExecutable = true;
|
||||
});
|
||||
|
||||
nixosBuildVMS = makeProg {
|
||||
name = "nixos-build-vms";
|
||||
src = ./nixos-build-vms/nixos-build-vms.sh;
|
||||
};
|
||||
|
||||
nixosInstall = makeProg {
|
||||
name = "nixos-install";
|
||||
src = ./nixos-install.sh;
|
||||
|
||||
inherit (pkgs) perl pathsFromGraph;
|
||||
nix = config.environment.nix;
|
||||
|
||||
nixClosure = pkgs.runCommand "closure"
|
||||
{ exportReferencesGraph = ["refs" config.environment.nix]; }
|
||||
"cp refs $out";
|
||||
};
|
||||
|
||||
nixosRebuild = makeProg {
|
||||
name = "nixos-rebuild";
|
||||
src = ./nixos-rebuild.sh;
|
||||
};
|
||||
|
||||
/*
|
||||
nixosGenSeccureKeys = makeProg {
|
||||
name = "nixos-gen-seccure-keys";
|
||||
src = ./nixos-gen-seccure-keys.sh;
|
||||
};
|
||||
*/
|
||||
|
||||
nixosHardwareScan = makeProg {
|
||||
name = "nixos-hardware-scan";
|
||||
src = ./nixos-hardware-scan.pl;
|
||||
inherit (pkgs) perl dmidecode;
|
||||
};
|
||||
|
||||
nixosOption = makeProg {
|
||||
name = "nixos-option";
|
||||
src = ./nixos-option.sh;
|
||||
};
|
||||
|
||||
nixosVersion = makeProg {
|
||||
name = "nixos-version";
|
||||
src = ./nixos-version.sh;
|
||||
inherit (config.system) nixosVersion nixosCodeName;
|
||||
};
|
||||
|
||||
nixosGui = pkgs.xulrunnerWrapper {
|
||||
launcher = "nixos-gui";
|
||||
application = pkgs.stdenv.mkDerivation {
|
||||
name = "nixos-gui";
|
||||
buildCommand = ''
|
||||
cp -r "$gui" "$out"
|
||||
|
||||
# Do not force the copy if the file exists in the sources (this
|
||||
# happens for developpers)
|
||||
test -e "$out/chrome/content/jquery-1.5.2.js" ||
|
||||
cp -f "$jquery" "$out/chrome/content/jquery-1.5.2.js"
|
||||
'';
|
||||
gui = pkgs.lib.cleanSource "${modulesPath}/../gui";
|
||||
jquery = pkgs.fetchurl {
|
||||
url = http://code.jquery.com/jquery-1.5.2.min.js;
|
||||
sha256 = "8f0a19ee8c606b35a10904951e0a27da1896eafe33c6e88cb7bcbe455f05a24a";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
installer.enableGraphicalTools = pkgs.lib.mkOption {
|
||||
default = false;
|
||||
type = with pkgs.lib.types; bool;
|
||||
example = true;
|
||||
description = ''
|
||||
Enable the installation of graphical tools.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
environment.systemPackages =
|
||||
[ nixosBuildVMS
|
||||
nixosInstall
|
||||
nixosRebuild
|
||||
nixosHardwareScan
|
||||
#nixosGenSeccureKeys
|
||||
nixosOption
|
||||
nixosVersion
|
||||
] ++ pkgs.lib.optional cfg.enableGraphicalTools nixosGui;
|
||||
|
||||
system.build = {
|
||||
inherit nixosInstall nixosHardwareScan nixosOption;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
imports =
|
||||
[ ../virtualisation/virtualbox-image.nix
|
||||
../installer/cd-dvd/channel.nix
|
||||
../profiles/demo.nix
|
||||
../profiles/clone-config.nix
|
||||
];
|
||||
|
||||
# Allow mounting of shared folders.
|
||||
users.extraUsers.demo.extraGroups = [ "vboxsf" ];
|
||||
|
||||
# Add some more video drivers to give X11 a shot at working in
|
||||
# VMware and QEMU.
|
||||
services.xserver.videoDrivers = mkOverride 40 [ "virtualbox" "vmware" "cirrus" "vesa" ];
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
failed = map (x: x.message) (filter (x: !x.assertion) config.assertions);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
assertions = mkOption {
|
||||
default = [];
|
||||
example = [ { assertion = false; message = "you can't enable this for that reason"; } ];
|
||||
merge = pkgs.lib.mergeListOption;
|
||||
description = ''
|
||||
This option allows modules to express conditions that must
|
||||
hold for the evaluation of the system configuration to
|
||||
succeed, along with associated error messages for the user.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
# This option is evaluated always. Thus the assertions are checked as well. hacky!
|
||||
environment.systemPackages =
|
||||
if [] == failed then []
|
||||
else throw "\nFailed assertions:\n${concatStringsSep "\n" (map (x: "- ${x}") failed)}";
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{pkgs, ...}:
|
||||
|
||||
{
|
||||
options = {
|
||||
environment.checkConfigurationOptions = pkgs.lib.mkOption {
|
||||
default = true;
|
||||
example = false;
|
||||
description = ''
|
||||
Whether to check the validity of the entire configuration.
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
{pkgs, config, ...}:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
crashdump = config.boot.crashDump;
|
||||
|
||||
kernelParams = concatStringsSep " " crashdump.kernelParams;
|
||||
|
||||
in
|
||||
###### interface
|
||||
{
|
||||
options = {
|
||||
boot = {
|
||||
crashDump = {
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
description = ''
|
||||
If enabled, NixOS will set up a kernel that will
|
||||
boot on crash, and leave the user to a stage1 debug1devices
|
||||
interactive shell to be able to save the crashed kernel dump.
|
||||
It also activates the NMI watchdog.
|
||||
'';
|
||||
};
|
||||
kernelPackages = mkOption {
|
||||
default = pkgs.linuxPackages;
|
||||
# We don't want to evaluate all of linuxPackages for the manual
|
||||
# - some of it might not even evaluate correctly.
|
||||
defaultText = "pkgs.linuxPackages";
|
||||
example = "pkgs.linuxPackages_2_6_25";
|
||||
description = ''
|
||||
This will override the boot.kernelPackages, and will add some
|
||||
kernel configuration parameters for the crash dump to work.
|
||||
'';
|
||||
};
|
||||
kernelParams = mkOption {
|
||||
default = [ "debug1devices" ];
|
||||
description = ''
|
||||
Parameters that will be passed to the kernel kexec-ed on crash.
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf crashdump.enable {
|
||||
boot = {
|
||||
postBootCommands = ''
|
||||
${pkgs.kexectools}/sbin/kexec -p /run/current-system/kernel \
|
||||
--initrd=/run/current-system/initrd \
|
||||
--append="init=$(readlink -f /run/current-system/init) system=$(readlink -f /run/current-system) irqpoll maxcpus=1 reset_devices ${kernelParams}" --reset-vga --console-vga
|
||||
'';
|
||||
kernelParams = [
|
||||
"crashkernel=64M"
|
||||
"nmi_watchdog=panic"
|
||||
"softlockup_panic=1"
|
||||
"idle=poll"
|
||||
];
|
||||
kernelPackages = mkOverride 50 (crashdump.kernelPackages // {
|
||||
kernel = crashdump.kernelPackages.kernel.override
|
||||
(attrs: {
|
||||
extraConfig = (optionalString (attrs ? extraConfig) attrs.extraConfig) +
|
||||
''
|
||||
CRASH_DUMP y
|
||||
DEBUG_INFO y
|
||||
PROC_VMCORE y
|
||||
LOCKUP_DETECTOR y
|
||||
HARDLOCKUP_DETECTOR y
|
||||
'';
|
||||
});
|
||||
});
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
# This module defines the global list of uids and gids. We keep a
|
||||
# central list to prevent id collisions.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
ids.uids = pkgs.lib.mkOption {
|
||||
description = ''
|
||||
The user IDs used in NixOS.
|
||||
'';
|
||||
};
|
||||
|
||||
ids.gids = pkgs.lib.mkOption {
|
||||
description = ''
|
||||
The group IDs used in NixOS.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
config = {
|
||||
|
||||
ids.uids = {
|
||||
root = 0;
|
||||
nscd = 1;
|
||||
sshd = 2;
|
||||
ntp = 3;
|
||||
messagebus = 4; # D-Bus
|
||||
haldaemon = 5;
|
||||
nagios = 6;
|
||||
vsftpd = 7;
|
||||
ftp = 8;
|
||||
bitlbee = 9;
|
||||
avahi = 10;
|
||||
atd = 12;
|
||||
zabbix = 13;
|
||||
postfix = 14;
|
||||
dovecot = 15;
|
||||
tomcat = 16;
|
||||
pulseaudio = 22; # must match `pulseaudio' GID
|
||||
gpsd = 23;
|
||||
polkituser = 28;
|
||||
uptimed = 29;
|
||||
ddclient = 30;
|
||||
davfs2 = 31;
|
||||
privoxy = 32;
|
||||
osgi = 34;
|
||||
tor = 35;
|
||||
cups = 36;
|
||||
foldingAtHome = 37;
|
||||
sabnzbd = 38;
|
||||
kdm = 39;
|
||||
ghostOne = 40;
|
||||
git = 41;
|
||||
fourStore = 42;
|
||||
fourStoreEndpoint = 43;
|
||||
virtuoso = 44;
|
||||
rtkit = 45;
|
||||
dovecot2 = 46;
|
||||
dovenull2 = 47;
|
||||
unbound = 48;
|
||||
prayer = 49;
|
||||
mpd = 50;
|
||||
clamav = 51;
|
||||
fprot = 52;
|
||||
bind = 53;
|
||||
wwwrun = 54;
|
||||
spamd = 56;
|
||||
nslcd = 58;
|
||||
nginx = 60;
|
||||
chrony = 61;
|
||||
smtpd = 63;
|
||||
smtpq = 64;
|
||||
supybot = 65;
|
||||
iodined = 66;
|
||||
graphite = 68;
|
||||
statsd = 69;
|
||||
transmission = 70;
|
||||
postgres = 71;
|
||||
smbguest = 74;
|
||||
varnish = 75;
|
||||
dd-agent = 76;
|
||||
lighttpd = 77;
|
||||
lightdm = 78;
|
||||
freenet = 79;
|
||||
ircd = 80;
|
||||
bacula = 81;
|
||||
almir = 82;
|
||||
deluge = 83;
|
||||
mysql = 84;
|
||||
rabbitmq = 85;
|
||||
activemq = 86;
|
||||
gnunet = 87;
|
||||
oidentd = 88;
|
||||
quassel = 89;
|
||||
amule = 90;
|
||||
minidlna = 91;
|
||||
elasticsearch = 92;
|
||||
tcpcryptd = 93; # tcpcryptd uses a hard-coded uid. We patch it in Nixpkgs to match this choice.
|
||||
zope2 = 94;
|
||||
firebird = 95;
|
||||
|
||||
# When adding a uid, make sure it doesn't match an existing gid.
|
||||
|
||||
nixbld = 30000; # start of range of uids
|
||||
nobody = 65534;
|
||||
};
|
||||
|
||||
ids.gids = {
|
||||
root = 0;
|
||||
wheel = 1;
|
||||
kmem = 2;
|
||||
tty = 3;
|
||||
messagebus = 4; # D-Bus
|
||||
haldaemon = 5;
|
||||
disk = 6;
|
||||
vsftpd = 7;
|
||||
ftp = 8;
|
||||
bitlbee = 9;
|
||||
avahi = 10;
|
||||
atd = 12;
|
||||
postfix = 13;
|
||||
postdrop = 14;
|
||||
dovecot = 15;
|
||||
audio = 17;
|
||||
floppy = 18;
|
||||
uucp = 19;
|
||||
lp = 20;
|
||||
tomcat = 21;
|
||||
pulseaudio = 22; # must match `pulseaudio' UID
|
||||
gpsd = 23;
|
||||
cdrom = 24;
|
||||
tape = 25;
|
||||
video = 26;
|
||||
dialout = 27;
|
||||
polkituser = 28;
|
||||
utmp = 29;
|
||||
davfs2 = 31;
|
||||
privoxy = 32;
|
||||
disnix = 33;
|
||||
osgi = 34;
|
||||
ghostOne = 40;
|
||||
git = 41;
|
||||
fourStore = 42;
|
||||
fourStoreEndpoint = 43;
|
||||
virtuoso = 44;
|
||||
dovecot2 = 46;
|
||||
prayer = 49;
|
||||
mpd = 50;
|
||||
clamav = 51;
|
||||
fprot = 52;
|
||||
wwwrun = 54;
|
||||
adm = 55;
|
||||
spamd = 56;
|
||||
networkmanager = 57;
|
||||
nslcd = 58;
|
||||
scanner = 59;
|
||||
nginx = 60;
|
||||
systemd-journal = 62;
|
||||
smtpd = 63;
|
||||
smtpq = 64;
|
||||
supybot = 65;
|
||||
iodined = 66;
|
||||
libvirtd = 67;
|
||||
graphite = 68;
|
||||
transmission = 70;
|
||||
postgres = 71;
|
||||
vboxusers = 72;
|
||||
vboxsf = 73;
|
||||
smbguest = 74;
|
||||
varnish = 75;
|
||||
dd-agent = 76;
|
||||
lighttpd = 77;
|
||||
lightdm = 78;
|
||||
freenet = 79;
|
||||
ircd = 80;
|
||||
bacula = 81;
|
||||
almir = 82;
|
||||
deluge = 83;
|
||||
mysql = 84;
|
||||
rabbitmq = 85;
|
||||
activemq = 86;
|
||||
gnunet = 87;
|
||||
oidentd = 88;
|
||||
quassel = 89;
|
||||
amule = 90;
|
||||
minidlna = 91;
|
||||
|
||||
# When adding a gid, make sure it doesn't match an existing uid.
|
||||
|
||||
users = 100;
|
||||
nixbld = 30000;
|
||||
nogroup = 65534;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
options = {
|
||||
lib = pkgs.lib.mkOption {
|
||||
default = {};
|
||||
|
||||
type = pkgs.lib.types.attrsOf pkgs.lib.types.attrs;
|
||||
|
||||
description = ''
|
||||
This option allows modules to define helper functions, constants, etc.
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
locatedb = "/var/cache/locatedb";
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
services.locate = {
|
||||
|
||||
enable = mkOption {
|
||||
default = false;
|
||||
example = true;
|
||||
description = ''
|
||||
If enabled, NixOS will periodically update the database of
|
||||
files used by the <command>locate</command> command.
|
||||
'';
|
||||
};
|
||||
|
||||
period = mkOption {
|
||||
default = "15 02 * * *";
|
||||
description = ''
|
||||
This option defines (in the format used by cron) when the
|
||||
locate database is updated.
|
||||
The default is to update at 02:15 (at night) every day.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = {
|
||||
|
||||
systemd.services.update-locatedb =
|
||||
{ description = "Update Locate Database";
|
||||
path = [ pkgs.su ];
|
||||
script =
|
||||
''
|
||||
mkdir -m 0755 -p $(dirname ${locatedb})
|
||||
exec updatedb --localuser=nobody --output=${locatedb} --prunepaths='/tmp /var/tmp /media /run'
|
||||
'';
|
||||
serviceConfig.Nice = 19;
|
||||
serviceConfig.IOSchedulingClass = "idle";
|
||||
};
|
||||
|
||||
services.cron.systemCronJobs = optional config.services.locate.enable
|
||||
"${config.services.locate.period} root ${config.systemd.package}/bin/systemctl start update-locatedb.service";
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
isConfig = x:
|
||||
builtins.isAttrs x || builtins.isFunction x;
|
||||
|
||||
optCall = f: x:
|
||||
if builtins.isFunction f
|
||||
then f x
|
||||
else f;
|
||||
|
||||
mergeConfig = lhs_: rhs_:
|
||||
let
|
||||
lhs = optCall lhs_ { inherit pkgs; };
|
||||
rhs = optCall rhs_ { inherit pkgs; };
|
||||
in
|
||||
lhs // rhs //
|
||||
optionalAttrs (lhs ? packageOverrides) {
|
||||
packageOverrides = pkgs:
|
||||
optCall lhs.packageOverrides pkgs //
|
||||
optCall (attrByPath ["packageOverrides"] ({}) rhs) pkgs;
|
||||
};
|
||||
|
||||
configType = mkOptionType {
|
||||
name = "nixpkgs config";
|
||||
check = traceValIfNot isConfig;
|
||||
merge = fold mergeConfig {};
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
nixpkgs.config = mkOption {
|
||||
default = {};
|
||||
example = literalExample
|
||||
''
|
||||
{ firefox.enableGeckoMediaPlayer = true;
|
||||
packageOverrides = pkgs: {
|
||||
firefox60Pkgs = pkgs.firefox60Pkgs.override {
|
||||
enableOfficialBranding = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
'';
|
||||
type = configType;
|
||||
description = ''
|
||||
The configuration of the Nix Packages collection. (For
|
||||
details, see the Nixpkgs documentation.) It allows you to set
|
||||
package configuration options, and to override packages
|
||||
globally through the <varname>packageOverrides</varname>
|
||||
option. The latter is a function that takes as an argument
|
||||
the <emphasis>original</emphasis> Nixpkgs, and must evaluate
|
||||
to a set of new or overridden packages.
|
||||
'';
|
||||
};
|
||||
|
||||
nixpkgs.system = mkOption {
|
||||
default = pkgs.stdenv.system;
|
||||
description = ''
|
||||
Specifies the Nix platform type for which NixOS should be built.
|
||||
If unset, it defaults to the platform type of your host system
|
||||
(<literal>${builtins.currentSystem}</literal>).
|
||||
Specifying this option is useful when doing distributed
|
||||
multi-platform deployment, or when building virtual machines.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
# FIXME
|
||||
nixpkgs.config.packageOverrides = pkgs: {
|
||||
#udev = pkgs.systemd;
|
||||
slim = pkgs.slim.override (args: if args ? consolekit then { consolekit = null; } else { });
|
||||
lvm2 = pkgs.lvm2.override { udev = pkgs.systemd; };
|
||||
upower = pkgs.upower.override { useSystemd = true; };
|
||||
polkit = pkgs.polkit.override { useSystemd = true; };
|
||||
consolekit = null;
|
||||
};
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
# This module allows you to export something from configuration
|
||||
# Use case: export kernel source expression for ease of configuring
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
options = {
|
||||
passthru = pkgs.lib.mkOption {
|
||||
description = ''
|
||||
This attribute set will be exported as a system attribute.
|
||||
You can put whatever you want here.
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
system.nixosVersion = mkOption {
|
||||
type = types.uniq types.string;
|
||||
description = "NixOS version.";
|
||||
};
|
||||
|
||||
system.nixosVersionSuffix = mkOption {
|
||||
type = types.uniq types.string;
|
||||
description = "NixOS version suffix.";
|
||||
};
|
||||
|
||||
system.nixosCodeName = mkOption {
|
||||
type = types.uniq types.string;
|
||||
description = "NixOS release code name.";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
system.nixosVersion =
|
||||
mkDefault (builtins.readFile ../../.version + config.system.nixosVersionSuffix);
|
||||
|
||||
system.nixosVersionSuffix =
|
||||
mkDefault (if builtins.pathExists ../../.version-suffix then builtins.readFile ../../.version-suffix else "pre-git");
|
||||
|
||||
# Note: code names must only increase in alphabetical order.
|
||||
system.nixosCodeName = "Aardvark";
|
||||
|
||||
# Generate /etc/os-release. See
|
||||
# http://0pointer.de/public/systemd-man/os-release.html for the
|
||||
# format.
|
||||
environment.etc = singleton
|
||||
{ source = pkgs.writeText "os-release"
|
||||
''
|
||||
NAME=NixOS
|
||||
ID=nixos
|
||||
VERSION="${config.system.nixosVersion} (${config.system.nixosCodeName})"
|
||||
VERSION_ID="${config.system.nixosVersion}"
|
||||
PRETTY_NAME="NixOS ${config.system.nixosVersion} (${config.system.nixosCodeName})"
|
||||
HOME_URL="http://nixos.org/"
|
||||
'';
|
||||
target = "os-release";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
[
|
||||
./config/fonts/corefonts.nix
|
||||
./config/fonts/fontconfig.nix
|
||||
./config/fonts/fontdir.nix
|
||||
./config/fonts/fonts.nix
|
||||
./config/fonts/ghostscript.nix
|
||||
./config/gnu.nix
|
||||
./config/i18n.nix
|
||||
./config/krb5.nix
|
||||
./config/ldap.nix
|
||||
./config/networking.nix
|
||||
./config/no-x-libs.nix
|
||||
./config/nsswitch.nix
|
||||
./config/power-management.nix
|
||||
./config/pulseaudio.nix
|
||||
./config/shells-environment.nix
|
||||
./config/swap.nix
|
||||
./config/sysctl.nix
|
||||
./config/system-path.nix
|
||||
./config/timezone.nix
|
||||
./config/unix-odbc-drivers.nix
|
||||
./config/users-groups.nix
|
||||
./hardware/all-firmware.nix
|
||||
./hardware/cpu/intel-microcode.nix
|
||||
./hardware/cpu/amd-microcode.nix
|
||||
./hardware/network/b43.nix
|
||||
./hardware/network/intel-2100bg.nix
|
||||
./hardware/network/intel-2200bg.nix
|
||||
./hardware/network/intel-3945abg.nix
|
||||
./hardware/network/ralink.nix
|
||||
./hardware/network/rtl8192c.nix
|
||||
./hardware/pcmcia.nix
|
||||
./installer/tools/nixos-checkout.nix
|
||||
./installer/tools/tools.nix
|
||||
./misc/assertions.nix
|
||||
./misc/check-config.nix
|
||||
./misc/crashdump.nix
|
||||
./misc/ids.nix
|
||||
./misc/lib.nix
|
||||
./misc/locate.nix
|
||||
./misc/nixpkgs.nix
|
||||
./misc/passthru.nix
|
||||
./misc/version.nix
|
||||
./programs/atop.nix
|
||||
./programs/bash/bash.nix
|
||||
./programs/bash/command-not-found.nix
|
||||
./programs/blcr.nix
|
||||
./programs/environment.nix
|
||||
./programs/info.nix
|
||||
./programs/shadow.nix
|
||||
./programs/shell.nix
|
||||
./programs/ssh.nix
|
||||
./programs/ssmtp.nix
|
||||
./programs/venus.nix
|
||||
./programs/wvdial.nix
|
||||
./programs/zsh/zsh.nix
|
||||
./rename.nix
|
||||
./security/apparmor.nix
|
||||
./security/apparmor-suid.nix
|
||||
./security/ca.nix
|
||||
./security/pam.nix
|
||||
./security/pam_usb.nix
|
||||
./security/polkit.nix
|
||||
./security/rngd.nix
|
||||
./security/rtkit.nix
|
||||
./security/setuid-wrappers.nix
|
||||
./security/sudo.nix
|
||||
./services/amqp/activemq/default.nix
|
||||
./services/amqp/rabbitmq.nix
|
||||
./services/audio/alsa.nix
|
||||
./services/audio/fuppes.nix
|
||||
./services/audio/mpd.nix
|
||||
./services/backup/almir.nix
|
||||
./services/backup/bacula.nix
|
||||
./services/backup/mysql-backup.nix
|
||||
./services/backup/postgresql-backup.nix
|
||||
./services/backup/sitecopy-backup.nix
|
||||
./services/backup/rsnapshot.nix
|
||||
./services/databases/4store-endpoint.nix
|
||||
./services/databases/4store.nix
|
||||
./services/databases/firebird.nix
|
||||
./services/databases/memcached.nix
|
||||
./services/databases/mongodb.nix
|
||||
./services/databases/redis.nix
|
||||
./services/databases/mysql.nix
|
||||
./services/databases/mysql55.nix
|
||||
./services/databases/openldap.nix
|
||||
./services/databases/postgresql.nix
|
||||
./services/databases/virtuoso.nix
|
||||
./services/games/ghost-one.nix
|
||||
./services/hardware/acpid.nix
|
||||
./services/hardware/bluetooth.nix
|
||||
./services/hardware/nvidia-optimus.nix
|
||||
./services/hardware/pcscd.nix
|
||||
./services/hardware/pommed.nix
|
||||
./services/hardware/sane.nix
|
||||
./services/hardware/udev.nix
|
||||
./services/hardware/udisks.nix
|
||||
./services/hardware/udisks2.nix
|
||||
./services/hardware/upower.nix
|
||||
./services/hardware/thinkfan.nix
|
||||
./services/logging/klogd.nix
|
||||
./services/logging/logcheck.nix
|
||||
./services/logging/logrotate.nix
|
||||
./services/logging/logstash.nix
|
||||
./services/logging/syslogd.nix
|
||||
./services/logging/rsyslogd.nix
|
||||
./services/mail/dovecot.nix
|
||||
./services/mail/freepops.nix
|
||||
./services/mail/mail.nix
|
||||
./services/mail/opensmtpd.nix
|
||||
./services/mail/postfix.nix
|
||||
./services/mail/spamassassin.nix
|
||||
./services/misc/autofs.nix
|
||||
./services/misc/cgminer.nix
|
||||
./services/misc/disnix.nix
|
||||
./services/misc/felix.nix
|
||||
./services/misc/folding-at-home.nix
|
||||
./services/misc/gpsd.nix
|
||||
./services/misc/nix-daemon.nix
|
||||
./services/misc/nix-gc.nix
|
||||
./services/misc/nixos-manual.nix
|
||||
./services/misc/rogue.nix
|
||||
./services/misc/svnserve.nix
|
||||
./services/misc/synergy.nix
|
||||
./services/monitoring/apcupsd.nix
|
||||
./services/monitoring/dd-agent.nix
|
||||
./services/monitoring/graphite.nix
|
||||
./services/monitoring/monit.nix
|
||||
./services/monitoring/nagios/default.nix
|
||||
./services/monitoring/smartd.nix
|
||||
./services/monitoring/statsd.nix
|
||||
./services/monitoring/systemhealth.nix
|
||||
./services/monitoring/ups.nix
|
||||
./services/monitoring/uptime.nix
|
||||
./services/monitoring/zabbix-agent.nix
|
||||
./services/monitoring/zabbix-server.nix
|
||||
./services/network-filesystems/drbd.nix
|
||||
./services/network-filesystems/nfsd.nix
|
||||
./services/network-filesystems/openafs-client/default.nix
|
||||
./services/network-filesystems/samba.nix
|
||||
./services/networking/amuled.nix
|
||||
./services/networking/avahi-daemon.nix
|
||||
./services/networking/bind.nix
|
||||
./services/networking/bitlbee.nix
|
||||
./services/networking/cntlm.nix
|
||||
./services/networking/chrony.nix
|
||||
./services/networking/ddclient.nix
|
||||
#./services/networking/dhclient.nix
|
||||
./services/networking/dhcpcd.nix
|
||||
./services/networking/dhcpd.nix
|
||||
./services/networking/dnsmasq.nix
|
||||
./services/networking/ejabberd.nix
|
||||
./services/networking/firewall.nix
|
||||
./services/networking/tcpcrypt.nix
|
||||
./services/networking/flashpolicyd.nix
|
||||
./services/networking/freenet.nix
|
||||
./services/networking/git-daemon.nix
|
||||
./services/networking/gnunet.nix
|
||||
./services/networking/gogoclient.nix
|
||||
./services/networking/gvpe.nix
|
||||
./services/networking/hostapd.nix
|
||||
./services/networking/ifplugd.nix
|
||||
./services/networking/iodined.nix
|
||||
./services/networking/ircd-hybrid/default.nix
|
||||
./services/networking/minidlna.nix
|
||||
./services/networking/nat.nix
|
||||
./services/networking/networkmanager.nix
|
||||
./services/networking/ntpd.nix
|
||||
./services/networking/oidentd.nix
|
||||
./services/networking/openfire.nix
|
||||
./services/networking/openvpn.nix
|
||||
./services/networking/prayer.nix
|
||||
./services/networking/privoxy.nix
|
||||
./services/networking/quassel.nix
|
||||
./services/networking/radvd.nix
|
||||
./services/networking/rdnssd.nix
|
||||
./services/networking/rpcbind.nix
|
||||
./services/networking/sabnzbd.nix
|
||||
./services/networking/supybot.nix
|
||||
./services/networking/ssh/lshd.nix
|
||||
./services/networking/ssh/sshd.nix
|
||||
./services/networking/tftpd.nix
|
||||
./services/networking/unbound.nix
|
||||
./services/networking/vsftpd.nix
|
||||
./services/networking/wakeonlan.nix
|
||||
./services/networking/websockify.nix
|
||||
./services/networking/wicd.nix
|
||||
./services/networking/wpa_supplicant.nix
|
||||
./services/networking/xinetd.nix
|
||||
./services/printing/cupsd.nix
|
||||
./services/scheduling/atd.nix
|
||||
./services/scheduling/cron.nix
|
||||
./services/scheduling/fcron.nix
|
||||
./services/search/elasticsearch.nix
|
||||
./services/security/clamav.nix
|
||||
./services/security/fprot.nix
|
||||
./services/security/frandom.nix
|
||||
./services/security/tor.nix
|
||||
./services/security/torify.nix
|
||||
./services/security/torsocks.nix
|
||||
./services/system/dbus.nix
|
||||
./services/system/kerberos.nix
|
||||
./services/system/nscd.nix
|
||||
./services/system/uptimed.nix
|
||||
./services/torrent/deluge.nix
|
||||
./services/torrent/transmission.nix
|
||||
./services/ttys/gpm.nix
|
||||
./services/ttys/agetty.nix
|
||||
./services/web-servers/apache-httpd/default.nix
|
||||
./services/web-servers/jboss/default.nix
|
||||
./services/web-servers/lighttpd/default.nix
|
||||
./services/web-servers/lighttpd/cgit.nix
|
||||
./services/web-servers/lighttpd/gitweb.nix
|
||||
./services/web-servers/nginx/default.nix
|
||||
./services/web-servers/tomcat.nix
|
||||
./services/web-servers/varnish/default.nix
|
||||
./services/web-servers/zope2.nix
|
||||
./services/x11/desktop-managers/default.nix
|
||||
./services/x11/display-managers/auto.nix
|
||||
./services/x11/display-managers/default.nix
|
||||
./services/x11/display-managers/kdm.nix
|
||||
./services/x11/display-managers/slim.nix
|
||||
./services/x11/display-managers/lightdm.nix
|
||||
./services/x11/hardware/multitouch.nix
|
||||
./services/x11/hardware/synaptics.nix
|
||||
./services/x11/hardware/wacom.nix
|
||||
./services/x11/window-managers/awesome.nix
|
||||
#./services/x11/window-managers/compiz.nix
|
||||
./services/x11/window-managers/default.nix
|
||||
./services/x11/window-managers/icewm.nix
|
||||
./services/x11/window-managers/metacity.nix
|
||||
./services/x11/window-managers/none.nix
|
||||
./services/x11/window-managers/twm.nix
|
||||
./services/x11/window-managers/wmii.nix
|
||||
./services/x11/window-managers/xmonad.nix
|
||||
./services/x11/xfs.nix
|
||||
./services/x11/xserver.nix
|
||||
./system/activation/activation-script.nix
|
||||
./system/activation/top-level.nix
|
||||
./system/boot/kernel.nix
|
||||
./system/boot/kexec.nix
|
||||
./system/boot/loader/efi-boot-stub/efi-boot-stub.nix
|
||||
./system/boot/loader/efi.nix
|
||||
./system/boot/loader/generations-dir/generations-dir.nix
|
||||
./system/boot/loader/gummiboot/gummiboot.nix
|
||||
./system/boot/loader/raspberrypi/raspberrypi.nix
|
||||
./system/boot/loader/grub/grub.nix
|
||||
./system/boot/loader/grub/memtest.nix
|
||||
./system/boot/loader/init-script/init-script.nix
|
||||
./system/boot/luksroot.nix
|
||||
./system/boot/modprobe.nix
|
||||
./system/boot/shutdown.nix
|
||||
./system/boot/stage-1.nix
|
||||
./system/boot/stage-2.nix
|
||||
./system/boot/systemd.nix
|
||||
./system/etc/etc.nix
|
||||
./system/upstart/upstart.nix
|
||||
./tasks/cpu-freq.nix
|
||||
./tasks/filesystems.nix
|
||||
./tasks/filesystems/btrfs.nix
|
||||
./tasks/filesystems/ext.nix
|
||||
./tasks/filesystems/nfs.nix
|
||||
./tasks/filesystems/reiserfs.nix
|
||||
./tasks/filesystems/unionfs-fuse.nix
|
||||
./tasks/filesystems/vfat.nix
|
||||
./tasks/filesystems/xfs.nix
|
||||
./tasks/filesystems/zfs.nix
|
||||
./tasks/kbd.nix
|
||||
./tasks/lvm.nix
|
||||
./tasks/network-interfaces.nix
|
||||
./tasks/scsi-link-power-management.nix
|
||||
./tasks/swraid.nix
|
||||
./virtualisation/libvirtd.nix
|
||||
./virtualisation/nova.nix
|
||||
./virtualisation/virtualbox-guest.nix
|
||||
./virtualisation/xen-dom0.nix
|
||||
]
|
||||
@@ -0,0 +1,55 @@
|
||||
# This module enables all hardware supported by NixOS: i.e., all
|
||||
# firmware is included, and all devices from which one may boot are
|
||||
# enabled in the initrd. Its primary use is in the NixOS installation
|
||||
# CDs.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
|
||||
# The initrd has to contain any module that might be necessary for
|
||||
# mounting the CD/DVD.
|
||||
boot.initrd.availableKernelModules =
|
||||
[ # SATA/PATA support.
|
||||
"ahci"
|
||||
|
||||
"ata_piix"
|
||||
|
||||
"sata_inic162x" "sata_nv" "sata_promise" "sata_qstor"
|
||||
"sata_sil" "sata_sil24" "sata_sis" "sata_svw" "sata_sx4"
|
||||
"sata_uli" "sata_via" "sata_vsc"
|
||||
|
||||
"pata_ali" "pata_amd" "pata_artop" "pata_atiixp"
|
||||
"pata_cs5520" "pata_cs5530" "pata_cs5535" "pata_efar"
|
||||
"pata_hpt366" "pata_hpt37x" "pata_hpt3x2n" "pata_hpt3x3"
|
||||
"pata_it8213" "pata_it821x" "pata_jmicron" "pata_marvell"
|
||||
"pata_mpiix" "pata_netcell" "pata_ns87410" "pata_oldpiix"
|
||||
"pata_pcmcia" "pata_pdc2027x" "pata_qdi" "pata_rz1000"
|
||||
"pata_sc1200" "pata_serverworks" "pata_sil680" "pata_sis"
|
||||
"pata_sl82c105" "pata_triflex" "pata_via"
|
||||
"pata_winbond"
|
||||
|
||||
# SCSI support (incomplete).
|
||||
"3w-9xxx" "3w-xxxx" "aic79xx" "aic7xxx" "arcmsr"
|
||||
|
||||
# USB support, especially for booting from USB CD-ROM
|
||||
# drives.
|
||||
"usb_storage"
|
||||
|
||||
# Firewire support. Not tested.
|
||||
"ohci1394" "sbp2"
|
||||
|
||||
# Virtio (QEMU, KVM etc.) support.
|
||||
"virtio_net" "virtio_pci" "virtio_blk" "virtio_balloon" "virtio_console"
|
||||
|
||||
# Keyboards
|
||||
"hid_apple"
|
||||
];
|
||||
|
||||
# Include lots of firmware.
|
||||
hardware.enableAllFirmware = true;
|
||||
|
||||
imports =
|
||||
[ ../hardware/network/zydas-zd1211.nix ];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
# This module defines the software packages included in the "minimal"
|
||||
# installation CD. It might be useful elsewhere.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Include some utilities that are useful for installing or repairing
|
||||
# the system.
|
||||
environment.systemPackages = [
|
||||
pkgs.subversion # for nixos-checkout
|
||||
pkgs.w3m # needed for the manual anyway
|
||||
pkgs.testdisk # useful for repairing boot problems
|
||||
pkgs.mssys # for writing Microsoft boot sectors / MBRs
|
||||
pkgs.parted
|
||||
pkgs.gptfdisk
|
||||
pkgs.ddrescue
|
||||
pkgs.ccrypt
|
||||
pkgs.cryptsetup # needed for dm-crypt volumes
|
||||
|
||||
# Some networking tools.
|
||||
pkgs.fuse
|
||||
pkgs.sshfsFuse
|
||||
pkgs.socat
|
||||
pkgs.screen
|
||||
|
||||
# Hardware-related tools.
|
||||
pkgs.sdparm
|
||||
pkgs.hdparm
|
||||
pkgs.dmraid
|
||||
pkgs.smartmontools # for diagnosing hard disks
|
||||
|
||||
# Tools to create / manipulate filesystems.
|
||||
pkgs.ntfsprogs # for resizing NTFS partitions
|
||||
pkgs.dosfstools
|
||||
pkgs.xfsprogs
|
||||
pkgs.jfsutils
|
||||
#pkgs.jfsrec # disabled because of Boost dependency
|
||||
|
||||
# Some compression/archiver tools.
|
||||
pkgs.unrar
|
||||
pkgs.unzip
|
||||
pkgs.zip
|
||||
pkgs.dar # disk archiver
|
||||
pkgs.cabextract
|
||||
|
||||
# Some editors.
|
||||
pkgs.vim
|
||||
pkgs.bvi # binary editor
|
||||
pkgs.joe
|
||||
];
|
||||
|
||||
# Include support for various filesystems.
|
||||
boot.supportedFilesystems = [ "btrfs" "reiserfs" "vfat" ];
|
||||
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
{ config, pkgs, modules, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
# Location of the repository on the harddrive
|
||||
nixosPath = toString ../..;
|
||||
|
||||
# Check if the path is from the NixOS repository
|
||||
isNixOSFile = path:
|
||||
let s = toString path; in
|
||||
removePrefix nixosPath s != s;
|
||||
|
||||
# Copy modules given as extra configuration files. Unfortunately, we
|
||||
# cannot serialized attribute set given in the list of modules (that's why
|
||||
# you should use files).
|
||||
moduleFiles =
|
||||
filter isPath modules;
|
||||
|
||||
# Partition module files because between NixOS and non-NixOS files. NixOS
|
||||
# files may change if the repository is updated.
|
||||
partitionedModuleFiles =
|
||||
let p = partition isNixOSFile moduleFiles; in
|
||||
{ nixos = p.right; others = p.wrong; };
|
||||
|
||||
# Path transformed to be valid on the installation device. Thus the
|
||||
# device configuration could be rebuild.
|
||||
relocatedModuleFiles =
|
||||
let
|
||||
relocateNixOS = path:
|
||||
"<nixos" + removePrefix nixosPath (toString path) + ">";
|
||||
relocateOthers = null;
|
||||
in
|
||||
{ nixos = map relocateNixOS partitionedModuleFiles.nixos;
|
||||
others = []; # TODO: copy the modules to the install-device repository.
|
||||
};
|
||||
|
||||
# A dummy /etc/nixos/configuration.nix in the booted CD that
|
||||
# rebuilds the CD's configuration (and allows the configuration to
|
||||
# be modified, of course, providing a true live CD). Problem is
|
||||
# that we don't really know how the CD was built - the Nix
|
||||
# expression language doesn't allow us to query the expression being
|
||||
# evaluated. So we'll just hope for the best.
|
||||
configClone = pkgs.writeText "configuration.nix"
|
||||
''
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ${toString config.installer.cloneConfigIncludes} ];
|
||||
}
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
options = {
|
||||
|
||||
installer.cloneConfig = mkOption {
|
||||
default = true;
|
||||
description = ''
|
||||
Try to clone the installation-device configuration by re-using it's
|
||||
profile from the list of imported modules.
|
||||
'';
|
||||
};
|
||||
|
||||
installer.cloneConfigIncludes = mkOption {
|
||||
default = [];
|
||||
example = [ "./nixos/modules/hardware/network/rt73.nix" ];
|
||||
description = ''
|
||||
List of modules used to re-build this installation device profile.
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = {
|
||||
|
||||
installer.cloneConfigIncludes =
|
||||
relocatedModuleFiles.nixos ++ relocatedModuleFiles.others;
|
||||
|
||||
boot.postBootCommands =
|
||||
''
|
||||
# Provide a mount point for nixos-install.
|
||||
mkdir -p /mnt
|
||||
|
||||
${optionalString config.installer.cloneConfig ''
|
||||
# Provide a configuration for the CD/DVD itself, to allow users
|
||||
# to run nixos-rebuild to change the configuration of the
|
||||
# running system on the CD/DVD.
|
||||
if ! [ -e /etc/nixos/configuration.nix ]; then
|
||||
cp ${configClone} /etc/nixos/configuration.nix
|
||||
fi
|
||||
''}
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ./graphical.nix ];
|
||||
|
||||
users.extraUsers.demo =
|
||||
{ description = "Demo user account";
|
||||
group = "users";
|
||||
extraGroups = [ "wheel" ];
|
||||
home = "/home/demo";
|
||||
createHome = true;
|
||||
useDefaultShell = true;
|
||||
password = "demo";
|
||||
isSystemUser = false;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
# This module defines a NixOS configuration that contains X11 and
|
||||
# KDE 4. It's used by the graphical installation CD.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
displayManager.kdm.enable = true;
|
||||
desktopManager.kde4.enable = true;
|
||||
};
|
||||
|
||||
environment.systemPackages = [ pkgs.glxinfo ];
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
# Common configuration for headless machines (e.g., Amazon EC2
|
||||
# instances).
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
sound.enable = false;
|
||||
boot.vesa = false;
|
||||
|
||||
# Don't start a tty on the serial consoles.
|
||||
systemd.services."serial-getty@ttyS0".enable = false;
|
||||
systemd.services."serial-getty@hvc0".enable = false;
|
||||
|
||||
# Since we can't manually respond to a panic, just reboot.
|
||||
boot.kernelParams = [ "panic=1" "boot.panic_on_fail" ];
|
||||
|
||||
# Don't allow emergency mode, because we don't have a console.
|
||||
systemd.enableEmergencyMode = false;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
# Provide a basic configuration for installation devices like CDs.
|
||||
{ config, pkgs, modules, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
{
|
||||
imports =
|
||||
[ # Enable devices which are usually scanned, because we don't know the
|
||||
# target system.
|
||||
../installer/scan/detected.nix
|
||||
../installer/scan/not-detected.nix
|
||||
|
||||
# Allow "nixos-rebuild" to work properly by providing
|
||||
# /etc/nixos/configuration.nix.
|
||||
./clone-config.nix
|
||||
];
|
||||
|
||||
config = {
|
||||
|
||||
# Show the manual.
|
||||
services.nixosManual.showManual = true;
|
||||
|
||||
# Let the user play Rogue on TTY 8 during the installation.
|
||||
services.rogue.enable = true;
|
||||
|
||||
# Disable some other stuff we don't need.
|
||||
security.sudo.enable = false;
|
||||
|
||||
# Include only the en_US locale. This saves 75 MiB or so compared to
|
||||
# the full glibcLocales package.
|
||||
i18n.supportedLocales = ["en_US.UTF-8/UTF-8" "en_US/ISO-8859-1"];
|
||||
|
||||
# Some more help text.
|
||||
services.mingetty.helpLine =
|
||||
''
|
||||
|
||||
Log in as "root" with an empty password. ${
|
||||
optionalString config.services.xserver.enable
|
||||
"Type `start display-manager' to\nstart the graphical user interface."}
|
||||
'';
|
||||
|
||||
# Allow sshd to be started manually through "start sshd".
|
||||
services.openssh.enable = true;
|
||||
systemd.services.sshd.wantedBy = mkOverride 50 [];
|
||||
|
||||
# Enable wpa_supplicant, but don't start it by default.
|
||||
networking.wireless.enable = true;
|
||||
jobs.wpa_supplicant.startOn = pkgs.lib.mkOverride 50 "";
|
||||
|
||||
# Tell the Nix evaluator to garbage collect more aggressively.
|
||||
# This is desirable in memory-constrained environments that don't
|
||||
# (yet) have swap set up.
|
||||
environment.variables.GC_INITIAL_HEAP_SIZE = "100000";
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
# This module defines a small NixOS configuration. It does not
|
||||
# contain any graphical stuff.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Don't include X libraries.
|
||||
programs.ssh.setXAuthLocation = false;
|
||||
fonts.enableFontConfig = false;
|
||||
fonts.enableCoreFonts = false;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
# Common configuration for virtual machines running under QEMU (using
|
||||
# virtio).
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
boot.initrd.availableKernelModules = [ "virtio_net" "virtio_pci" "virtio_blk" "9p" "9pnet_virtio" ];
|
||||
boot.kernelModules = [ "virtio_balloon" "virtio_console" ];
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
# Global configuration for atop.
|
||||
|
||||
{config, pkgs, ...}:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let cfg = config.programs.atop;
|
||||
|
||||
in
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
programs.atop = {
|
||||
|
||||
settings = mkOption {
|
||||
type = types.attrs;
|
||||
default = {};
|
||||
example = {
|
||||
flags = "a1f";
|
||||
interval = 5;
|
||||
};
|
||||
description = ''
|
||||
Parameters to be written to <filename>/etc/atoprc</filename>
|
||||
'';
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf (cfg.settings != {}) {
|
||||
environment.etc."atoprc".text =
|
||||
concatStrings (mapAttrsToList (n: v: "${n} ${toString v}\n") cfg.settings);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,217 @@
|
||||
# This module defines global configuration for the Bash shell, in
|
||||
# particular /etc/bashrc and /etc/profile.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfge = config.environment;
|
||||
|
||||
cfg = config.programs.bash;
|
||||
|
||||
bashCompletion = optionalString cfg.enableCompletion ''
|
||||
# Check whether we're running a version of Bash that has support for
|
||||
# programmable completion. If we do, enable all modules installed in
|
||||
# the system (and user profile).
|
||||
if shopt -q progcomp &>/dev/null; then
|
||||
. "${pkgs.bashCompletion}/etc/profile.d/bash_completion.sh"
|
||||
nullglobStatus=$(shopt -p nullglob)
|
||||
shopt -s nullglob
|
||||
for p in $NIX_PROFILES; do
|
||||
for m in "$p/etc/bash_completion.d/"* "$p/share/bash-completion/completions/"*; do
|
||||
. $m
|
||||
done
|
||||
done
|
||||
eval "$nullglobStatus"
|
||||
unset nullglobStatus p m
|
||||
fi
|
||||
'';
|
||||
|
||||
bashAliases = concatStringsSep "\n" (
|
||||
mapAttrsFlatten (k: v: "alias ${k}='${v}'") cfg.shellAliases
|
||||
);
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
options = {
|
||||
|
||||
programs.bash = {
|
||||
|
||||
enable = mkOption {
|
||||
default = true;
|
||||
description = ''
|
||||
Whenever to configure Bash as an interactive shell.
|
||||
Note that this tries to make Bash the default
|
||||
<option>users.defaultUserShell</option>,
|
||||
which in turn means that you might need to explicitly
|
||||
set this variable if you have another shell configured
|
||||
with NixOS.
|
||||
'';
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
shellAliases = mkOption {
|
||||
default = config.environment.shellAliases // { which = "type -P"; };
|
||||
description = ''
|
||||
Set of aliases for bash shell. See <option>environment.shellAliases</option>
|
||||
for an option format description.
|
||||
'';
|
||||
type = types.attrs; # types.attrsOf types.stringOrPath;
|
||||
};
|
||||
|
||||
shellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during bash shell initialisation.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
loginShellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during login bash shell initialisation.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
interactiveShellInit = mkOption {
|
||||
default = "";
|
||||
description = ''
|
||||
Shell script code called during interactive bash shell initialisation.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
promptInit = mkOption {
|
||||
default = ''
|
||||
# Provide a nice prompt.
|
||||
PROMPT_COLOR="1;31m"
|
||||
let $UID && PROMPT_COLOR="1;32m"
|
||||
PS1="\n\[\033[$PROMPT_COLOR\][\u@\h:\w]\\$\[\033[0m\] "
|
||||
if test "$TERM" = "xterm"; then
|
||||
PS1="\[\033]2;\h:\u:\w\007\]$PS1"
|
||||
fi
|
||||
'';
|
||||
description = ''
|
||||
Shell script code used to initialise the bash prompt.
|
||||
'';
|
||||
type = types.lines;
|
||||
};
|
||||
|
||||
enableCompletion = mkOption {
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Bash completion for all interactive bash shells.
|
||||
'';
|
||||
type = types.bool;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
|
||||
programs.bash = {
|
||||
|
||||
shellInit = ''
|
||||
. ${config.system.build.setEnvironment}
|
||||
|
||||
${cfge.shellInit}
|
||||
'';
|
||||
|
||||
loginShellInit = cfge.loginShellInit;
|
||||
|
||||
interactiveShellInit = ''
|
||||
${cfge.interactiveShellInit}
|
||||
|
||||
# Check the window size after every command.
|
||||
shopt -s checkwinsize
|
||||
|
||||
# Disable hashing (i.e. caching) of command lookups.
|
||||
set +h
|
||||
|
||||
${cfg.promptInit}
|
||||
${bashCompletion}
|
||||
${bashAliases}
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
environment.etc."profile".text =
|
||||
''
|
||||
# /etc/profile: DO NOT EDIT -- this file has been generated automatically.
|
||||
# This file is read for login shells.
|
||||
|
||||
# Only execute this file once per shell.
|
||||
if [ -n "$__ETC_PROFILE_SOURCED" ]; then return; fi
|
||||
__ETC_PROFILE_SOURCED=1
|
||||
|
||||
# Prevent this file from being sourced by interactive non-login child shells.
|
||||
export __ETC_PROFILE_DONE=1
|
||||
|
||||
${cfg.shellInit}
|
||||
${cfg.loginShellInit}
|
||||
|
||||
# Read system-wide modifications.
|
||||
if test -f /etc/profile.local; then
|
||||
. /etc/profile.local
|
||||
fi
|
||||
|
||||
if [ -n "''${BASH_VERSION:-}" ]; then
|
||||
. /etc/bashrc
|
||||
fi
|
||||
'';
|
||||
|
||||
environment.etc."bashrc".text =
|
||||
''
|
||||
# /etc/bashrc: DO NOT EDIT -- this file has been generated automatically.
|
||||
|
||||
# Only execute this file once per shell.
|
||||
if [ -n "$__ETC_BASHRC_SOURCED" -o -n "$NOSYSBASHRC" ]; then return; fi
|
||||
__ETC_BASHRC_SOURCED=1
|
||||
|
||||
# If the profile was not loaded in a parent process, source
|
||||
# it. But otherwise don't do it because we don't want to
|
||||
# clobber overridden values of $PATH, etc.
|
||||
if [ -z "$__ETC_PROFILE_DONE" ]; then
|
||||
. /etc/profile
|
||||
fi
|
||||
|
||||
# We are not always an interactive shell.
|
||||
if [ -n "$PS1" ]; then
|
||||
${cfg.interactiveShellInit}
|
||||
fi
|
||||
|
||||
# Read system-wide modifications.
|
||||
if test -f /etc/bashrc.local; then
|
||||
. /etc/bashrc.local
|
||||
fi
|
||||
'';
|
||||
|
||||
# Configuration for readline in bash.
|
||||
environment.etc."inputrc".source = ./inputrc;
|
||||
|
||||
users.defaultUserShell = mkDefault "/run/current-system/sw/bin/bash";
|
||||
|
||||
environment.pathsToLink = optionals cfg.enableCompletion [
|
||||
"/etc/bash_completion.d"
|
||||
"/share/bash-completion"
|
||||
];
|
||||
|
||||
environment.shells =
|
||||
[ "/run/current-system/sw/bin/bash"
|
||||
"/var/run/current-system/sw/bin/bash"
|
||||
"/run/current-system/sw/bin/sh"
|
||||
"/var/run/current-system/sw/bin/sh"
|
||||
"${pkgs.bashInteractive}/bin/bash"
|
||||
"${pkgs.bashInteractive}/bin/sh"
|
||||
];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
# This module provides suggestions of packages to install if the user
|
||||
# tries to run a missing command in Bash. This is implemented using a
|
||||
# SQLite database that maps program names to Nix package names (e.g.,
|
||||
# "pdflatex" is mapped to "tetex").
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
commandNotFound = pkgs.substituteAll {
|
||||
name = "command-not-found";
|
||||
dir = "bin";
|
||||
src = ./command-not-found.pl;
|
||||
isExecutable = true;
|
||||
inherit (pkgs) perl;
|
||||
perlFlags = concatStrings (map (path: "-I ${path}/lib/perl5/site_perl ")
|
||||
[ pkgs.perlPackages.DBI pkgs.perlPackages.DBDSQLite ]);
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
programs.bash.interactiveShellInit =
|
||||
''
|
||||
# This function is called whenever a command is not found.
|
||||
command_not_found_handle() {
|
||||
local p=/run/current-system/sw/bin/command-not-found
|
||||
if [ -x $p -a -f /nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite ]; then
|
||||
# Run the helper program.
|
||||
$p "$1"
|
||||
# Retry the command if we just installed it.
|
||||
if [ $? = 126 ]; then
|
||||
"$@"
|
||||
else
|
||||
return 127
|
||||
fi
|
||||
else
|
||||
echo "$1: command not found" >&2
|
||||
return 127
|
||||
fi
|
||||
}
|
||||
'';
|
||||
|
||||
environment.systemPackages = [ commandNotFound ];
|
||||
|
||||
# TODO: tab completion for uninstalled commands! :-)
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#! @perl@/bin/perl -w @perlFlags@
|
||||
|
||||
use strict;
|
||||
use DBI;
|
||||
use DBD::SQLite;
|
||||
use Config;
|
||||
|
||||
my $program = $ARGV[0];
|
||||
|
||||
my $dbPath = "/nix/var/nix/profiles/per-user/root/channels/nixos/programs.sqlite";
|
||||
|
||||
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
|
||||
or die "cannot open database `$dbPath'";
|
||||
$dbh->{RaiseError} = 0;
|
||||
$dbh->{PrintError} = 0;
|
||||
|
||||
my $system = $ENV{"NIX_SYSTEM"} // $Config{myarchname};
|
||||
|
||||
my $res = $dbh->selectall_arrayref(
|
||||
"select package from Programs where system = ? and name = ?",
|
||||
{ Slice => {} }, $system, $program);
|
||||
|
||||
if (!defined $res || scalar @$res == 0) {
|
||||
print STDERR "$program: command not found\n";
|
||||
} elsif (scalar @$res == 1) {
|
||||
my $package = @$res[0]->{package};
|
||||
if ($ENV{"NIX_AUTO_INSTALL"} // "") {
|
||||
print STDERR <<EOF;
|
||||
The program ‘$program’ is currently not installed. It is provided by
|
||||
the package ‘$package’, which I will now install for you.
|
||||
EOF
|
||||
;
|
||||
exit 126 if system("nix-env", "-i", $package) == 0;
|
||||
} else {
|
||||
print STDERR <<EOF;
|
||||
The program ‘$program’ is currently not installed. You can install it by typing:
|
||||
nix-env -i $package
|
||||
EOF
|
||||
}
|
||||
} else {
|
||||
print STDERR <<EOF;
|
||||
The program ‘$program’ is currently not installed. It is provided by
|
||||
several packages. You can install it by typing one of the following:
|
||||
EOF
|
||||
print STDERR " nix-env -i $_->{package}\n" foreach @$res;
|
||||
}
|
||||
|
||||
exit 127;
|
||||
@@ -0,0 +1,36 @@
|
||||
# inputrc borrowed from CentOS (RHEL).
|
||||
|
||||
set bell-style none
|
||||
|
||||
set meta-flag on
|
||||
set input-meta on
|
||||
set convert-meta off
|
||||
set output-meta on
|
||||
|
||||
#set mark-symlinked-directories on
|
||||
|
||||
$if mode=emacs
|
||||
|
||||
# for linux console and RH/Debian xterm
|
||||
"\e[1~": beginning-of-line
|
||||
"\e[4~": end-of-line
|
||||
"\e[5~": beginning-of-history
|
||||
"\e[6~": end-of-history
|
||||
"\e[3~": delete-char
|
||||
"\e[2~": quoted-insert
|
||||
"\e[5C": forward-word
|
||||
"\e[5D": backward-word
|
||||
"\e[1;5C": forward-word
|
||||
"\e[1;5D": backward-word
|
||||
|
||||
# for rxvt
|
||||
"\e[8~": end-of-line
|
||||
|
||||
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
|
||||
"\eOH": beginning-of-line
|
||||
"\eOF": end-of-line
|
||||
|
||||
# for freebsd console
|
||||
"\e[H": beginning-of-line
|
||||
"\e[F": end-of-line
|
||||
$endif
|
||||
@@ -0,0 +1,27 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
let
|
||||
inherit (pkgs.lib) mkOption mkIf;
|
||||
cfg = config.environment.blcr;
|
||||
blcrPkg = config.boot.kernelPackages.blcr;
|
||||
in
|
||||
|
||||
{
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
environment.blcr.enable = mkOption {
|
||||
default = false;
|
||||
description =
|
||||
"Whether to enable support for the BLCR checkpointing tool.";
|
||||
};
|
||||
};
|
||||
|
||||
###### implementation
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
boot.kernelModules = [ "blcr" "blcr_imports" ];
|
||||
boot.extraModulePackages = [ blcrPkg ];
|
||||
environment.systemPackages = [ blcrPkg ];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
# This module defines a standard configuration for NixOS global environment.
|
||||
|
||||
# Most of the stuff here should probably be moved elsewhere sometime.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
cfg = config.environment;
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
config = {
|
||||
|
||||
environment.variables =
|
||||
{ LOCALE_ARCHIVE = "/run/current-system/sw/lib/locale/locale-archive";
|
||||
LOCATE_PATH = "/var/cache/locatedb";
|
||||
NIXPKGS_CONFIG = "/etc/nix/nixpkgs-config.nix";
|
||||
NIX_PATH =
|
||||
[ "/nix/var/nix/profiles/per-user/root/channels/nixos"
|
||||
"nixpkgs=/etc/nixos/nixpkgs"
|
||||
"nixos=/etc/nixos/nixos"
|
||||
"nixos-config=/etc/nixos/configuration.nix"
|
||||
"services=/etc/nixos/services"
|
||||
];
|
||||
PAGER = "less -R";
|
||||
EDITOR = "nano";
|
||||
};
|
||||
|
||||
environment.profiles =
|
||||
[ "$HOME/.nix-profile"
|
||||
"/nix/var/nix/profiles/default"
|
||||
"/run/current-system/sw"
|
||||
];
|
||||
|
||||
# !!! fix environment.profileVariables definition and then move
|
||||
# most of these elsewhere
|
||||
environment.profileVariables = (i:
|
||||
{ PATH = [ "${i}/bin" "${i}/sbin" "${i}/lib/kde4/libexec" ];
|
||||
MANPATH = [ "${i}/man" "${i}/share/man" ];
|
||||
INFOPATH = [ "${i}/info" "${i}/share/info" ];
|
||||
PKG_CONFIG_PATH = [ "${i}/lib/pkgconfig" ];
|
||||
TERMINFO_DIRS = [ "${i}/share/terminfo" ];
|
||||
PERL5LIB = [ "${i}/lib/perl5/site_perl" ];
|
||||
ALSA_PLUGIN_DIRS = [ "${i}/lib/alsa-lib" ];
|
||||
GST_PLUGIN_PATH = [ "${i}/lib/gstreamer-0.10" ];
|
||||
KDEDIRS = [ "${i}" ];
|
||||
STRIGI_PLUGIN_PATH = [ "${i}/lib/strigi/" ];
|
||||
QT_PLUGIN_PATH = [ "${i}/lib/qt4/plugins" "${i}/lib/kde4/plugins" ];
|
||||
QTWEBKIT_PLUGIN_PATH = [ "${i}/lib/mozilla/plugins/" ];
|
||||
GTK_PATH = [ "${i}/lib/gtk-2.0" ];
|
||||
XDG_CONFIG_DIRS = [ "${i}/etc/xdg" ];
|
||||
XDG_DATA_DIRS = [ "${i}/share" ];
|
||||
MOZ_PLUGIN_PATH = [ "${i}/lib/mozilla/plugins" ];
|
||||
});
|
||||
|
||||
environment.extraInit =
|
||||
''
|
||||
# reset TERM with new TERMINFO available (if any)
|
||||
export TERM=$TERM
|
||||
|
||||
unset ASPELL_CONF
|
||||
for i in ${concatStringsSep " " (reverseList cfg.profiles)} ; do
|
||||
if [ -d "$i/lib/aspell" ]; then
|
||||
export ASPELL_CONF="dict-dir $i/lib/aspell"
|
||||
fi
|
||||
done
|
||||
|
||||
export NIX_USER_PROFILE_DIR="/nix/var/nix/profiles/per-user/$USER"
|
||||
export NIX_PROFILES="${concatStringsSep " " (reverseList cfg.profiles)}"
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{config, pkgs, ...}:
|
||||
|
||||
let
|
||||
|
||||
# Quick hack to make the `info' command work properly. `info' needs
|
||||
# a "dir" file containing all the installed Info files, which we
|
||||
# don't have (it would be impure to have a package installation
|
||||
# update some global "dir" file). So this wrapper script around
|
||||
# "info" builds a temporary "dir" file on the fly. This is a bit
|
||||
# slow (on a cold cache) but not unacceptably so.
|
||||
infoWrapper = pkgs.writeScriptBin "info"
|
||||
''
|
||||
#! ${pkgs.stdenv.shell}
|
||||
|
||||
dir=$(mktemp --tmpdir -d "info.dir.XXXXXX")
|
||||
|
||||
if test -z "$dir"; then exit 1; fi
|
||||
|
||||
trap 'rm -rf "$dir"' EXIT
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
for i in $(IFS=:; echo $INFOPATH); do
|
||||
for j in $i/*.info; do
|
||||
${pkgs.texinfo}/bin/install-info --quiet $j $dir/dir
|
||||
done
|
||||
done
|
||||
|
||||
INFOPATH=$dir:$INFOPATH ${pkgs.texinfo}/bin/info "$@"
|
||||
''; # */
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
environment.systemPackages = [ infoWrapper pkgs.texinfo ];
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
# Configuration for the pwdutils suite of tools: passwd, useradd, etc.
|
||||
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
|
||||
loginDefs =
|
||||
''
|
||||
DEFAULT_HOME yes
|
||||
|
||||
SYS_UID_MIN 100
|
||||
SYS_UID_MAX 499
|
||||
UID_MIN 1000
|
||||
UID_MAX 29999
|
||||
|
||||
SYS_GID_MIN 100
|
||||
SYS_GID_MAX 499
|
||||
GID_MIN 1000
|
||||
GID_MAX 29999
|
||||
|
||||
TTYGROUP tty
|
||||
TTYPERM 0620
|
||||
|
||||
# Ensure privacy for newly created home directories.
|
||||
UMASK 077
|
||||
|
||||
# Uncomment this to allow non-root users to change their account
|
||||
#information. This should be made configurable.
|
||||
#CHFN_RESTRICT frwh
|
||||
|
||||
'';
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
|
||||
###### interface
|
||||
|
||||
options = {
|
||||
|
||||
users.defaultUserShell = pkgs.lib.mkOption {
|
||||
description = ''
|
||||
This option defines the default shell assigned to user
|
||||
accounts. This must not be a store path, since the path is
|
||||
used outside the store (in particular in /etc/passwd).
|
||||
Rather, it should be the path of a symlink that points to the
|
||||
actual shell in the Nix store.
|
||||
'';
|
||||
type = types.uniq types.path;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
###### implementation
|
||||
|
||||
config = {
|
||||
|
||||
environment.systemPackages = [ pkgs.shadow ];
|
||||
|
||||
environment.etc =
|
||||
[ { # /etc/login.defs: global configuration for pwdutils. You
|
||||
# cannot login without it!
|
||||
source = pkgs.writeText "login.defs" loginDefs;
|
||||
target = "login.defs";
|
||||
}
|
||||
|
||||
{ # /etc/default/useradd: configuration for useradd.
|
||||
source = pkgs.writeText "useradd"
|
||||
''
|
||||
GROUP=100
|
||||
HOME=/home
|
||||
SHELL=${config.users.defaultUserShell}
|
||||
'';
|
||||
target = "default/useradd";
|
||||
}
|
||||
];
|
||||
|
||||
security.pam.services =
|
||||
[ { name = "chsh"; rootOK = true; }
|
||||
{ name = "chfn"; rootOK = true; }
|
||||
{ name = "su"; rootOK = true; forwardXAuth = true; }
|
||||
{ name = "passwd"; }
|
||||
# Note: useradd, groupadd etc. aren't setuid root, so it
|
||||
# doesn't really matter what the PAM config says as long as it
|
||||
# lets root in.
|
||||
{ name = "useradd"; rootOK = true; }
|
||||
{ name = "usermod"; rootOK = true; }
|
||||
{ name = "userdel"; rootOK = true; }
|
||||
{ name = "groupadd"; rootOK = true; }
|
||||
{ name = "groupmod"; rootOK = true; }
|
||||
{ name = "groupmems"; rootOK = true; }
|
||||
{ name = "groupdel"; rootOK = true; }
|
||||
{ name = "login"; startSession = true; allowNullPassword = true; showMotd = true; updateWtmp = true; }
|
||||
];
|
||||
|
||||
security.setuidPrograms = [ "passwd" "chfn" "su" "newgrp" ];
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user