Escritorios virtuales para Windows 7/8

Introducción

Windows-8-Logo-OfficialUna -de las muchas- cosas que extraño de los ambientes de escritorio de GNU/Linux en las contadas ocasiones en las que debo utilizar Windows son los escritorios virtuales.

Había probado soluciones que emulaban los escritorios virtuales minimizando las aplicaciones cada vez que se cambiaba de escritorio, esto por supuesto era una solución poco elegante.  También encontré soluciones de terceros como Dexpot que parece ser muy utilizado, sin embargo es un producto comercial (free for personal use only).

Lo interesante que encontré hoy es que utilizando una herramienta muy simple es posible activar un API en Windows 7 y 8 que permite en buena medida tener escritorios virtuales.  Este software desarrollado por Windows Sysinternals permite tener cuatro escritorios virtuales y elegir las teclas a utilizarse para intercambiarlos.  No provee ningún tipo de animaciones o funcionalidades adicionales pero cumple bastante bien su función básica.

Instalación y uso

Del sitio web de la aplicación Desktops v2.0 se descarga un archivo .zip el cual debe descomprimirse y ubicarse en la ubicación donde permanecerá finalmente (bajo \Program Files por ejemplo).

cc817881.desktops(en-us,MSDN.10)

Al ejecutarse el programa aparece el diálogo de opciones que permite elegir la combinación de teclas que cambiará entre los escritorios.

cc817881.desktops2(en-us,MSDN.10)

La única consideración que debe tenerse en cuenta es que el programa debe estarse ejecutando todo el tiempo que se desee tener acceso a los escritorios virtuales, así que puede ser buena idea seleccionar la casilla Run automatically at logon en el diálogo de opciones.

Recursos

Linux + kernel 3.19 + NVidia + LightDM = blank screen

Introducción

NVidia_logoEste problema empezó a suceder tan pronto como instalé Ubuntu 15.10 y sucedió también cuando se actualizó el kernel del Ubuntu 14.04 LTS.  Por esto concluyo por ahora que el problema se encuentra relacionado con el kernel (3.19.0-47) que estoy utilizando actualmente y los controladores de NVidia, tanto los propietarios como los de código abierto.

El sistema operativo inicia aparentemente bien pero al cargar la pantalla de autenticación de usuario de LightDM esta aparece negra a pesar de que se escucha el sonido que se reproduce al llegar a este punto y es aún posible ingresar el nombre de usuario y contraseña e iniciar sesión sin que aparezca nada en la pantalla.

Solución

Después de probar varias opciones la solución aparente a este problema consiste en agregar los parámetros acpi_osi=Linux rcutree.rcu_idle_gp_delay=1 a la variable GRUB_CMDLINE_LINUX_DEFAULT del Grub de la siguiente manera.

$ sudo vi /etc/default/grub

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_osi=Linux rcutree.rcu_idle_gp_delay=1"
...

$ sudo update-grub

Para consultar el valor actual de dicha variable en la sesión actual es posible ejecutar el siguiente comando.

$ cat /sys/module/rcutree/parameters/rcu_idle_gp_delay

Según la documentación de los parámetros del kernel, este valor representa el intervalo de activación para las CPU desocupadas que tienen llamados RCU.

Instalación de un Nano Lynx Wireless-N USB 2.0 en una Raspberry Pi

Introducción

Los controladores para los adaptadores NanoLynx Wireless-N USB 2.0 ya se encuentran incluidos en las distribuciones actuales de Linux (Raspbian y DietPi entre otras) para la Raspberry Pi.

En caso de no tenerse se deberán obtener los controladores para rt2800 mediante la instalación del paquete firmware-ralink.

Verificación

Para verificar que el hardware se encuentra instalado y que ha sido reconocido exitosamente se debe ejecutar el siguiente comando.

$ lsusb

    Bus 001 Device 007: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter

Así mismo es conveniente verificar que los controladores necesarios hayan sido cargados exitosamente.

$ lsmod | grep rt2

    rt2800usb         18832    0 
    rt2800lib         81962    1    rt2800usb
    rt2x00usb         11918    1    rt2800usb
    rt2x00lib         47354    3    rt2x00usb,rt2800lib,rt2800usb
    mac80211         594951    3    rt2x00lib,rt2x00usb,rt2800lib
    cfg80211         477515    2    mac80211,rt2x00lib
    crc_ccitt          1620    1    rt2800lib

Configuración

La configuración de la interfaz de red se puede realizar mediante la herramienta de configuración de la red inalámbrica que viene con el sistema operativo o se puede realizar manualmente como se describe a continuación.

Instalar el paquete de wpasupplicant en caso de no tenerse aún.

# apt-get install wpasupplicant

Ejecute el siguiente comando reemplazando la palabra ssid por el identificador de la red inalámbrica a la cual se desea conectar y password por su respectiva contraseña.

$ wpa_passphrase ssid password 

Copie el resultado de la ejecución del comando anterior y agregue (o reemplace) la sección network en el archivo /etc/wpa_supplicant.conf.  Es posible que este archivo esté ubicado en /etc/wpa_supplicant/wpa_supplicant.conf (DietPi Jessie).

# vi /etc/wpa_supplicant.conf

 network={
   ssid="MiRed"
   psk=945609aab2413e64d57daef00eb5fab3acdde716e1e440981c004bc61dccc98c
 }

Para verificar la conexión con la configuración establecida en el paso anterior, ejecute el siguiente comando.  Una vez desee terminar la verificación presione CTRL+C.

$ wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf

Ajustar la configuración de las interfaces de red para incluir la información de wlan0 agregando la siguiente información.

# vi /etc/network/interfaces

    auto wlan0
    iface wlan0 inet dhcp
    wpa-driver wext
    wpa-conf /etc/wpa_supplicant.conf

Una vez terminados los ajustes, iniciar la interfaz de red para que tome la nueva configuración.

#  ifup wlan0

Finalmente si desea verificar los datos de configuración con los que se encuentra funcionando la interfaz de red inalámbrica ejecutar el siguiente comando.

# wpa_cli status

Recursos

  1. RPi Ralink WLAN devices
    http://elinux.org/RPi_Ralink_WLAN_devices
  2. RPi USB Wi-Fi Adapters
    http://elinux.org/RPi_USB_Wi-Fi_Adapters
  3. Rpi USB check-list (posible solución al bug de desconexión)
    http://elinux.org/Rpi_USB_check-list

Recursos interesantes de Laravel (2015-12)

Misceláneos

ROMs Android 5.1.1 (Lollipop) para Moto G LTE XT1040 (Peregrine)

Cifrado y firmado de archivos con GPG desde linea de comando

Generar un nuevo par de llaves

$ gpg --gen-key

gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:

(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)

Your selection? 1

RSA keys may be between 1024 and 4096 bits long.

What keysize do you want? (2048) 2048

Requested keysize is 2048 bits

Please specify how long the key should be valid.

0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years

Key is valid for? (0) 0

Key does not expire at all

Is this correct? (y/N) y

You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Jorge I. Meza
Email address: jimezam @autonoma.edu.co
Comment: PGP certificate for work

You selected this USER-ID: "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

You need a Passphrase to protect your secret key.

We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 239 more bytes)

gpg: key 525E50C5 marked as ultimately trusted public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/525E50C5 2015-10-15
Key fingerprint = 3792 F014 361E 93E7 355F 7FCA C153 2279 525E 50C5
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co> sub 2048R/E56672A6 2015-10-15

Listar las llaves conocidas

Las llaves públicas

$ gpg --list-keys

/home/educacion/.gnupg/pubring.gpg
----------------------------------
pub 2048R/525E50C5 2015-10-15
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>
sub 2048R/E56672A6 2015-10-15

Las llaves privadas

$ gpg --list-secret-keys

/home/educacion/.gnupg/secring.gpg
----------------------------------
sec 2048R/525E50C5 2015-10-15
uid Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>
ssb 2048R/E56672A6 2015-10-15

Exportar mi llave pública

$ gpg --armor --export -a 525E50C5 > public.key

Importar la llave pública de otro usuario

$ gpg --import public.key

Cifrar un archivo

$ gpg --recipient 525E50C5 --armor --encrypt ARCHIVO.EXT

En este caso se utilizará la llave pública identificada por el código 525E50C5 para cifrar el archivo.  Este proceso genera ARCHIVO.EXT.asc el cual corresponde a la versión cifrada de ARCHIVO.EXT y es el archivo que se podrá transmitir a través de un medio inseguro.

Descifrar un archivo

$ gpg --output ARCHIVO.EXT --decrypt ARCHIVO.EXT.asc

Firmar un archivo

$ gpg --detach-sign ARCHIVO.EXT

Se genera el archivo ARCHIVO.EXT.sig el cual corresponde a la firma del archivo ARCHIVO.EXT y se deberá transmitir junto con el archivo original.

Verificar la firma de un archivo

Se deberá contar con el archivo de la firma (.sig) y con el archivo original, así como con la llave pública de su supuesto autor.

$ gpg ARCHIVO.EXT.sig

En caso de que el documento corresponda con el expedido por el autor original se obtendrá un mensaje similar al siguiente.

gpg: assuming signed data in `ARCHIVO.EXT'
gpg: Signature made jue 15 oct 2015 12:40:56 COT using RSA key ID 525E50C5
gpg: Good signature from "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

En caso de que el documento NO corresponda con el expedido por el autor original se obtendrá un mensaje similar al siguiente.

gpg: assuming signed data in `ARCHIVO.EXT'
gpg: Signature made jue 15 oct 2015 12:40:56 COT using RSA key ID 525E50C5
gpg: BAD signature from "Jorge I. Meza (PGP certificate for work) <jimezam @autonoma.edu.co>"

Recursos

  1. The GNU Privacy Guard
    https://gnupg.org/
  2. GNU Privacy Guard en Wikipedia
    https://en.wikipedia.org/wiki/GNU_Privacy_Guard
  3. Curso sencillo de PGP por Arturo Quirantes Sierra
    http://www.ugr.es/~aquiran/cripto/cursopgp.htm
  4. GPG Tutorial
    https://futureboy.us/pgp.html
  5. GnuPrivacyGuardHowto en Ubuntu Documentation
    https://help.ubuntu.com/community/GnuPrivacyGuardHowto
  6. PGP Tutorial
    http://aperiodic.net/phil/pgp/tutorial.html

Crear contenedores con usuarios sin privilegios utilizando LXC en Ubuntu

Introducción

Los contenedores creados por usuarios sin privilegios son muchos mas seguros en comparación con su contraparte creados por el usuario root ya que su administrador no corresponde directamente con el usuario administrador del huésped sino que sus usuarios son mapeados por unos UID y GID diferentes.  Por ejemplo, el root (0) de un contenedor será mapeado el huésped por un UID como 100000 por lo tanto, en el peor caso en que un atacante lograra salir del contenedor hasta el huésped, lo haría como un usuario sin privilegios.

Esto también trae consigo como efecto colateral negativo que las siguientes operaciones no sean permitidas.

  1. Montar la mayoría de sistemas de archivos.
  2. Crear dispositivos de nodo.
  3. Cualquier operación realizada por un uid/gid que no se encuentre en la lista de mapeo.

Adicionalmente esto produce que las plantillas de las distribuciones no funcionen y sea necesario utilizar la plantilla download que permite descargar imagenes preconstruidas de las distribuciones que funcionan en este tipo de ambiente.

Configuración para permitir contenedores por usuarios sin privilegios

$ mkdir -p ~/.config/lxc
$ echo "lxc.id_map = u 0 100000 65536" > ~/.config/lxc/default.conf
$ echo "lxc.id_map = g 0 100000 65536" >> ~/.config/lxc/default.conf
$ echo "lxc.network.type = veth" >> ~/.config/lxc/default.conf
$ echo "lxc.network.link = lxcbr0" >> ~/.config/lxc/default.conf
$ echo "$USER veth lxcbr0 10" | sudo tee -a /etc/lxc/lxc-usernet

Si se desea puede tomarse al archivo /etc/lxc/default.conf  como plantilla para la preparación del archivo de configuración local del usuario ~/.config/lxc/default.conf.

Los valores de lxc.id_map tanto para el grupo como para el usuario deberán coincidir con los registrados en and /etc/subgid y /etc/subuid respectivamente.  En caso que requiera ajustar estos rangos utilizar el siguiente comando.

$ sudo usermod -v 100000-200000 -w 100000-200000 NOMBRE_USUARIO

Comúnmente es necesario cerrar y volver a abrir la sesión del usuario actual o inclusive, reiniciar el sistema operativo para garantizar que el usuario se encuentre correctamente asignado a sus respectivos cgroups
(esto es especialmente importante si cgmanager no se había instalado antes de la instalación de LXC).

En caso de ser necesario, ajuste el permiso de ejecución en el directorio bajo el cual se almacena la configuración y los sistemas de archivos de los contenedores: ~/.local/share/lxc/.

$ sudo chmod -R o+X ~/.local

Administración de los contenedores

La administración de los contenedores se realiza tal y como se reseña en un artículo anterior, esta vez sin la necesidad del sudo ya que son contenedores creados por usuarios sin privilegios de administración.

A continuación se reseñan los comandos principales.

$ lxc-create -t download -n NOMBRE_CONTENEDOR — -d PLANTILLA -r VERSION -a ARQUITECTURA Crear un nuevo contenedor
$ lxc-start -n NOMBRE_CONTENEDOR -d Iniciar un contenedor
$ lxc-attach -n NOMBRE_CONTENEDOR
Acceder al shell de un contenedor desde el actual
$ lxc-stop -n NOMBRE_CONTENEDOR
Detener a un contenedor
$ lxc-destroy -n NOMBRE_CONTENEDOR
Destruir (remover) un contenedor existente

Recursos

  1. LXC in Ubuntu’s Server Guide
    https://help.ubuntu.com/lts/serverguide/lxc.html
  2. LXC Getting Started in Linux Containers
    https://linuxcontainers.org/lxc/getting-started/

Los primeros 10 minutos con LXC en Ubuntu

Rutas

/var/cache/lxc Imágenes de sistemas operativos descargados a partir de un template
/etc/lxc Configuración general
/var/lib/lxc/ Contenedores creados por root
/var/lib/lxc/NOMBRE_CONTENEDOR/config Configuración específica del contenedor
~/.local/share/lxc Contenedores creados por usuarios sin privilegios

Instalación

Instalación de los paquetes básicos.

$ sudo aptitude install lxc lxc-templates

De acuerdo al sistema operativo (template) que se desee instalar también será necesario uno de los siguientes paqutes.

ArchLinux arch-install-scripts
Debian/Ubuntu debootstrap
CentOS yum

Una vez instalado probar el ambiente disponible.

$ lxc-checkconfig

Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.13.0-37-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Comandos principales

Listar los templates disponibles

$ ls /usr/share/lxc/templates

    lxc-alpine    lxc-archlinux  lxc-centos  lxc-debian    lxc-fedora  lxc-openmandriva  lxc-oracle  lxc-sshd    lxc-ubuntu-cloud
 lxc-altlinux  lxc-busybox    lxc-cirros  lxc-download  lxc-gentoo  lxc-opensuse      lxc-plamo   lxc-ubuntu

Crear un contenedor (usuario con privilegios)

$ sudo lxc-create -n NOMBRE_CONTENEDOR -t NOMBRE_TEMPLATE

Para especificar una versión (release) específico del template que se desea instalar.  Por ejemplo, si se desea elegir ubuntu lucid específicamente se debe ejecutar el siguiente comando.

$ sudo lxc-create -t ubuntu -n NOMBRE_CONTENEDOR -- -r lucid

Si se desea crear un contenedor de 32 bits en una máquina de 64 bits es necesario agregar el parámetro -a de la sigiuente manera.

$ sudo lxc-create -n NOMBRE_CONTENEDOR -t NOMBRE_TEMPLATE -a i386

Información de los contenedores

$ lxc-ls --fancy

Obtener información ampliada de un contenedor específico

$ lxc-info --name NOMBRE_CONTENEDOR

Iniciar un contenedor

$ lxc-start -n NOMBRE_CONTENEDOR -d

Acceder a la consola de un contenedor

$ lxc-console -n NOMBRE_CONTENEDOR

Para salir de la consola es necesario presionar la secuencia de teclas Ctrl+A Q.

Para acceder al shell del contenedor desde el mismo shell actual, ejecutar el siguiente comando.

$ lxc-attach -n NOMBRE_CONTENEDOR

Suspender (congelar) la ejecución de un contenedor

$ lxc-freeze -n NOMBRE_CONTENEDOR

Reanudar (descongelar) la ejecución de un contenedor

$ lxc-unfreeze -n NOMBRE_CONTENEDOR

Finalizar la ejecución de un contenedor

Realizar una finalización segura (apagado).

$ lxc-shutdown -n NOMBRE_CONTENEDOR

Realizar un apagado abrupto (halar del cable).

$ lxc-stop -n NOMBRE_CONTENEDOR

Destruir un contenedor

Esta acción elimina los archivos asociados con el contenedor.

$ lxc-destroy -n NOMBRE_CONTENEDOR

Recursos

Los primeros 10 minutos con LXD el hypervisor de contenedores en Ubuntu

Instalación

$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-git-master

$ sudo apt-get update

$ sudo apt-get install lxd

El proceso de instalación incluye la creación del grupo lxd al que deberán pertenecer todos los usuarios que interactúen con los contenedores.  Inicialmente se agregan a este grupo todos los usuarios que pertenecían a admin y sudoers en el momento de la instalación.

Una vez realizada la instalación es necesario cerrar y volver a abrir la sesión de usuario para que la inscripción en el grupo lxd sea tomada en cuenta.  Si se desea obviar esto, ejecute el siguiente comando para incluir al usuario en el grupo mencionado sobre la sesión actual.

$ newgrp lxd

Gestión de imágenes

Agregar el repositorio de linuxcontainers.org.

$ lxc remote add lxc-org images.linuxcontainers.org

$ lxc remote list

+---------+-----------------------------------------+--------+
|  NAME   |                   URL                   | PUBLIC |
+---------+-----------------------------------------+--------+
| local   | unix:///var/lib/lxd/unix.socket         | NO     |
| lxc-org | https://images.linuxcontainers.org:8443 | YES    |
+---------+-----------------------------------------+--------+

Importar imágenes para tenerlas disponibles localmente.

# Ubuntu Cloud
$ lxd-images import ubuntu --alias ubuntu-cloud

# Debian 8 64 bits
$ lxc image copy lxc-org:/debian/jessie/amd64 local: --alias=jessie-amd64

Consultar mas información acerca de las imágenes disponibles en el repositorio de linuxcontainers.org.

Listar las imágenes disponibles en un repositorio remoto

$ lxc image list lxc-org:

+--------------------------------+--------------+--------+-------------------------+---------+-------------------------------+
|             ALIAS              | FINGERPRINT  | PUBLIC |       DESCRIPTION       |  ARCH   |          UPLOAD DATE          |
+--------------------------------+--------------+--------+-------------------------+---------+-------------------------------+
|                                | ee326b31ae93 | yes    | Debian squeeze (amd64)  | x86_64  | Oct 1, 2015 at 6:17pm (COT)   |
|                                | cd3f30323ce2 | yes    | Centos 6 (amd64)        | x86_64  | Oct 1, 2015 at 10:17pm (COT)  |
|                                | b6a940bfe3a4 | yes    | Plamo 5.x (amd64)       | x86_64  | Sep 30, 2015 at 5:23pm (COT)  |
|                                | 5351e4792a81 | yes    | Plamo 5.x (amd64)       | x86_64  | Oct 1, 2015 at 5:24pm (COT)   |
|                                | 02a8d955bc82 | yes    | Plamo 5.x amd64 (mini)  | x86_64  | Sep 30, 2015 at 5:50pm (COT)  |
|                                | 5df2ba98422b | yes    | Plamo 5.x amd64 (mini)  | x86_64  | Oct 1, 2015 at 5:50pm (COT)   |

...

Listar las imágenes disponibles localmente

$ lxc image list

+--------------+--------------+--------+------------------------------------+--------+------------------------------+
|    ALIAS     | FINGERPRINT  | PUBLIC |            DESCRIPTION             |  ARCH  |         UPLOAD DATE          |
+--------------+--------------+--------+------------------------------------+--------+------------------------------+
| jessie-amd64 | 87c085189294 | yes    | Debian jessie (amd64)              | x86_64 | Oct 3, 2015 at 1:40am (COT)  |
| ubuntu-cloud | a1448d43bb7c | no     | Ubuntu 14.04 LTS server (20150930) | x86_64 | Oct 3, 2015 at 12:49am (COT) |
+--------------+--------------+--------+------------------------------------+--------+------------------------------+

Obtener información de una imagen disponible localmente.

$ lxc image info jessie-amd64

Fingerprint: 87c085189294cd6a316dbefe1e235f9b9e69aa1b049df4ddce2202ad0f9c56ab
Size: 1e+02MB
Architecture: x86_64
Public: no
Timestamps:
    Created: 2015/10/02 23:30 UTC
    Uploaded: 2015/10/03 06:40 UTC
    Expires: never
Properties:
    description: Debian jessie (amd64)
Aliases:
    - jessie-amd64

Remover una imagen dispoible localmente.

$ lxc image delete jessie-amd64

Sincronizar la versión de las imágenes locales con la disponible en los repositorios.

$ lxd-images sync

Es posible agregar la opción --sync durante la importación de la imagen para mantenerla actualizada automáticamente.

Gestión de contenedores

Crear un nuevo contenedor a partir de una imagen disponible localmente.

$ lxc launch ubuntu-cloud myContainer

Si la imagen solicitada, ubuntu-cloud en este caso, no se encuentra disponible localmente, esta es importada automáticamente y puesta en el caché por 10 días.

Listar los contenedores disponibles y su estado.

$ lxc list

Iniciar un contenedor explícito.

$ lxc start myContainer

Consultar el registro (log) de un contenedor explícito.

$ lxc info --show-log myContainer

Detener a un contenedor explícito.

$ lxc stop myContainer

Destruir (remover) a un contenedor explícito.

$ lxc delete myContainer

Interacción con el contenedor

Ejecutar un comando en un contenedor específico.

$ lxc exec myContainer -- COMANDO

Acceder al shell del contenedor.

$ lxc exec myContainer -- /bin/bash

Transferir un archivo hacia el contenedor.

$ lxc file push ARCHIVO myContainer/ruta/de/destino

Transferir un archivo desde el contenedor.

$ lxc file pull myContainer/ruta/de/origen .

Recursos

  1. What’s LXD?
    https://linuxcontainers.org/lxd/introduction/
  2. LXD – The Linux container hypervisor
    http://www.ubuntu.com/cloud/tools/lxd
  3. Getting started with LXD – the container lightervisor
    https://insights.ubuntu.com/2015/04/28/getting-started-with-lxd-the-container-lightervisor/
  4. Installing LXD and the command line tool
    https://insights.ubuntu.com/2015/03/20/installing-lxd-and-the-command-line-tool/
  5. Infographic: LXD Machine containers from Ubuntu
    https://insights.ubuntu.com/2015/09/23/infographic-lxd-machine-containers-from-ubuntu/
  6. Repositorio de LXD en GitHub
    https://github.com/lxc/lxd