forked from rarias/jungle
		
	Add quickstart guide
Reviewed-by: Aleix Boné <abonerib@bsc.es>
This commit is contained in:
		
							parent
							
								
									b4a12625c5
								
							
						
					
					
						commit
						b77ce7fb56
					
				
							
								
								
									
										10
									
								
								web/content/doc/_index.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								web/content/doc/_index.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| --- | ||||
| title: "Docs" | ||||
| description: "Documentation for users of jungle machines" | ||||
| date: 2023-09-15 | ||||
| --- | ||||
| 
 | ||||
| If this is the first time you use any of the jungle machines with NixOS, follow | ||||
| the [quick start guide](quickstart). | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										234
									
								
								web/content/doc/quickstart.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								web/content/doc/quickstart.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,234 @@ | ||||
| --- | ||||
| title: "Quick start" | ||||
| date: 2023-09-15 | ||||
| --- | ||||
| 
 | ||||
| This documentation will guide you on how to build custom packages of software | ||||
| and use them in the jungle machines. It has been designed to reduce the friction | ||||
| from users coming from module systems. | ||||
| 
 | ||||
| You should be able to access the jungle machines, otherwise [request | ||||
| access](/access). | ||||
| 
 | ||||
| ## Changes from other HPC machines | ||||
| 
 | ||||
| Users of other machines have been using the Lmod tool (module load ...) to add | ||||
| or remove programs from their environment, as well as manually building their | ||||
| own software for too many years. | ||||
| 
 | ||||
| While we cannot prevent users from continuing to use this tedious mechanism, we | ||||
| have designed the jungle machines to be much easier to operate by using the nix | ||||
| package manager. | ||||
| 
 | ||||
| ### Freedom to install packages | ||||
| 
 | ||||
| When a user wanted to install a package, it was forced to either do it on its | ||||
| own directory, or request a system administrator to install it in a shared | ||||
| directory, so other users can also use that package. | ||||
| 
 | ||||
| This situation is gone, each user can install any package of software by | ||||
| themselves, without requiring any other authorization. When two users request | ||||
| the same package, the same copy will be provided. | ||||
| 
 | ||||
| A new package will be downloaded if it is available (someone already built it) | ||||
| or will be built from source on demand. | ||||
| 
 | ||||
| ### No changes over time | ||||
| 
 | ||||
| All users retain the same versions of the packages they request until they | ||||
| decide to update them. | ||||
| 
 | ||||
| ## Using nix to manage packages | ||||
| 
 | ||||
| In this chapter we show how to install packages and enter a development shell to | ||||
| build new programs from source. The examples are done from the hut machine, | ||||
| read [this page](/access) to request access. | ||||
| 
 | ||||
| ### Installing binaries | ||||
| 
 | ||||
| To temporarily install new packages, use: | ||||
| 
 | ||||
| ```text | ||||
| hut% nix shell jungle#gcc jungle#cowsay jungle#ovni | ||||
| ``` | ||||
| 
 | ||||
| Notice that the packages are described as two parts divided by the `#` symbol. | ||||
| The first part defines where to take the package from and the second part is | ||||
| the name of the package. For now we will use `jungle#<package>`. You can find | ||||
| many more packages here: | ||||
| 
 | ||||
| <https://search.nixos.org/packages> | ||||
| 
 | ||||
| You will now enter a new shell, where those requested package **binaries are | ||||
| available in $PATH**: | ||||
| 
 | ||||
| ```text | ||||
| hut% cowsay hello world | ||||
|  _____________ | ||||
| < hello world > | ||||
|  ------------- | ||||
|         \   ^__^ | ||||
|          \  (oo)\_______ | ||||
|             (__)\       )\/\ | ||||
|                 ||----w | | ||||
|                 ||     || | ||||
| 
 | ||||
| hut% ovniver | ||||
| LD_LIBRARY_PATH not set | ||||
| libovni: build v1.11.0 (a7103f8), dynamic v1.11.0 (a7103f8) | ||||
| 
 | ||||
| hut% gcc --version | ||||
| gcc (GCC) 13.3.0 | ||||
| Copyright (C) 2023 Free Software Foundation, Inc. | ||||
| This is free software; see the source for copying conditions.  There is NO | ||||
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
| ``` | ||||
| 
 | ||||
| ### Building programs | ||||
| 
 | ||||
| The above method only loads new binaries in the `$PATH`. If we try to build a | ||||
| program that includes headers or links with a library, it will fail to find | ||||
| them: | ||||
| 
 | ||||
| ```text | ||||
| hut$ cat test.c | ||||
| #include <ovni.h> | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|         ovni_version_check(); | ||||
|         return 0; | ||||
| } | ||||
| hut% gcc test.c -lovni -o test | ||||
| test.c:1:10: fatal error: ovni.h: No such file or directory | ||||
|     1 | #include <ovni.h> | ||||
|       |          ^~~~~~~~ | ||||
| compilation terminated. | ||||
| ``` | ||||
| 
 | ||||
| We could manually add the full path to the ovni include directory with `-I` and | ||||
| the libraries with `-L`, but there is a tool that already perform these steps | ||||
| automatically for us, `nix develop`. | ||||
| 
 | ||||
| Let's go back to our original shell first, where those packages are not | ||||
| available anymore: | ||||
| 
 | ||||
| ``` | ||||
| hut% ps | ||||
|     PID TTY          TIME CMD | ||||
| 2356260 pts/1    00:00:01 zsh | ||||
| 2457268 pts/1    00:00:00 zsh | ||||
| 2457297 pts/1    00:00:00 ps | ||||
| hut% exit | ||||
| hut% ovniver | ||||
| ovniver: command not found | ||||
| ``` | ||||
| 
 | ||||
| ### Creating a flake.nix | ||||
| 
 | ||||
| To define which packages we want, we will write a small file that list them, a | ||||
| flake.nix file. | ||||
| 
 | ||||
| First, we will create a new directory where we are going to be working: | ||||
| 
 | ||||
| ``` | ||||
| hut% mkdir example | ||||
| hut% cd exmple | ||||
| ``` | ||||
| 
 | ||||
| Then place this flake.nix file: | ||||
| 
 | ||||
| ```nix | ||||
| { | ||||
|   inputs.jungle.url = "jungle"; | ||||
|   outputs = { self, jungle }:   | ||||
|   let | ||||
|     pkgs = jungle.outputs.packages.x86_64-linux; | ||||
|   in { | ||||
|     devShells.x86_64-linux.default = pkgs.mkShell { | ||||
|       pname = "devshell"; | ||||
|       buildInputs = with pkgs; [ | ||||
|         ovni gcc cowsay # more packages here... | ||||
|       ]; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| Now enter the shell with: | ||||
| 
 | ||||
| ``` | ||||
| hut% nix develop | ||||
| warning: creating lock file '/home/Computational/rarias/example/flake.lock': | ||||
| • Added input 'jungle': | ||||
|     'path:/nix/store/27srv8haj6vv4ywrbmw0a8vds561m8rq-source?lastModified=1739479441&narHash=sha256-Kgjs8SO1w9NbPBu8ghwzCxYJ9kvWpoQOT%2BXwPvA9DcU%3D&rev=76396c0d67ef0cf32377d5c1894bb695293bca9d' (2025-02-13) | ||||
| • Added input 'jungle/agenix': | ||||
|     'github:ryantm/agenix/f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41?narHash=sha256-b%2Buqzj%2BWa6xgMS9aNbX4I%2BsXeb5biPDi39VgvSFqFvU%3D' (2024-08-10) | ||||
| • Added input 'jungle/agenix/darwin': | ||||
|     'github:lnl7/nix-darwin/4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d?narHash=sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0%3D' (2023-11-24) | ||||
| • Added input 'jungle/agenix/darwin/nixpkgs': | ||||
|     follows 'jungle/agenix/nixpkgs' | ||||
| • Added input 'jungle/agenix/home-manager': | ||||
|     'github:nix-community/home-manager/3bfaacf46133c037bb356193bd2f1765d9dc82c1?narHash=sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE%3D' (2023-12-20) | ||||
| • Added input 'jungle/agenix/home-manager/nixpkgs': | ||||
|     follows 'jungle/agenix/nixpkgs' | ||||
| • Added input 'jungle/agenix/nixpkgs': | ||||
|     follows 'jungle/nixpkgs' | ||||
| • Added input 'jungle/agenix/systems': | ||||
|     'github:nix-systems/default/da67096a3b9bf56a91d16901293e51ba5b49a27e?narHash=sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768%3D' (2023-04-09) | ||||
| • Added input 'jungle/bscpkgs': | ||||
|     'git+https://git.sr.ht/~rodarima/bscpkgs?ref=refs/heads/master&rev=6782fc6c5b5a29e84a7f2c2d1064f4bcb1288c0f' (2024-11-29) | ||||
| • Added input 'jungle/bscpkgs/nixpkgs': | ||||
|     follows 'jungle/nixpkgs' | ||||
| • Added input 'jungle/nixpkgs': | ||||
|     'github:NixOS/nixpkgs/9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc?narHash=sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8%3D' (2025-01-14) | ||||
| 
 | ||||
| hut$  | ||||
| ``` | ||||
| 
 | ||||
| Notice that long list of messages is Nix creating a new flake.lock file with the | ||||
| current state of the packages. Next invocations will use the same packages as | ||||
| described by the lock file. | ||||
| 
 | ||||
| ### Building a program from nix develop | ||||
| 
 | ||||
| Now let's try again building our test program: | ||||
| 
 | ||||
| ```text | ||||
| hut$ cat test.c | ||||
| #include <ovni.h> | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|         ovni_version_check(); | ||||
|         return 0; | ||||
| } | ||||
| hut$ gcc test.c -o test -lovni | ||||
| hut$ ldd test | ||||
|         linux-vdso.so.1 (0x00007ffff7fc4000) | ||||
|         libovni.so.1 => /nix/store/sqk972akjv0q8dchn8ccjln2llzyyfd0-ovni-1.11.0/lib/libovni.so.1 (0x00007ffff7fab000) | ||||
|         libc.so.6 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/libc.so.6 (0x00007ffff7db2000) | ||||
|         /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib/ld-linux-x86-64.so.2 => /nix/store/nqb2ns2d1lahnd5ncwmn6k84qfd7vx2k-glibc-2.40-36/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fc6000) | ||||
| hut$ ./test | ||||
| ``` | ||||
| 
 | ||||
| Now the ovni.h header and the libovni library are found and the program is | ||||
| successfully built, linked and executed. | ||||
| 
 | ||||
| You can add more packages as needed in your flake.nix: | ||||
| 
 | ||||
| ```nix | ||||
|   buildInputs = with pkgs; [ | ||||
|     ovni gcc cowsay # more packages here... | ||||
|   ]; | ||||
| ``` | ||||
| 
 | ||||
| Make sure you exit the develop shell first, and then enter again with `nix | ||||
| develop`. | ||||
| 
 | ||||
| ## Remember | ||||
| 
 | ||||
| - `nix shell` places binaries in the `$PATH`. | ||||
| - `nix develop` enters a development shell where both binaries and the libraries | ||||
|   and includes are available so you can build new programs. | ||||
| @ -3,32 +3,38 @@ languageCode = 'en-us' | ||||
| title = 'The jungle' | ||||
| theme = 'PaperMod' | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "doc" | ||||
| name = "Docs" | ||||
| url = "/doc/" | ||||
| weight = 10 | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "grafana" | ||||
| name = "Grafana" | ||||
| url = "/grafana/" | ||||
| weight = 10 | ||||
| weight = 20 | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "Git" | ||||
| name = "Git" | ||||
| url = "/git/" | ||||
| weight = 20 | ||||
| weight = 30 | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "Lists" | ||||
| name = "Lists" | ||||
| url = "/lists/" | ||||
| weight = 30 | ||||
| weight = 40 | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "Paste" | ||||
| name = "Paste" | ||||
| url = "/paste/" | ||||
| weight = 40 | ||||
| weight = 50 | ||||
| 
 | ||||
| [[menu.main]] | ||||
| identifier = "Posts" | ||||
| name = "Posts" | ||||
| url = "/posts/" | ||||
| weight = 50 | ||||
| weight = 60 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user