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' | title = 'The jungle' | ||||||
| theme = 'PaperMod' | theme = 'PaperMod' | ||||||
| 
 | 
 | ||||||
|  | [[menu.main]] | ||||||
|  | identifier = "doc" | ||||||
|  | name = "Docs" | ||||||
|  | url = "/doc/" | ||||||
|  | weight = 10 | ||||||
|  | 
 | ||||||
| [[menu.main]] | [[menu.main]] | ||||||
| identifier = "grafana" | identifier = "grafana" | ||||||
| name = "Grafana" | name = "Grafana" | ||||||
| url = "/grafana/" | url = "/grafana/" | ||||||
| weight = 10 | weight = 20 | ||||||
| 
 | 
 | ||||||
| [[menu.main]] | [[menu.main]] | ||||||
| identifier = "Git" | identifier = "Git" | ||||||
| name = "Git" | name = "Git" | ||||||
| url = "/git/" | url = "/git/" | ||||||
| weight = 20 | weight = 30 | ||||||
| 
 | 
 | ||||||
| [[menu.main]] | [[menu.main]] | ||||||
| identifier = "Lists" | identifier = "Lists" | ||||||
| name = "Lists" | name = "Lists" | ||||||
| url = "/lists/" | url = "/lists/" | ||||||
| weight = 30 | weight = 40 | ||||||
| 
 | 
 | ||||||
| [[menu.main]] | [[menu.main]] | ||||||
| identifier = "Paste" | identifier = "Paste" | ||||||
| name = "Paste" | name = "Paste" | ||||||
| url = "/paste/" | url = "/paste/" | ||||||
| weight = 40 | weight = 50 | ||||||
| 
 | 
 | ||||||
| [[menu.main]] | [[menu.main]] | ||||||
| identifier = "Posts" | identifier = "Posts" | ||||||
| name = "Posts" | name = "Posts" | ||||||
| url = "/posts/" | url = "/posts/" | ||||||
| weight = 50 | weight = 60 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user