§ Nix weirdness on small machines

floobits@pixel-druid:~$ nix-env -iA nixpkgs.hello                                                                                    
+ nix-env -iA nixpkgs.hello                                                                                                          
installing 'hello-2.10'                                                                                                              
these paths will be fetched (0.04 MiB download, 0.20 MiB unpacked):                                                                  
  /nix/store/w9yy7v61ipb5rx6i35zq1mvc2iqfmps1-hello-2.10                                                                             
copying path '/nix/store/w9yy7v61ipb5rx6i35zq1mvc2iqfmps1-hello-2.10' from 'https://cache.nixos.org'...                              
error: unable to fork: Cannot allocate memory                                                                                        
floobits@pixel-druid:~$ gdb --args nix-env -iA nixpkgs.hello                                                                         
+ gdb --args nix-env -iA nixpkgs.hello                                                                                               
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1                                                                                         
Copyright (C) 2016 Free Software Foundation, Inc.                                                                                    
License GPLv3+: GNU GPL version 3 or later                                                         
This is free software: you are free to change and redistribute it.                                                                   
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"                                                           
and "show warranty" for details.                                                                                                     
This GDB was configured as "x86_64-linux-gnu".                                                                                       
Type "show configuration" for configuration details.                                                                                 
For bug reporting instructions, please see:                                                                                          
.                                                                                             
Find the GDB manual and other documentation resources online at:                                                                     
.                                                                                    
For help, type "help".                                                                                                               
Type "apropos word" to search for commands related to "word"...                                                                      
Reading symbols from nix-env...(no debugging symbols found)...done.                                                                  
(gdb) run                                                                                                                            
Starting program: /nix/store/d6axkgf0jq41jb537fnsg44080c4rd52-user-environment/bin/nix-env -iA nixpkgs.hello                         
warning: File "/nix/store/danv012gh0aakh8xnk2b35vahklz72mk-gcc-9.2.0-lib/lib/libstdc++.so.6.0.27-gdb.py" auto-loading has been declin
ed by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".                                                              
To enable execution of this file add                                                                                                 
        add-auto-load-safe-path /nix/store/danv012gh0aakh8xnk2b35vahklz72mk-gcc-9.2.0-lib/lib/libstdc++.so.6.0.27-gdb.py             
line to your configuration file "/home/floobits/.gdbinit".                                                                           
To completely disable this security protection add                                                                                   
        set auto-load safe-path /                                                                                                    
line to your configuration file "/home/floobits/.gdbinit".                                                                           
For more information about this security protection see the                                                                          
"Auto-loading safe path" section in the GDB manual.  E.g., run from the shell:                                                       
        info "(gdb)Auto-loading safe path"                                                                                           
warning: File "/nix/store/xg6ilb9g9zhi2zg1dpi4zcp288rhnvns-glibc-2.30/lib/libthread_db-1.0.so" auto-loading has been declined by your
 `auto-load safe-path' set to "$debugdir:$datadir/auto-load".                                                                        
warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.                     
^[[A[New LWP 21466]                                                                                                                  
GC Warning: Failed to expand heap by 128045056 bytes                                                                                 
installing 'hello-2.10'                                                                                                              
building '/nix/store/k3kz3cwyqdwi5bmwcbl1fzv2b2wkqrl6-user-environment.drv'...                                                       
created 43 symlinks in user environment                                                                                              
[LWP 21466 exited]                                                                                                                   
[Inferior 1 (process 21462) exited normally]                                                                                         
(gdb) run                                                                                                                            

§ All nix subcommands are just symlinks

floobits@pixel-druid:~/idfk/nix-master$ ls -al /nix/store/4vz8sh9ngx34ivi0bw5hlycxdhvy5hvz-nix-2.3.7/bin/                            
total 1784                                                                                                                           
dr-xr-xr-x 2 floobits bollu    4096 Jan  1  1970 .                                                                                   
dr-xr-xr-x 9 floobits bollu    4096 Jan  1  1970 ..                                                                                  
-r-xr-xr-x 1 floobits bollu 1816768 Jan  1  1970 nix                                                                                 
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-build -> nix                                                                    
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-channel -> nix                                                                  
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-collect-garbage -> nix                                                          
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-copy-closure -> nix                                                             
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-daemon -> nix                                                                   
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-env -> nix                                                                      
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-hash -> nix                                                                     
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-instantiate -> nix                                                              
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-prefetch-url -> nix                                                             
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-shell -> nix                                                                    
lrwxrwxrwx 1 floobits bollu       3 Jan  1  1970 nix-store -> nix                                                                    
It seems the way this works is that the nix tool figures out from what symlink it's being invoked to decide what to do. God, that's ugly? brilliant? I don't even know.

§ How does writeFile work?

  • cowsay in nixpkgs
  • writeFile in nixpkgs
  • runCommand' in nixpkgs
  • mkDerivation in nixpkgs
  • derivation in nixpkgs
  • src/libexpr/primops/derivation.nix in nixos
  • prim_derivationStrict in nixos c++
  • derivationArg in nixos c++
  • writeDerivation in nixos c++