<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Othiago</id>
		<title>VeRLab Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.verlab.dcc.ufmg.br/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Othiago"/>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:Contributions/Othiago"/>
		<updated>2026-04-03T19:11:00Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity3&amp;diff=1327</id>
		<title>Singularity3</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity3&amp;diff=1327"/>
				<updated>2024-06-08T15:59:23Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 3.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de mar/2022, atualmente instalado nas máquinas a v3.10.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v3.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v3.10.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v3.10.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v3.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot;&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/3.10/user-guide/build_a_container.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Como seu container foi criado usando sudo singularity, o ownership da pasta vai ser root:root&lt;br /&gt;
&lt;br /&gt;
'''Deve-se pedir para algum gestor da infraestrutura da rede VeRLab/JLab alterar o ownership da pasta para seu_usuario:DomainUsers''' &lt;br /&gt;
&lt;br /&gt;
a) descobrir o UID do usuário e o GID do grupo DomainUsers com o comando id:&lt;br /&gt;
    id nome_usuario&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
b) mudar o ownership, recursivamente, de todos arquivos da pasta sandbox (-R=recursive, -v=verbose)&lt;br /&gt;
    sudo chown -Rv [uid]:513 pasta_sandbox/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; somente quando necessário modificar o container com instalação de pacotes e configuração&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    sudo singularity shell --writable --no-home --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity3&amp;diff=1326</id>
		<title>Singularity3</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity3&amp;diff=1326"/>
				<updated>2024-06-08T15:59:04Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 3.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de mar/2022, atualmente instalado nas máquinas a v3.10.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v3.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v3.10.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v3.10.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v3.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot;&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 22.04 e instala os pacotes para executar o cuda:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu22-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/3.10/user-guide/build_a_container.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Como seu container foi criado usando sudo singularity, o ownership da pasta vai ser root:root&lt;br /&gt;
&lt;br /&gt;
'''Deve-se pedir para algum gestor da infraestrutura da rede VeRLab/JLab alterar o ownership da pasta para seu_usuario:DomainUsers''' &lt;br /&gt;
&lt;br /&gt;
a) descobrir o UID do usuário e o GID do grupo DomainUsers com o comando id:&lt;br /&gt;
    id nome_usuario&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
b) mudar o ownership, recursivamente, de todos arquivos da pasta sandbox (-R=recursive, -v=verbose)&lt;br /&gt;
    sudo chown -Rv [uid]:513 pasta_sandbox/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; somente quando necessário modificar o container com instalação de pacotes e configuração&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    sudo singularity shell --writable --no-home --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1325</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1325"/>
				<updated>2024-06-08T15:58:23Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Para criar seu container &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no &amp;lt;code&amp;gt;%environment&amp;lt;/code&amp;gt; durante a edição da pasta sandbox, basta editar o arquivo &amp;lt;code&amp;gt;90-environment.sh&amp;lt;/code&amp;gt; localizado em &amp;lt;code&amp;gt;/.singularity.d/env/&amp;lt;/code&amp;gt; dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1324</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1324"/>
				<updated>2024-06-08T15:56:36Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Para criar seu container &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no &amp;lt;code&amp;gt;%environment&amp;lt;/code&amp;gt; durante a edição da pasta sandbox, basta editar o arquivo &amp;lt;code&amp;gt;90-environment.sh&amp;lt;/code&amp;gt; localizado em &amp;lt;code&amp;gt;/.singularity.d/env/&amp;lt;/code&amp;gt; dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1323</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1323"/>
				<updated>2024-06-08T15:55:01Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To build the container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no &amp;lt;code&amp;gt;%environment&amp;lt;/code&amp;gt; durante a edição da pasta sandbox, basta editar o arquivo &amp;lt;code&amp;gt;90-environment.sh&amp;lt;/code&amp;gt; localizado em &amp;lt;code&amp;gt;/.singularity.d/env&amp;lt;/code&amp;gt; dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1322</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1322"/>
				<updated>2024-06-08T15:54:05Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To build the container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no &amp;lt;code&amp;gt;%environment&amp;lt;\code&amp;gt; durante a edição da pasta sandbox, basta editar o arquivo &amp;lt;code&amp;gt;90-environment.sh&amp;lt;\code&amp;gt; localizado em &amp;lt;code&amp;gt;/.singularity.d/env&amp;lt;\code&amp;gt; dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1321</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1321"/>
				<updated>2024-06-08T15:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# To build the container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no `%environment` durante a edição da pasta sandbox, basta editar o arquivo 90-environment.sh localizado em /.singularity.d/env dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1320</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1320"/>
				<updated>2024-06-08T15:51:34Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
Caso precise adicionar ou remover variáveis no `%environment` durante a edição da pasta sandbox, basta editar o arquivo 90-environment.sh localizado em /.singularity.d/env dentro do container sandbox.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1319</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1319"/>
				<updated>2024-06-08T15:50:47Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Caso precise adicionar ou remover variáveis no `%environment` durante a edição da pasta sandbox, basta editar o arquivo 90-environment.sh localizado em /.singularity.d/env dentro do container sandbox.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1318</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1318"/>
				<updated>2024-06-08T14:01:10Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu20-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1317</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1317"/>
				<updated>2024-06-08T14:00:23Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Uso simplificado: NÃO É MAIS NECESSÁRIO USAR O COMANDO sudo PARA UTILIZAR O SINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1316</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1316"/>
				<updated>2024-06-08T14:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Uso simplificado: NÃO É MAIS NECESSÁRIO USAR O COMANDO sudo PARA UTILIZAR O SINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização.&lt;br /&gt;
Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1315</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1315"/>
				<updated>2024-06-08T13:59:29Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Uso simplificado: NÃO É MAIS NECESSÁRIO USAR O COMANDO sudo PARA UTILIZAR O SINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1314</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1314"/>
				<updated>2024-06-08T13:59:12Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* A utilização ficou mais simples: NÃO É PRECISO USAR MAIS O COMANDO sudo QUANDO FOR USAR OSINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''Uso simplificado''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É MAIS NECESSÁRIO USAR O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; PARA UTILIZAR O SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity&amp;diff=1313</id>
		<title>Singularity</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity&amp;diff=1313"/>
				<updated>2024-06-08T13:56:10Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Versão em uso no VeRLab/JLab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Singularity ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''Singularity''' é uma ferramenta para a criação de ''&amp;quot;máquina container&amp;quot;'' (uma espécie de ''&amp;quot;máquina virtual&amp;quot;'') que trás algumas vantagens, quando for rodar experimentos nas máquinas de processamento do Verlab/J:&lt;br /&gt;
&lt;br /&gt;
* Não precisa ser usuário com privilégios root para executar sua ''máquina container'' (apenas para criar) e pode instalar suas dependências de experimento no container sem alterar a ''máquina host''. Isso evita mudanças e instalação de pacotes nas máquinas de processamento e que podem atrapalham experimentos de outros usuários.&lt;br /&gt;
&lt;br /&gt;
* Depois de criar sua ''máquina container'' com todas suas dependências, pode-se usá-la para rodar experimento em diferentes máquinas host que tenham GPU. Isso trás flexibilidade para rodar experimento em máquinas simultaneamente, sem precisar instalar todas dependências novamente em outra ''máquina host''.&lt;br /&gt;
&lt;br /&gt;
* A massa de arquivos de dataset (que geralmente ocupam espaço &amp;gt;=500GB) ficam localmente armazenados na máquina host, assim evita tráfego desnecessário na rede. Geralmente na pasta /homeLocal/nome_do_usuario.&lt;br /&gt;
&lt;br /&gt;
* O usuário deixa na sua pasta home da rede apenas sua máquina container em formato de imagem (que em geral ocupa ~4GB) assim quando logar em qualquer máquina de processamento a mesma estará disponível para rodar seu experimento.&lt;br /&gt;
&lt;br /&gt;
* Dataset's e containers podem ser armazenados no serviço de storage da rede, assim ficam disponíveis em qualquer máquina de processamento para rodar seu experimento. Geralmente na pasta /srv/storage/datasets/nome_do_usuario e /srv/storage/singularity/images/nome_do_usuario.&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versão em uso no VeRLab/JLab ==&lt;br /&gt;
&lt;br /&gt;
Atualmente temos a versão 4.1.x instalada nas máquinas da rede VeRLab/JLab. &lt;br /&gt;
&lt;br /&gt;
=== '''Singularity CE v4.x''' ( ''Community Edition'', ''freeware'', versão em todas as máquinas a partir de jun/2024) ===&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity4  Link para dicas de uso do Singularity CE v4.x]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity3  Link para dicas de uso do Singularity CE v3.x]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A versão 2.5.x já foi utilizada, mas seu suporte parou em jul/2018 e foi descontinuada na rede VeRLab/Jlab desde mar/2022.&lt;br /&gt;
&amp;lt;!-- Comentado&lt;br /&gt;
* '''Singularity v2.5.x''' (''freeware'', &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;versão sem suporte desde jul/2018, vai ser descontinuada na rede VeRLab/JLab&amp;lt;/span&amp;gt;)&lt;br /&gt;
**[https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity2  Link para dicas de uso do Singularity v2.5.x]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regras de bom uso dos recursos ==&lt;br /&gt;
* Arquivos mais importantes e pequenos, como códigos, documentos e resultados finais, devem ser mantidos na home do usuário.&lt;br /&gt;
** '''Obs:''' Usuários '''não''' devem deixar o datasets e arquivos temporários de processamento dentro da sua pasta '''home'''. Os datasets são muitos arquivos que vão ser acessados durante o experimento e que seu tamanho total, em geral, é &amp;gt;=500GB.  Pois isso aumenta o tráfego na rede desnecessáriamente. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Massa de dados e arquivos maiores, tais como datasets, dados pre-processados e resultados parciais, devem ser armazenados em locais de uso comum dentro de uma pasta com o &amp;quot;nome do usuário&amp;quot; ou &amp;quot;nome do projeto&amp;quot; (no caso de um grupo de trabalho maior que tem um aluno sênior coordenando).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Temos as seguintes opções de pastas de uso comum para massa de dados:&lt;br /&gt;
**&amp;lt;code&amp;gt;/homeLocal/&amp;lt;/code&amp;gt; : pasta local na máquina, montada no barra da mesma. O usuário pode armazenar seus containers e dados de experimentos.&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets&amp;lt;/code&amp;gt;) : pasta no servidor de storage para armazenar datasets&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/&amp;lt;/code&amp;gt; : pasta no servidor de storage para armazenar as imagens singularity fechadas (&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) que são executadas nos experimentos.&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/&amp;lt;/code&amp;gt; : pasta no servidor de storage para criação de imagens singularity em modo sandbox (evitar deixar as imagens em sandbox, mais detalhes abaixo)&lt;br /&gt;
*** Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição com '''&amp;lt;code&amp;gt; $sudo singularity shell --writable... &amp;lt;/code&amp;gt;'''. &lt;br /&gt;
*** Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
* Cada usuário deve criar uma pasta com seu &amp;quot;nome de usuário&amp;quot; (ou &amp;quot;nome de projeto&amp;quot; se for o caso) dentro da pasta de uso comum para conter seus arquivos. Assim fica organizado e facilita identificar quem são os donos dos containers ou datasets. Exemplos para o nome de usuário &amp;quot;fulano&amp;quot;:&lt;br /&gt;
**  '''O usuário é responsável por liberar o espaço em disco quando não estiver mais precisando do mesmo ou fazendo testes'''&lt;br /&gt;
**&amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt; :&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A máquina container para rodar os experimentos deve estar em formato de imagem para rodar mais rápido (&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;. &lt;br /&gt;
** Porém, enquanto estiver em teste e instalando pacotes, ela deve ser uma &amp;quot;pasta sandbox&amp;quot;.&lt;br /&gt;
** Pedimos que não mantenham muitas imagens singularity em modo sandbox. Sempre que possível, feche sua imagem (converter para &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; e de preferência coloque-as na pasta storage/singularity/images.&lt;br /&gt;
** '''Obs:''' Imagens em modo sandbox deixam uma quantidade enorme de arquivos, e como o servidor de storage tem que mapear todos os arquivos na memória RAM, e às vezes a mesma estoura por esse motivo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalação ==&lt;br /&gt;
Toda máquina de processamento do Verlab/J (máquinas com GPU) deve ter o Singularity instalado e não precisam ter pacotes específicos de software como ROS, cuda, tensorflow. &lt;br /&gt;
&lt;br /&gt;
A equipe de rede é responsável por manter máquinas locais e máquinas de processamento disponíveis para executar o singularity. Foi escolhido que o sigularity estará disponível apenas nas máquinas com GPU Nvidia, assim confira a lista de máquinas na [https://www.verlab.dcc.ufmg.br/restrict-area/ área restrita] do site do verlab:&lt;br /&gt;
&lt;br /&gt;
=== Estações de trabalho Desktop no Verlab/J com GPU Nvidia ===&lt;br /&gt;
* Instalar o Singularity em toda máquina host com GPU (máquina de processamento)&lt;br /&gt;
* Criar a pasta &amp;lt;code&amp;gt;/homeLocal&amp;lt;/code&amp;gt; em toda máquina host. &lt;br /&gt;
** O usuário precisa solicitar à equipe de rede para criar uma pasta filha na &amp;lt;code&amp;gt;/homeLocal/nome_do_usuario&amp;lt;/code&amp;gt; e dar permissão de leitura/escrita. Assim, para casos específicos é possível criar e modificarem máquinas container localmente, sem usar o serviço de storage.&lt;br /&gt;
* Configurar o comando &amp;lt;code&amp;gt; $sudo singularity ... &amp;lt;/code&amp;gt; de modo que todo usuário possa rodá-lo dentro da pasta &amp;lt;code&amp;gt;/homeLocal&amp;lt;/code&amp;gt;, sem necessitar de senha root&lt;br /&gt;
&lt;br /&gt;
=== Servidores de Processamento da rede Verlab/J com GPU Nvidia ===&lt;br /&gt;
* Configurar montagem automática das pastas na rede:&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; (apenas '''EPONA, GHOST e MAGRITTE''')&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição com '''&amp;lt;code&amp;gt; $sudo singularity shell --writable... &amp;lt;/code&amp;gt;'''. &lt;br /&gt;
* Uma segunda restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* Configurar a montagem da pasta &amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; nas máquinas EPONA, GHOST e MAGRITTE e configurar a montagem das mesmas para que o comando &amp;lt;code&amp;gt; $sudo singularity ... &amp;lt;/code&amp;gt; possa ser executado por qualquer usuário, sem necessitar de permissão root&lt;br /&gt;
* Para executar o container em modo leitura ('''&amp;lt;code&amp;gt;$singularity shell...&amp;lt;/code&amp;gt;'''), a pasta &amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; é espelhada nas demais máquinas:&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge$&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dicas de Uso ==&lt;br /&gt;
&lt;br /&gt;
O uso do Singularity é direto ao ponto em muitos sentidos. Isso se deve ao fato de que, para utilizar os recursos da GPU, o container Singularity faz um linking com o driver da máquina host, o que já disponibiliza, para o container, a mesma versão do driver e do CUDA que já estão instalados na máquina host.&lt;br /&gt;
A principal vantagem dessa abordagem é evitar ter que fazer configurações extras como a do nvidia-container-toolkit, que é necessária no Docker.&lt;br /&gt;
&lt;br /&gt;
Ainda assim, é importante prestar atenção à versão do driver Nvidia instalada no sistema para que o container consiga acessar a GPU!&lt;br /&gt;
&lt;br /&gt;
A versão de CUDA instalada dentro do container é totalmente independente da versão instalada na máquina host, o que significa que é possível rodar uma versão do CUDA no container que é diferente da versão instalada na máquina host. Mas é importante prestar atenção que a versão do driver do container será sempre igual à versão do driver na máquina host, pois é feito um link do container para o host, e isso não pode ser mudado. Por conta disso, pode ser que a versão do driver atual não suporte todas as versões do CUDA. Para ver quais versões são suportadas, é importante se atentar a quais&lt;br /&gt;
versões do CUDA a versão do driver atual suporta. Isso pode ser verificado em https://docs.nvidia.com/deploy/cuda-compatibility/index.html.&lt;br /&gt;
&lt;br /&gt;
A versão instalada do driver pode ser obtida rodando &amp;lt;code&amp;gt;nvidia-smi&amp;lt;/code&amp;gt; dentro da máquina host.&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity&amp;diff=1312</id>
		<title>Singularity</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity&amp;diff=1312"/>
				<updated>2024-06-08T13:55:22Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Singularity CE v3.x ( Community Edition, freeware, versão em todas as máquinas a partir de mar/2022) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Singularity ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''Singularity''' é uma ferramenta para a criação de ''&amp;quot;máquina container&amp;quot;'' (uma espécie de ''&amp;quot;máquina virtual&amp;quot;'') que trás algumas vantagens, quando for rodar experimentos nas máquinas de processamento do Verlab/J:&lt;br /&gt;
&lt;br /&gt;
* Não precisa ser usuário com privilégios root para executar sua ''máquina container'' (apenas para criar) e pode instalar suas dependências de experimento no container sem alterar a ''máquina host''. Isso evita mudanças e instalação de pacotes nas máquinas de processamento e que podem atrapalham experimentos de outros usuários.&lt;br /&gt;
&lt;br /&gt;
* Depois de criar sua ''máquina container'' com todas suas dependências, pode-se usá-la para rodar experimento em diferentes máquinas host que tenham GPU. Isso trás flexibilidade para rodar experimento em máquinas simultaneamente, sem precisar instalar todas dependências novamente em outra ''máquina host''.&lt;br /&gt;
&lt;br /&gt;
* A massa de arquivos de dataset (que geralmente ocupam espaço &amp;gt;=500GB) ficam localmente armazenados na máquina host, assim evita tráfego desnecessário na rede. Geralmente na pasta /homeLocal/nome_do_usuario.&lt;br /&gt;
&lt;br /&gt;
* O usuário deixa na sua pasta home da rede apenas sua máquina container em formato de imagem (que em geral ocupa ~4GB) assim quando logar em qualquer máquina de processamento a mesma estará disponível para rodar seu experimento.&lt;br /&gt;
&lt;br /&gt;
* Dataset's e containers podem ser armazenados no serviço de storage da rede, assim ficam disponíveis em qualquer máquina de processamento para rodar seu experimento. Geralmente na pasta /srv/storage/datasets/nome_do_usuario e /srv/storage/singularity/images/nome_do_usuario.&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versão em uso no VeRLab/JLab ==&lt;br /&gt;
&lt;br /&gt;
Atualmente temos a versão 3.10.x instalada nas máquinas da rede VeRLab/JLab. &lt;br /&gt;
&lt;br /&gt;
=== '''Singularity CE v4.x''' ( ''Community Edition'', ''freeware'', versão em todas as máquinas a partir de jun/2024) ===&lt;br /&gt;
** [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity4  Link para dicas de uso do Singularity CE v4.x]&lt;br /&gt;
** [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity3  Link para dicas de uso do Singularity CE v3.x]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A versão 2.5.x já foi utilizada, mas seu suporte parou em jul/2018 e foi descontinuada na rede VeRLab/Jlab desde mar/2022.&lt;br /&gt;
&amp;lt;!-- Comentado&lt;br /&gt;
* '''Singularity v2.5.x''' (''freeware'', &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;versão sem suporte desde jul/2018, vai ser descontinuada na rede VeRLab/JLab&amp;lt;/span&amp;gt;)&lt;br /&gt;
**[https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity2  Link para dicas de uso do Singularity v2.5.x]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Regras de bom uso dos recursos ==&lt;br /&gt;
* Arquivos mais importantes e pequenos, como códigos, documentos e resultados finais, devem ser mantidos na home do usuário.&lt;br /&gt;
** '''Obs:''' Usuários '''não''' devem deixar o datasets e arquivos temporários de processamento dentro da sua pasta '''home'''. Os datasets são muitos arquivos que vão ser acessados durante o experimento e que seu tamanho total, em geral, é &amp;gt;=500GB.  Pois isso aumenta o tráfego na rede desnecessáriamente. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Massa de dados e arquivos maiores, tais como datasets, dados pre-processados e resultados parciais, devem ser armazenados em locais de uso comum dentro de uma pasta com o &amp;quot;nome do usuário&amp;quot; ou &amp;quot;nome do projeto&amp;quot; (no caso de um grupo de trabalho maior que tem um aluno sênior coordenando).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Temos as seguintes opções de pastas de uso comum para massa de dados:&lt;br /&gt;
**&amp;lt;code&amp;gt;/homeLocal/&amp;lt;/code&amp;gt; : pasta local na máquina, montada no barra da mesma. O usuário pode armazenar seus containers e dados de experimentos.&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets&amp;lt;/code&amp;gt;) : pasta no servidor de storage para armazenar datasets&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/&amp;lt;/code&amp;gt; : pasta no servidor de storage para armazenar as imagens singularity fechadas (&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) que são executadas nos experimentos.&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/&amp;lt;/code&amp;gt; : pasta no servidor de storage para criação de imagens singularity em modo sandbox (evitar deixar as imagens em sandbox, mais detalhes abaixo)&lt;br /&gt;
*** Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição com '''&amp;lt;code&amp;gt; $sudo singularity shell --writable... &amp;lt;/code&amp;gt;'''. &lt;br /&gt;
*** Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
* Cada usuário deve criar uma pasta com seu &amp;quot;nome de usuário&amp;quot; (ou &amp;quot;nome de projeto&amp;quot; se for o caso) dentro da pasta de uso comum para conter seus arquivos. Assim fica organizado e facilita identificar quem são os donos dos containers ou datasets. Exemplos para o nome de usuário &amp;quot;fulano&amp;quot;:&lt;br /&gt;
**  '''O usuário é responsável por liberar o espaço em disco quando não estiver mais precisando do mesmo ou fazendo testes'''&lt;br /&gt;
**&amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt; :&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* A máquina container para rodar os experimentos deve estar em formato de imagem para rodar mais rápido (&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;. &lt;br /&gt;
** Porém, enquanto estiver em teste e instalando pacotes, ela deve ser uma &amp;quot;pasta sandbox&amp;quot;.&lt;br /&gt;
** Pedimos que não mantenham muitas imagens singularity em modo sandbox. Sempre que possível, feche sua imagem (converter para &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; e de preferência coloque-as na pasta storage/singularity/images.&lt;br /&gt;
** '''Obs:''' Imagens em modo sandbox deixam uma quantidade enorme de arquivos, e como o servidor de storage tem que mapear todos os arquivos na memória RAM, e às vezes a mesma estoura por esse motivo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Instalação ==&lt;br /&gt;
Toda máquina de processamento do Verlab/J (máquinas com GPU) deve ter o Singularity instalado e não precisam ter pacotes específicos de software como ROS, cuda, tensorflow. &lt;br /&gt;
&lt;br /&gt;
A equipe de rede é responsável por manter máquinas locais e máquinas de processamento disponíveis para executar o singularity. Foi escolhido que o sigularity estará disponível apenas nas máquinas com GPU Nvidia, assim confira a lista de máquinas na [https://www.verlab.dcc.ufmg.br/restrict-area/ área restrita] do site do verlab:&lt;br /&gt;
&lt;br /&gt;
=== Estações de trabalho Desktop no Verlab/J com GPU Nvidia ===&lt;br /&gt;
* Instalar o Singularity em toda máquina host com GPU (máquina de processamento)&lt;br /&gt;
* Criar a pasta &amp;lt;code&amp;gt;/homeLocal&amp;lt;/code&amp;gt; em toda máquina host. &lt;br /&gt;
** O usuário precisa solicitar à equipe de rede para criar uma pasta filha na &amp;lt;code&amp;gt;/homeLocal/nome_do_usuario&amp;lt;/code&amp;gt; e dar permissão de leitura/escrita. Assim, para casos específicos é possível criar e modificarem máquinas container localmente, sem usar o serviço de storage.&lt;br /&gt;
* Configurar o comando &amp;lt;code&amp;gt; $sudo singularity ... &amp;lt;/code&amp;gt; de modo que todo usuário possa rodá-lo dentro da pasta &amp;lt;code&amp;gt;/homeLocal&amp;lt;/code&amp;gt;, sem necessitar de senha root&lt;br /&gt;
&lt;br /&gt;
=== Servidores de Processamento da rede Verlab/J com GPU Nvidia ===&lt;br /&gt;
* Configurar montagem automática das pastas na rede:&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; (apenas '''EPONA, GHOST e MAGRITTE''')&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/datasets&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/images/&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge/&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição com '''&amp;lt;code&amp;gt; $sudo singularity shell --writable... &amp;lt;/code&amp;gt;'''. &lt;br /&gt;
* Uma segunda restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* Configurar a montagem da pasta &amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; nas máquinas EPONA, GHOST e MAGRITTE e configurar a montagem das mesmas para que o comando &amp;lt;code&amp;gt; $sudo singularity ... &amp;lt;/code&amp;gt; possa ser executado por qualquer usuário, sem necessitar de permissão root&lt;br /&gt;
* Para executar o container em modo leitura ('''&amp;lt;code&amp;gt;$singularity shell...&amp;lt;/code&amp;gt;'''), a pasta &amp;lt;code&amp;gt;/srv/forge&amp;lt;/code&amp;gt; é espelhada nas demais máquinas:&lt;br /&gt;
**&amp;lt;code&amp;gt;/srv/storage/singularity/forge$&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dicas de Uso ==&lt;br /&gt;
&lt;br /&gt;
O uso do Singularity é direto ao ponto em muitos sentidos. Isso se deve ao fato de que, para utilizar os recursos da GPU, o container Singularity faz um linking com o driver da máquina host, o que já disponibiliza, para o container, a mesma versão do driver e do CUDA que já estão instalados na máquina host.&lt;br /&gt;
A principal vantagem dessa abordagem é evitar ter que fazer configurações extras como a do nvidia-container-toolkit, que é necessária no Docker.&lt;br /&gt;
&lt;br /&gt;
Ainda assim, é importante prestar atenção à versão do driver Nvidia instalada no sistema para que o container consiga acessar a GPU!&lt;br /&gt;
&lt;br /&gt;
A versão de CUDA instalada dentro do container é totalmente independente da versão instalada na máquina host, o que significa que é possível rodar uma versão do CUDA no container que é diferente da versão instalada na máquina host. Mas é importante prestar atenção que a versão do driver do container será sempre igual à versão do driver na máquina host, pois é feito um link do container para o host, e isso não pode ser mudado. Por conta disso, pode ser que a versão do driver atual não suporte todas as versões do CUDA. Para ver quais versões são suportadas, é importante se atentar a quais&lt;br /&gt;
versões do CUDA a versão do driver atual suporta. Isso pode ser verificado em https://docs.nvidia.com/deploy/cuda-compatibility/index.html.&lt;br /&gt;
&lt;br /&gt;
A versão instalada do driver pode ser obtida rodando &amp;lt;code&amp;gt;nvidia-smi&amp;lt;/code&amp;gt; dentro da máquina host.&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1311</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1311"/>
				<updated>2024-06-08T13:51:08Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* A utilização ficou mais simples: NÃO É PRECISO USAR MAIS O COMANDO sudo QUANDO FOR USAR OSINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real, [https://docs.sylabs.io/guides/4.1/user-guide/fakeroot.html#fakeroot veja na documentação].&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1310</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1310"/>
				<updated>2024-06-08T13:46:55Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Passo a Passo: Uso do Singularity CE v4.1.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1309</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1309"/>
				<updated>2024-06-08T13:46:40Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* IMPORTANTE: Diferença entre os 2 formatos suportados pelo singularity build: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1308</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1308"/>
				<updated>2024-06-08T13:46:04Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Passo a Passo: Uso do Singularity CE v4.1.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1307</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1307"/>
				<updated>2024-06-08T13:45:53Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Passo a Passo: Uso do Singularity CE v4.1.x */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1306</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1306"/>
				<updated>2024-06-08T13:45:35Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* A utilização ficou mais simples: NÃO É PRECISO USAR MAIS O COMANDO sudo QUANDO FOR USAR OSINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1305</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1305"/>
				<updated>2024-06-08T13:45:08Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* A utilização ficou mais simples: NÃO É PRECISO USAR MAIS O COMANDO sudo QUANDO FOR USAR OSINGULARITY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1304</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1304"/>
				<updated>2024-06-08T13:40:00Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* IMPORTANTE: Diferença entre os 2 formatos suportados pelo singularity build: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR OSINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
Com a introdução do Singularity 4.1.x, alguns comandos agora requerem o uso da flag &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;. Esta flag permite que usuários comuns possam construir e modificar containers sem a necessidade de privilégios de superusuário, simplificando a utilização. Ao utilizar &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;, o Singularity simula um ambiente root, permitindo operações que normalmente precisariam de acesso root real.&lt;br /&gt;
&lt;br /&gt;
Exemplo de comando com &amp;lt;code&amp;gt;--fakeroot&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
singularity build --sandbox --fakeroot --fix-perms my-def-v1 my-def-v1.def&lt;br /&gt;
Este comando constrói um container no formato sandbox usando um arquivo de definição, sem precisar de privilégios de superusuário.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1303</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1303"/>
				<updated>2024-06-08T13:34:57Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* IMPORTANTE: Diferença entre os 2 formatos suportados pelo singularity build: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''A utilização ficou mais simples''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;NÃO É PRECISO USAR MAIS O COMANDO &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; QUANDO FOR USAR ALGUM COMANDO COM SINGULARITY&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1302</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1302"/>
				<updated>2024-06-08T13:25:43Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1301</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1301"/>
				<updated>2024-06-08T13:20:25Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    singularity build --sandbox --fakeroot --fix-perms ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1300</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1300"/>
				<updated>2024-06-08T13:18:41Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1299</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1299"/>
				<updated>2024-06-08T13:12:58Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-file '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#building-images-from-scratch Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 20.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1298</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1298"/>
				<updated>2024-06-08T13:03:23Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://docs.sylabs.io/guides/4.1/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    singularity build --fakeroot --fix-perms [container_destino] [container_origem]&lt;br /&gt;
    singularity build --fakeroot --fix-perms my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1297</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1297"/>
				<updated>2024-06-08T12:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v4.1.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu20-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home --fakeroot (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot my_container/&lt;br /&gt;
&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([httphttps://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    singularity shell --writable --no-home --fakeroot --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://docs.sylabs.io/guides/4.1/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1296</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1296"/>
				<updated>2024-06-08T12:48:16Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v3.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 20.04 e instala os pacotes para executar o cuda toolkit 11.4:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu20-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; somente quando necessário modificar o container com instalação de pacotes e configuração&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    sudo singularity shell --writable --no-home --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1295</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1295"/>
				<updated>2024-06-08T12:46:08Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v3.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 22.04 e instala os pacotes para executar o cuda:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu22-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:22.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    cd&lt;br /&gt;
    apt -y update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    curl \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev&lt;br /&gt;
    &lt;br /&gt;
    # CUDA Toolkit 11.4 pode ser encontrado em https://developer.nvidia.com/cuda-11-4-0-download-archive&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin&lt;br /&gt;
    mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600&lt;br /&gt;
    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    dpkg -i cuda-repo-ubuntu2004-11-4-local_11.4.2-470.57.02-1_amd64.deb&lt;br /&gt;
    apt-key add /var/cuda-repo-ubuntu2004-11-4-local/7fa2af80.pub&lt;br /&gt;
    apt update&lt;br /&gt;
    DEBIAN_FRONTEND=noninteractive \&lt;br /&gt;
    apt -y install cuda&lt;br /&gt;
&lt;br /&gt;
    wget https://github.com/colmap/colmap/archive/refs/tags/3.9.1.zip&lt;br /&gt;
    unzip 3.9.1.zip&lt;br /&gt;
    cd colmap-3.9.1&lt;br /&gt;
    mkdir build&lt;br /&gt;
    cd build&lt;br /&gt;
    cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=70&lt;br /&gt;
    ninja&lt;br /&gt;
    ninja install&lt;br /&gt;
    cd&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export PATH=$PATH:/usr/local/cuda/bin&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; somente quando necessário modificar o container com instalação de pacotes e configuração&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    sudo singularity shell --writable --no-home --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1294</id>
		<title>Singularity4</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Singularity4&amp;diff=1294"/>
				<updated>2024-06-08T12:25:08Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: Created page with &amp;quot;= Singularity CE 4.x (Community Edition) = === &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas m...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Singularity CE 4.x (Community Edition) =&lt;br /&gt;
=== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;'''Esta será a versão utilizada na rede VeRLab/JLab a partir de jun/2024, atualmente instalado nas máquinas a v4.1.x'''&amp;lt;/span&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
==== Documentação oficial Singularity CE v4.1.x ====&lt;br /&gt;
* https://www.sylabs.io/docs/&lt;br /&gt;
===== '''User Guide CE v4.1.x ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/quick_start.html&lt;br /&gt;
===== '''Adm Guide CE v4.1.x ''' (''Apenas para problemas mais específicos de segurança e instalação!'') =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/admin-guide/&lt;br /&gt;
===== ''' ''Definition Files'' ''' =====&lt;br /&gt;
* https://docs.sylabs.io/guides/4.1/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/4.1/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;IMPORTANTE&amp;lt;/span&amp;gt;: Diferença entre os 2 formatos suportados pelo &amp;lt;code&amp;gt;singularity build&amp;lt;/code&amp;gt;: ==&lt;br /&gt;
&lt;br /&gt;
==== '''Pasta &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;INDICADO PARA FASE DE TESTES E MODIFICAÇÕES no container (instalar pacotes)&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para desenvolvimento interativo do container, quando ainda precisa fazer testes e não se sabe exatamente as configurações/ferramentas a serem usadas, logo o container pode ter novas instalações e alterações nos pacotes.&lt;br /&gt;
* Vantagem: vários arquivos e sub-pastas que são expansíveis automaticamente conforme os pacotes são instalados (opção --writable). O tamanho do disco é expansível conforme disponibilidade de espaço em disco da máquina host. &lt;br /&gt;
* Desvantagem: Execução mais lenta, muitos arquivos para copiar de uma máquina para outra e reproduzir o experimento &lt;br /&gt;
* writable (ch)root directory called a sandbox for interactive development ( --sandbox option)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== '''Arquivo único, extensão &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''': &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;SOMENTE LEITURA, NÃO é possível editar o container&amp;lt;/span&amp;gt; ====&lt;br /&gt;
* Destinado para fase de experimentos em massa (production)&lt;br /&gt;
* Vantagem: É uma imagem comprimida, ocupa menos espaço em disco e executa mais rápido que um container equivalente no formato sandbox. Também suporta criptografia&lt;br /&gt;
* Desvantagem: Não é possível instalar/modificar pacotes do container. Para instalar/editar algo, tem que transformar em '''&amp;quot;pasta sandbox&amp;quot;'''.&lt;br /&gt;
* compressed read-only Singularity Image File (SIF) format suitable for production (default)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Passo a Passo: Uso do Singularity CE v3.x ==&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Exemplos de interação mais usuais com o container singularity&lt;br /&gt;
&lt;br /&gt;
# Confirmar se a máquina tem singularity instalado e a versão&lt;br /&gt;
# Solicitar sua pasta de trabalho com seu nome de usuário (storage ou homeLocal)&lt;br /&gt;
# Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity &lt;br /&gt;
# Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file&lt;br /&gt;
# Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot;&lt;br /&gt;
# Usar o shell do container em modo --writable --no-home (instalar, modificar e testar)&lt;br /&gt;
# Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar&lt;br /&gt;
# Usar o shell e montar uma pasta do host&lt;br /&gt;
# Converter um container singularity do formato &amp;quot;pasta sandbox&amp;quot; para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 1) Conferir se a máquina tem singularity instalado e a versão ====&lt;br /&gt;
    singularity --version&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2) Solicitar a criação da sua pasta de trabalho com seu nome de usuário (storage ou homeLocal) ====&lt;br /&gt;
Deve-se solicitar a um gestor da infraestrutura da rede VeRLab/JLab para criar uma pasta com seu nome de usuário e mudar o proprietário da pasta para seu usuário da rede do Verlab e o grupo DomainUsers (&amp;lt;code&amp;gt;gid=513&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Existem duas opções de locais para armazenar sua pasta de containers singularity:&lt;br /&gt;
* No serviço de storage da rede, na pasta &amp;lt;code&amp;gt;/srv/forge/fulano/&amp;lt;/code&amp;gt; ou  &lt;br /&gt;
* Localemente em alguma máquina, na pasta &amp;lt;code&amp;gt;/homeLocal/fulano&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== 2a) Pasta no serviço de storage (&amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço na storage para os demais usuários.&lt;br /&gt;
    cd /srv/forge &lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /srv/forge/fulano&lt;br /&gt;
&lt;br /&gt;
===== 2b) Pasta no disco local de alguma máquina da rede &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;): =====&lt;br /&gt;
* As máquinas da rede com GPU costumam ter uma partição do disco separada para os usuários ocuparem com dados de experimentos e testes. Essa partição é montada na pasta  &amp;lt;code&amp;gt;'''/homeLocal'''&amp;lt;/code&amp;gt;&lt;br /&gt;
* É importante que cada usuário limpe seus dados de experimentos e testes com frequência, pois não existe uma política de &amp;quot;quotas&amp;quot;, assim todos contribuem para  para liberar espaço em disco para os demais usuários.&lt;br /&gt;
    cd /homeLocal&lt;br /&gt;
    sudo mkdir fulano&lt;br /&gt;
    sudo chown -Rv fulano:513 fulano/&lt;br /&gt;
    cd /homeLocal/fulano&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Escrever a &amp;quot;receita&amp;quot; (definition file) do seu container Singularity  ====&lt;br /&gt;
&lt;br /&gt;
O Definition file é o arquivo que descreve a forma como o Singularity vai criar seu container, qual sistema operacional será usado como base, quais pacotes instalar, criar alguma pasta e etc &lt;br /&gt;
Na documentação so singularity tem mais explicações sobre a sintaxe e função de cada campo: &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
''' ''Definition Files'' '''&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/user-guide/definition_files.html&lt;br /&gt;
** '''Exemplos de ''Definition Files'' ''': https://github.com/sylabs/examples&lt;br /&gt;
** '''Singularity ''Definition Files'' vs. ''Docker file'' ''': https://docs.sylabs.io/guides/3.9/user-guide/singularity_and_docker.html#sec-deffile-vs-dockerfile&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Abaixo um exemplo de definition file (salvo como ubuntu-cuda.def) que tem como base um sistema operacional ubuntu 22.04 e instala os pacotes para executar o cuda:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Exemplo de Definition File - ubuntu22-cuda.def&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;pre&amp;gt;&lt;br /&gt;
BootStrap: library&lt;br /&gt;
From: ubuntu:22.04&lt;br /&gt;
&lt;br /&gt;
%post&lt;br /&gt;
    apt -y update&lt;br /&gt;
    apt -y install \&lt;br /&gt;
    git \&lt;br /&gt;
    pip \&lt;br /&gt;
    wget \&lt;br /&gt;
    zip \&lt;br /&gt;
    cmake \&lt;br /&gt;
    python3.11 \&lt;br /&gt;
    ninja-build \&lt;br /&gt;
    build-essential \&lt;br /&gt;
    libboost-program-options-dev \&lt;br /&gt;
    libboost-filesystem-dev \&lt;br /&gt;
    libboost-graph-dev \&lt;br /&gt;
    libboost-system-dev \&lt;br /&gt;
    libeigen3-dev \&lt;br /&gt;
    libflann-dev \&lt;br /&gt;
    libfreeimage-dev \&lt;br /&gt;
    libmetis-dev \&lt;br /&gt;
    libgoogle-glog-dev \&lt;br /&gt;
    libgtest-dev \&lt;br /&gt;
    libsqlite3-dev \&lt;br /&gt;
    libglew-dev \&lt;br /&gt;
    qtbase5-dev \&lt;br /&gt;
    libqt5opengl5-dev \&lt;br /&gt;
    libcgal-dev \&lt;br /&gt;
    libceres-dev \&lt;br /&gt;
    nvidia-cuda-toolkit \&lt;br /&gt;
    nvidia-cuda-toolkit-gcc&lt;br /&gt;
&lt;br /&gt;
    git clone https://github.com/profDarlanBrito/RoutePlanner.git&lt;br /&gt;
    wget https://downloads.coppeliarobotics.com/V4_5_1_rev4/CoppeliaSim_Edu_V4_5_1_rev4_Ubuntu22_04.tar.xz&lt;br /&gt;
&lt;br /&gt;
    tar -xvf CoppeliaSim_Edu_V4_5_1_rev4_Ubuntu22_04.tar.xz&lt;br /&gt;
&lt;br /&gt;
    pip install -r RoutePlanner/requirements.txt&lt;br /&gt;
&lt;br /&gt;
    # limpar cache das instalações&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
    apt-get clean&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
%environment&lt;br /&gt;
   export LC_ALL=C&lt;br /&gt;
&lt;br /&gt;
%apprun scene1&lt;br /&gt;
    CoppeliaSim_Edu_V4_5_1_rev4_Ubuntu22_04/coppeliaSim.sh -h -q base_scene_quadcopter_cars.ttt &amp;amp;&lt;br /&gt;
    python RoutePlanner/RouteOptimization.py&lt;br /&gt;
&lt;br /&gt;
%apprun scene2&lt;br /&gt;
    CoppeliaSim_Edu_V4_5_1_rev4_Ubuntu22_04/coppeliaSim.sh -h -q base_scene_quadcopter_build.ttt &amp;amp;&lt;br /&gt;
    python RoutePlanner/RouteOptimization.py&lt;br /&gt;
&lt;br /&gt;
%apprun scene3&lt;br /&gt;
    CoppeliaSim_Edu_V4_5_1_rev4_Ubuntu22_04/coppeliaSim.sh -h -q base_scene_quadcopter_office.ttt &amp;amp;&lt;br /&gt;
    python RoutePlanner/RouteOptimization.py&lt;br /&gt;
&lt;br /&gt;
%labels&lt;br /&gt;
    Author Verlab&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# To build the container&lt;br /&gt;
# $ singularity build --sandbox --fakeroot --fix-perms my-cuda/ ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 3) Criar seu container Singularity no formato &amp;quot;pasta sandbox&amp;quot; usando seu definition file ====&lt;br /&gt;
&lt;br /&gt;
O formato sandbox é usado para modificar e instalar pacotes no container&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox [pasta_destino] [definition-file.def]&lt;br /&gt;
&lt;br /&gt;
A base usada na construção do container pode ter outras fontes online ou local, [https://docs.sylabs.io/guides/3.10/user-guide/build_a_container.html veja na documentação].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos:&lt;br /&gt;
&lt;br /&gt;
Usando o definition file '''ubuntu22-cuda.def''' como receita para criar o container&lt;br /&gt;
    sudo singularity build --sandbox ubuntu22-cuda ubuntu22-cuda.def&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/ubuntu repositório do docker do ubuntu 20] como base para o container&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20 docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
&lt;br /&gt;
Usando o [https://hub.docker.com/_/python repositório docker do python 3.8] como base para o container (&lt;br /&gt;
    sudo singularity build --sandbox my_ubuntu20_py3 docker://python:3.8-bullseye&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 4) Corrigir o ownership da sua &amp;quot;pasta sandbox&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
Como seu container foi criado usando sudo singularity, o ownership da pasta vai ser root:root&lt;br /&gt;
&lt;br /&gt;
'''Deve-se pedir para algum gestor da infraestrutura da rede VeRLab/JLab alterar o ownership da pasta para seu_usuario:DomainUsers''' &lt;br /&gt;
&lt;br /&gt;
a) descobrir o UID do usuário e o GID do grupo DomainUsers com o comando id:&lt;br /&gt;
    id nome_usuario&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
b) mudar o ownership, recursivamente, de todos arquivos da pasta sandbox (-R=recursive, -v=verbose)&lt;br /&gt;
    sudo chown -Rv [uid]:513 pasta_sandbox/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 5) Usar o shell do container em modo --writable --no-home (instalar, modificar e testar) ====&lt;br /&gt;
&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em &amp;quot;modo escrita&amp;quot; para instalar pacotes.&lt;br /&gt;
&lt;br /&gt;
Também é indicado usar a opção --no-home para não montar a /home/root da máquina host e evitar que os instaladores tentem salvar algo na home da máquina host. &lt;br /&gt;
( Link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#using-no-home-and-containall-flags outras dicas sobre --no-home] )&lt;br /&gt;
&lt;br /&gt;
Se o instalador tentar usar a /home/root, deve-se ler a documentação do instalador para optar por pastas alternativas dentro da estrutura do container como /usr/bin, /usr/local, /opt/&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&lt;br /&gt;
* Use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; somente quando necessário modificar o container com instalação de pacotes e configuração&lt;br /&gt;
* Foi escolhido que das máquinas de processamento na rede, apenas '''EPONA, GHOST e MAGRITTE''' serão capazes de criar um container e abrir em modo edição. &lt;br /&gt;
* Outra restrição é que essa permissão só pode ser executada na pasta &amp;lt;code&amp;gt;'''/srv/forge'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 6) Usar o shell em modo &amp;quot;somente leitura&amp;quot; para testar ====&lt;br /&gt;
Executar seu singularity no formato &amp;quot;pasta sandbox&amp;quot; em modo &amp;quot;somente leitura&amp;quot; para testar:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
Em geral, nesse momento também é necessário montar uma pasta externa ao container para salvar dados e resultados, isso é explicado no pŕoximo item&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== 7) Montar /homeLocal/usuario dentro container para salvar resultados (opção &amp;lt;code&amp;gt; --bind &amp;lt;/code&amp;gt;) ====&lt;br /&gt;
O comportamento padrão do SingularityCE é montar as pastas /home/$USER, /tmp, and $PWD da máquina host dentro do container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras pastas também] ).&lt;br /&gt;
&lt;br /&gt;
Para acessar outros diretórios da máquina host dentro do container usa-se a sintaxe&lt;br /&gt;
    singularity shell --bind [/absolute/path/host/]:[/absolute/path/inside/container]&lt;br /&gt;
&lt;br /&gt;
O caminho de montagem dentro do container é opcional e se for omitido, é usado o mesmo caminho do host, porém o usuário deve ter permissão para acessar a pasta de montagem. No exemplo mostra como deixar o path /homeLocal/fulano acessível  dentro do container em /mnt:&lt;br /&gt;
    singularity shell --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
Também é possivel combinar as opções do --bind com --writable --no-home, neste caso, o root precisa ter permissão para acessar a pasta de montagem:&lt;br /&gt;
    sudo singularity shell --writable --no-home --bind /homeLocal/fulano:/mnt my_container/&lt;br /&gt;
&lt;br /&gt;
* link sobre a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;&lt;br /&gt;
* link com [https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 8) Converter um container singularity do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;''' (imagem compactada) ====&lt;br /&gt;
&lt;br /&gt;
Depois de pronta, a máquina container, pode ser convertida do formato &amp;quot;pasta sandbox&amp;quot; para o formato de &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;) isso permite que ela execute mais rápido, reduz o espaço em disco.&lt;br /&gt;
&lt;br /&gt;
O container pronto pode ser armazenado na sua pasta /home/nome_usuario da rede, assim pode ser executada como leitura de qualquer máquina de processamento que o usuário logar.&lt;br /&gt;
&lt;br /&gt;
1) Para converter do formato '''&amp;quot;pasta sandbox&amp;quot;''' para o formato '''&amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt;'''. [https://sylabs.io/guides/3.9/user-guide/build_a_container.html#converting-containers-from-one-format-to-another Dicas sobre conversão de formatos das máquinas container]:&lt;br /&gt;
    sudo singularity build [container_destino] [container_origem]&lt;br /&gt;
    sudo singularity build my_container-compact.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitar recursos do container (RAM, Core's, network e etc) ==&lt;br /&gt;
&lt;br /&gt;
É possível criar um arquivo '''cgroups.toml''' e limitar (ou medir) recursos usados pelo container. Por exemplo, limitar o uso de RAM para não esgotar os recursos da máquina host. &lt;br /&gt;
&lt;br /&gt;
Segue o texto original e os links com mais informações:&lt;br /&gt;
&lt;br /&gt;
''The cgroups (control groups) functionality of the Linux kernel allows you to limit and meter the resources used by a process, or group of processes. Using cgroups you can limit memory and CPU usage. You can also rate limit block IO, network IO, and control access to device nodes.''&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html#cgroups-toml&lt;br /&gt;
&lt;br /&gt;
* https://docs.sylabs.io/guides/3.10/admin-guide/configfiles.html&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Docker Hub: Usar repositório de Máquinas Container Prontas! ==&lt;br /&gt;
* Docker Hub: várias imagens prontas com ferramentas instaladas&lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/&lt;br /&gt;
&lt;br /&gt;
Por exemplo pode-se buscar no google: &amp;quot;docker hub opencv ubuntu&amp;quot;, uma das respostas será o repositório &lt;br /&gt;
&lt;br /&gt;
    https://hub.docker.com/r/jjanzic/docker-python3-opencv&lt;br /&gt;
&lt;br /&gt;
Para usar um endereço de imagem docker hub e criar seu container singularity, usa-se o '''formato docker://REPOSITORIO:TAGS'''&lt;br /&gt;
&lt;br /&gt;
No caso do repósitório exemplo, ao abrir o link, vai encontrar diversas TAGS listadas na pagina: &lt;br /&gt;
&lt;br /&gt;
    List of available docker tags:&lt;br /&gt;
    opencv-4.1.0 (latest branch)&lt;br /&gt;
    contrib-opencv-4.1.0 (opencv_contrib branch)&lt;br /&gt;
    opencv-4.0.1&lt;br /&gt;
    contrib-opencv-4.0.1&lt;br /&gt;
    opencv-4.0.0&lt;br /&gt;
    contrib-opencv-4.0.0&lt;br /&gt;
    opencv-3.4.2&lt;br /&gt;
    contrib-opencv-3.4.2&lt;br /&gt;
    (...)&lt;br /&gt;
&lt;br /&gt;
Assim para criar o container usando &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; e copiando do repositório exemplo a tag &amp;lt;code&amp;gt;opencv-4.0.1&amp;lt;/code&amp;gt;, tem-se:&lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox opencv-base docker://jjanzic/docker-python3-opencv:opencv-4.0.1&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PIP: Python Package Installer ==&lt;br /&gt;
O '''Python Package Installer''', também conhecido como PIP, é responsável por instalar os pacotes Python criados pela comunidade. Dentro do singularity + moosefs, ele tem um comportamento anômalo, não instalando nas pastas padrão. Tais pastas &amp;quot;''padrão''&amp;quot; são especificadas diretamente no código-fonte do python, mais precisamente no módulo ''sys''.&lt;br /&gt;
Faz-se portanto necessário utilizar a flag &amp;lt;code&amp;gt;-t/--target&amp;lt;/code&amp;gt; ao instalar os pacotes via pip, apontando para a pasta ''dist-packages'' da distribuição utilizada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt; pip install &amp;lt;package&amp;gt; -t /usr/local/lib/python2.7/dist-packages/ &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links dos Comandos Básicos ==&lt;br /&gt;
https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#interact-with-images&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/build_a_container.html#build-a-container '''build''']&amp;lt;/code&amp;gt;: Cria uma imagem para a máquina container&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt; [https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#shell '''shell''']&amp;lt;/code&amp;gt;: Executa a imagem da máquina container e permite a interação no prompt do shell&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#executing-commands '''exec''']&amp;lt;/code&amp;gt;: Executa um comando na máquina container, em segundo plano, e apresenta o resultado no shell da máquina host&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;[https://www.sylabs.io/guides/3.9/user-guide/quick_start.html#running-a-container '''run''']&amp;lt;/code&amp;gt;: Executa ações e scripts configurados no container, como se fosse um executável.&lt;br /&gt;
&lt;br /&gt;
* opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/3.9/user-guide/quick_start.html#working-with-files '''--bind''']&amp;lt;/code&amp;gt;: Permite acessar pastas e arquivos (path) da máquina host dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#user-defined-bind-points outras dicas sobre --bind])&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''build'''&amp;lt;/code&amp;gt;: Criar uma máquina container ==&lt;br /&gt;
&lt;br /&gt;
==== Criar uma máquina container editável (para instalar pacotes) ====&lt;br /&gt;
* Deve-se usar um singularity no formato &amp;quot;pasta sandbox&amp;quot; (estrutura de diretórios). [https://www.sylabs.io/guides/2.5.1/user-guide/quick_start.html#sandbox-directory Dicas sobre a opção &amp;lt;code&amp;gt;--sandbox&amp;lt;/code&amp;gt;].&lt;br /&gt;
* Criar singularity sandbox usando o repositório Ubuntu 18.04 do Docker Hub: &lt;br /&gt;
&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:20.04&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Exemplo singularity sandbox usando um repositório qualquer do dockerhub&lt;br /&gt;
    sudo singularity build --sandbox my_container/ docker://repository_name:tag&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==== outros exemplos menos usados, pois criam container's não editável ====&lt;br /&gt;
* Criar uma máquina container em formato &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (read-only) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
Deve-se usar o formato &amp;lt;code&amp;gt;.sif&amp;lt;/code&amp;gt; (writable) a partir de um repositório Docker Hub: &lt;br /&gt;
    sudo singularity build my_ubuntu.sif docker://index.docker.io/library/ubuntu:latest&lt;br /&gt;
&lt;br /&gt;
* Converter ou Criar uma máquina container em formato de imagem a partir de uma pasta sandbox:&lt;br /&gt;
    sudo singularity build my_ubuntu.sif my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;'''shell'''&amp;lt;/code&amp;gt;: Executar a máquina container e interagir no shell: ==&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell, sem salvar modificações feitas na sessão:&lt;br /&gt;
    singularity shell my_container/&lt;br /&gt;
    singularity shell my_ubuntu.sif/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--writable'''&amp;lt;/code&amp;gt;: Permitir alterar o container em formato pasta sandbox: ==&lt;br /&gt;
&lt;br /&gt;
* Só é possivel alterar um container em formato &amp;lt;code&amp;gt;sandbox&amp;lt;/code&amp;gt;, uma boa prática é adicionar a opção --no-home é importante para não ocorrer a montagem automática da /home do root, e evitar que instaladores tentem usar essa pasta para instalação de pacotes.&lt;br /&gt;
    sudo singularity shell --writable --no-home my_container/&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;opção '''--bind'''&amp;lt;/code&amp;gt;:Montando pastas da máquina host para acessar dentro da máquina container ==&lt;br /&gt;
A pasta do home do usuário é montada automaticamente pelo singularity dentro da máquina container ([https://sylabs.io/guides/3.9/user-guide/bind_paths_and_mounts.html#system-defined-bind-paths algumas outras também ] ), mas se for necessário acessar outra pasta no disco da máquina host, deve-se usar a opção &amp;lt;code&amp;gt;[https://sylabs.io/guides/2.5/user-guide/bind_paths_and_mounts.html#specifying-bind-paths --bind]&amp;lt;/code&amp;gt; para indicar o caminho (path) a ser usado. O usuário precisa ter permissão de leitura e escrita na pasta da máquina host.&lt;br /&gt;
&lt;br /&gt;
* Executar a máquina container no shell e montar o caminho /homeLocal/fulano da máquina host dentro da máquina container &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;singularity shell --bind /homeLocal/fulano:/mnt my_container/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1265</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1265"/>
				<updated>2023-11-21T15:52:03Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Wiki Tello Pilots==&lt;br /&gt;
&lt;br /&gt;
Aqui você pode encontrar diversas informações sobre drones Tello.&lt;br /&gt;
https://tellopilots.com/wiki/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Api==&lt;br /&gt;
https://djitellopy.readthedocs.io/en/latest/tello/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Para conseguir se conectar ao drone através da api, é necessário está conectado na rede Wi-Fi do drone.&lt;br /&gt;
O mesmo vale para a controlar através de um dispositivo mobile.&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1264</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1264"/>
				<updated>2023-11-21T14:13:29Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Wiki Tello Pilots==&lt;br /&gt;
&lt;br /&gt;
Aqui você pode encontrar diversas informações sobre drones Tello.&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1263</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1263"/>
				<updated>2023-11-21T14:11:07Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Wiki Tello Pilots==&lt;br /&gt;
&lt;br /&gt;
Wiki Tello&lt;br /&gt;
&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1262</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1262"/>
				<updated>2023-11-21T14:10:57Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Wiki Tello Pilots===&lt;br /&gt;
&lt;br /&gt;
Wiki Tello&lt;br /&gt;
&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1261</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1261"/>
				<updated>2023-11-21T14:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=DJI Tello=&lt;br /&gt;
&lt;br /&gt;
Wiki Tello&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1260</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1260"/>
				<updated>2023-11-21T14:09:52Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=DJI Tello+&lt;br /&gt;
&lt;br /&gt;
Wiki Tello&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1259</id>
		<title>DJI</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=DJI&amp;diff=1259"/>
				<updated>2023-11-21T14:07:07Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: Created page with &amp;quot;DJI Tello  Wiki Tello https://tellopilots.com/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DJI Tello&lt;br /&gt;
&lt;br /&gt;
Wiki Tello&lt;br /&gt;
https://tellopilots.com/wiki/&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1258</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1258"/>
				<updated>2023-11-21T14:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Multirotor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Seja bem vindo a Wiki do VeRLab (Computer Vision and Robotics Laboratory - DCC - UFMG) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Regras de Conduta e Termo de Compromisso]] ===&lt;br /&gt;
=== [[Como rodar seu experimento]] ===&lt;br /&gt;
=== [[Trabalhando remotamente]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Dicas para escrever e apresentar sua publicação]] ===&lt;br /&gt;
=== [http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:AllPages  Relação de todas as páginas dessa wiki] ===&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Robot Robôs] ==&lt;br /&gt;
&lt;br /&gt;
==== Small size Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Main_Page/e-puck E-puck]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/HeRo HeRo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Espcopter Espcopter]&lt;br /&gt;
&lt;br /&gt;
==== Mobile Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Roomba Roomba]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kobuki Kobuki]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pioneer Pioneer - ActivMedia Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jackal Jackal - Clearpath Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Tamiya Tamiya TXT-1]&lt;br /&gt;
&lt;br /&gt;
==== Robot Arm ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kinova_Gen3_Ultra Gen3 Ultra lightweight robot arm - KINOVA]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Fenrir_Arm Fenrir]&lt;br /&gt;
&lt;br /&gt;
==== Multirotor ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ARdrone Parrot AR.Drone 2.0]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hummingbird AscTec Hummingbird]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pelican AscTec Pelican]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Iris 3DR IRIS+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/X8 3DR X8+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/DJI Tello]&lt;br /&gt;
&lt;br /&gt;
==== Fixed-Wing ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Aero 3DR Aero]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/E384 Drone E384]&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sensor Sensores] ==&lt;br /&gt;
==== Laser ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Laser_Hokuyo Hokuyo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/LaserVelodyne Velodyne]&lt;br /&gt;
&lt;br /&gt;
==== IMU (unidades inerciais, acelerômetro, magnetometro, barômetro e etc ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/IMU IMUs]&lt;br /&gt;
&lt;br /&gt;
==== Câmeras ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Camera_360 Camera 360]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GoPro GoPro]&lt;br /&gt;
* TODO Kinect One (Xbox One)&lt;br /&gt;
* TODO Kinect v2 (Xbox 360)&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ZED StereoLabs ZED(RGBD)]&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RealSense Intel Real Sense (RGBD)]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Asus_Xtion_PRO Asus Xtion PRO]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/WebCams WebCams]&lt;br /&gt;
&lt;br /&gt;
==== Realidade Virtual e Aumentada ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hololens HoloLens]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Oculus_Rift Oculus Rift]&lt;br /&gt;
&lt;br /&gt;
== Atuadores ==&lt;br /&gt;
* Dynamixel AX-12&lt;br /&gt;
* Dynamixel MX-64AT&lt;br /&gt;
* TODO Motor Servo&lt;br /&gt;
* TODO Interface Haptica&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Placas Controladoras e Sensor Nodes ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Arduino Arduino]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP32 ESP32]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP8266 ESP8266]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RaspberryPi Raspberry Pi]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jetson_Nano Jetson nano - Nvidia]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/mote Sensor Nodes]&lt;br /&gt;
&lt;br /&gt;
== Softwares ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity Singularity]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ROS ROS - Robot Operacional System]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Virtualenv Python Virtual Enviroment]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GitHub_do_Verlab GitHub do Verlab]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Windows S.O. Windows]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Linux S.O. Linux]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Pesquisa ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Impressora3D Impressora 3D]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Informática ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Cabo_de_Rede Montagem de Cabos de Rede]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Impressoras Impressoras]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/NoBreak No Break]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/HD Teste HD - smartctl]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/RotuladorPT80 Rotuladora PT80]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/PastaTermica Aplicação e Escolha de Pasta Térmica]&lt;br /&gt;
&lt;br /&gt;
== Ferramentas ==&lt;br /&gt;
* TODO&lt;br /&gt;
* [http://www.crvindustrial.com/blog/como-medir-parafusos-corretamente como medir parafusos]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] &lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	<entry>
		<id>http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1257</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="http://www.verlab.dcc.ufmg.br/mediawiki/index.php?title=Main_Page&amp;diff=1257"/>
				<updated>2023-11-21T13:54:30Z</updated>
		
		<summary type="html">&lt;p&gt;Othiago: /* Multirotor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Seja bem vindo a Wiki do VeRLab (Computer Vision and Robotics Laboratory - DCC - UFMG) ==&lt;br /&gt;
&lt;br /&gt;
=== [[Regras de Conduta e Termo de Compromisso]] ===&lt;br /&gt;
=== [[Como rodar seu experimento]] ===&lt;br /&gt;
=== [[Trabalhando remotamente]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Dicas para escrever e apresentar sua publicação]] ===&lt;br /&gt;
=== [http://www.verlab.dcc.ufmg.br/mediawiki/index.php/Special:AllPages  Relação de todas as páginas dessa wiki] ===&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Robot Robôs] ==&lt;br /&gt;
&lt;br /&gt;
==== Small size Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Main_Page/e-puck E-puck]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/HeRo HeRo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Espcopter Espcopter]&lt;br /&gt;
&lt;br /&gt;
==== Mobile Robots ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Roomba Roomba]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kobuki Kobuki]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pioneer Pioneer - ActivMedia Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jackal Jackal - Clearpath Robotics]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Tamiya Tamiya TXT-1]&lt;br /&gt;
&lt;br /&gt;
==== Robot Arm ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Kinova_Gen3_Ultra Gen3 Ultra lightweight robot arm - KINOVA]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Fenrir_Arm Fenrir]&lt;br /&gt;
&lt;br /&gt;
==== Multirotor ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ARdrone Parrot AR.Drone 2.0]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hummingbird AscTec Hummingbird]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Pelican AscTec Pelican]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Iris 3DR IRIS+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/X8 3DR X8+]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ DJI Tello]&lt;br /&gt;
&lt;br /&gt;
==== Fixed-Wing ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Aero 3DR Aero]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/E384 Drone E384]&lt;br /&gt;
&lt;br /&gt;
== [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sensor Sensores] ==&lt;br /&gt;
==== Laser ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Laser_Hokuyo Hokuyo]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/LaserVelodyne Velodyne]&lt;br /&gt;
&lt;br /&gt;
==== IMU (unidades inerciais, acelerômetro, magnetometro, barômetro e etc ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/IMU IMUs]&lt;br /&gt;
&lt;br /&gt;
==== Câmeras ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Camera_360 Camera 360]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GoPro GoPro]&lt;br /&gt;
* TODO Kinect One (Xbox One)&lt;br /&gt;
* TODO Kinect v2 (Xbox 360)&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ZED StereoLabs ZED(RGBD)]&lt;br /&gt;
* TODO [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RealSense Intel Real Sense (RGBD)]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Asus_Xtion_PRO Asus Xtion PRO]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/WebCams WebCams]&lt;br /&gt;
&lt;br /&gt;
==== Realidade Virtual e Aumentada ====&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Hololens HoloLens]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Oculus_Rift Oculus Rift]&lt;br /&gt;
&lt;br /&gt;
== Atuadores ==&lt;br /&gt;
* Dynamixel AX-12&lt;br /&gt;
* Dynamixel MX-64AT&lt;br /&gt;
* TODO Motor Servo&lt;br /&gt;
* TODO Interface Haptica&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Placas Controladoras e Sensor Nodes ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Arduino Arduino]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP32 ESP32]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ESP8266 ESP8266]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/RaspberryPi Raspberry Pi]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Jetson_Nano Jetson nano - Nvidia]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/mote Sensor Nodes]&lt;br /&gt;
&lt;br /&gt;
== Softwares ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Singularity Singularity]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/ROS ROS - Robot Operacional System]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Virtualenv Python Virtual Enviroment]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/GitHub_do_Verlab GitHub do Verlab]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Windows S.O. Windows]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Sistema_Operacional_Linux S.O. Linux]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Pesquisa ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/Impressora3D Impressora 3D]&lt;br /&gt;
&lt;br /&gt;
== Equipamentos de Informática ==&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Cabo_de_Rede Montagem de Cabos de Rede]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/Impressoras Impressoras]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/NoBreak No Break]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/HD Teste HD - smartctl]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/RotuladorPT80 Rotuladora PT80]&lt;br /&gt;
* [https://www.verlab.dcc.ufmg.br/mediawiki/index.php/EquipamentoInformatica/PastaTermica Aplicação e Escolha de Pasta Térmica]&lt;br /&gt;
&lt;br /&gt;
== Ferramentas ==&lt;br /&gt;
* TODO&lt;br /&gt;
* [http://www.crvindustrial.com/blog/como-medir-parafusos-corretamente como medir parafusos]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] &lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Othiago</name></author>	</entry>

	</feed>