Capítulo 29. Modo de dispositivo USB / USB OTG

This translation may be out of date. To help with the translations please access the FreeBSD translations instance.

29.1. Sinopsis

Este capítulo trata el uso del modo de dispositivo USB y USB On The Go (USB OTG) en FreeBSD. Incluye consolas serie virtuales, interfaces de red virtuales y unidades USB virtuales.

Al ejecutarse en hardware compatible con el modo de dispositivo USB o USB OTG, como el integrado en muchas placas embebidas, la pila USB de FreeBSD puede funcionar en modo de dispositivo. El modo de dispositivo permite que el ordenador se presente como diferentes tipos de clases de dispositivos USB, incluidos puertos serie, adaptadores de red y almacenamiento masivo, o una combinación de ellos. Un host USB, como un ordenador portátil o de escritorio, puede acceder a ellos igual que a dispositivos USB físicos. El modo de dispositivo se denomina en ocasiones "modo gadget USB".

El hardware puede proporcionar la funcionalidad de modo de dispositivo de dos formas básicas: con un "puerto cliente" independiente, que solo admite el modo de dispositivo, y con un puerto USB OTG, que puede proporcionar tanto el modo de dispositivo como el de host. Para los puertos USB OTG, la pila USB cambia automáticamente entre los modos host y dispositivo, dependiendo de lo que esté conectado al puerto. Conectar un dispositivo USB, como una memoria USB, al puerto hace que FreeBSD cambie al modo host. Conectar un host USB, como un ordenador, hace que FreeBSD cambie al modo de dispositivo. Los "puertos cliente" de uso exclusivo siempre funcionan en modo de dispositivo.

Lo que FreeBSD presenta al host USB depende de la sysctl hw.usb.template. Algunas plantillas proporcionan un único dispositivo, como un terminal serie; otras proporcionan varios, que pueden utilizarse todos a la vez. Un ejemplo es la plantilla 10, que proporciona un dispositivo de almacenamiento masivo, una consola serie y una interfaz de red. Consulte usb_template(4) para obtener la lista de valores disponibles.

Tenga en cuenta que, en algunos casos, dependiendo del hardware y del sistema operativo del host, para que el host advierta el cambio de configuración, se debe desconectar y volver a conectar físicamente, o forzar un nuevo análisis del bus USB de una manera específica del sistema. Cuando FreeBSD se ejecuta en el host, se puede utilizar usbconfig(8) reset. Esto también debe hacerse después de cargar usb_template.ko si el host USB ya estaba conectado al conector USBOTG.

Después de leer este capítulo:

  • Sabrá cómo configurar la funcionalidad del modo de dispositivo USB en FreeBSD.

  • Sabrá cómo configurar el puerto serie virtual en FreeBSD.

  • Sabrá cómo conectarse al puerto serie virtual desde varios sistemas operativos.

  • Sabrá cómo configurar FreeBSD para proporcionar una interfaz de red USB virtual.

  • Sabrá cómo configurar FreeBSD para proporcionar un dispositivo de almacenamiento USB virtual.

29.2. Puertos serie virtuales USB

29.2.1. Configuración de puertos serie en modo de dispositivo USB

La compatibilidad con puertos serie virtuales la proporcionan las plantillas 3, 8 y 10. Tenga en cuenta que la plantilla 3 funciona con Microsoft Windows 10 sin necesidad de controladores especiales ni ficheros INF. Los demás sistemas operativos host funcionan con las tres plantillas. Se deben cargar los módulos del kernel usb_template(4) y umodem(4).

Para habilitar los puertos serie en modo de dispositivo USB, añada las siguientes líneas a /etc/ttys:

ttyU0	"/usr/libexec/getty 3wire"	vt100	onifconsole secure
ttyU1	"/usr/libexec/getty 3wire"	vt100	onifconsole secure

Después, añada estas líneas a /etc/devd.conf:

notify 100 {
	match "system"		"DEVFS";
	match "subsystem"	"CDEV";
	match "type"		"CREATE";
	match "cdev"		"ttyU[0-9]+";
	action "/sbin/init q";
};

Recargue la configuración si devd(8) ya se está ejecutando:

# service devd restart

Asegúrese de que los módulos necesarios se carguen y que la plantilla correcta se establezca durante el arranque añadiendo las siguientes líneas a /boot/loader.conf; créelo si aún no existe:

umodem_load="YES"
hw.usb.template=3

Para cargar el módulo y establecer la plantilla sin reiniciar, use:

# kldload umodem
# sysctl hw.usb.template=3

29.2.2. Conexión a los puertos serie en modo de dispositivo USB desde FreeBSD

Para conectarse a una placa configurada para proporcionar puertos serie en modo de dispositivo USB, conecte el host USB, como un ordenador portátil, al puerto USB OTG o USB cliente de la placa. Use pstat -t en el host para enumerar las líneas de terminal. Al final de la lista se muestra un puerto serie USB, por ejemplo, "ttyU0". Para abrir la conexión, use:

# cu -l /dev/ttyU0

Después de pulsar la tecla Enter unas cuantas veces, aparece una indicación de inicio de sesión.

29.2.3. Conexión a los puertos serie en modo de dispositivo USB desde macOS

Para conectarse a una placa configurada para proporcionar puertos serie en modo de dispositivo USB, conecte el host USB, como un ordenador portátil, al puerto USB OTG o USB cliente de la placa. Para abrir la conexión, use:

# cu -l /dev/cu.usbmodemFreeBSD1

29.2.4. Conexión a los puertos serie en modo de dispositivo USB desde Linux

Para conectarse a una placa configurada para proporcionar puertos serie en modo de dispositivo USB, conecte el host USB, como un ordenador portátil, al puerto USB OTG o USB cliente de la placa. Para abrir la conexión, use:

# minicom -D /dev/ttyACM0

29.2.5. Conexión a los puertos serie en modo de dispositivo USB desde Microsoft Windows 10

Para conectarse a una placa configurada para proporcionar puertos serie en modo de dispositivo USB, conecte el host USB, como un ordenador portátil, al puerto USB OTG o USB cliente de la placa. Para abrir una conexión se necesita un programa de terminal serie, como PuTTY. Para comprobar el nombre del puerto COM utilizado por Windows, abra el Administrador de dispositivos y expanda "Puertos (COM y LPT)". Aparece un nombre similar a "Dispositivo serie USB (COM4)". Ejecute el programa de terminal serie que prefiera, por ejemplo PuTTY. En el diálogo de PuTTY, establezca "Tipo de conexión" en "Serie", escriba el COMx obtenido del Administrador de dispositivos en el cuadro de diálogo "Línea serie" y haga clic en Abrir.

29.3. Interfaces de red en modo de dispositivo USB

La compatibilidad con interfaces de red virtuales la proporcionan las plantillas 1, 8 y 10. Tenga en cuenta que ninguna de ellas funciona con Microsoft Windows. Los demás sistemas operativos host funcionan con las tres plantillas. Se deben cargar los módulos del kernel usb_template(4) y if_cdce(4).

Asegúrese de que los módulos necesarios se carguen y que la plantilla correcta se establezca durante el arranque añadiendo las siguientes líneas a /boot/loader.conf; créelo si aún no existe:

if_cdce_load="YES"
hw.usb.template=1

Para cargar el módulo y establecer la plantilla sin reiniciar, use:

# kldload if_cdce
# sysctl hw.usb.template=1

29.4. Dispositivo de almacenamiento virtual USB

El controlador cfumass(4) es un controlador de modo de dispositivo USB disponible por primera vez en FreeBSD 12.0.

El destino de almacenamiento masivo lo proporcionan las plantillas 0 y 10. Se deben cargar los módulos del kernel usb_template(4) y cfumass(4). cfumass(4) se integra con el subsistema CTL, el mismo que se utiliza para destinos iSCSI o Fibre Channel. En el lado del host, los iniciadores de almacenamiento masivo USB solo pueden acceder a un único LUN, el LUN 0.

29.4.1. Configuración de un destino de almacenamiento masivo USB mediante el script de arranque cfumass

La forma más sencilla de configurar un destino de almacenamiento USB de sólo lectura es utilizar el script rc cfumass. Para configurarlo de esta forma, copie los ficheros que se presentarán al host USB en el directorio /var/cfumass y añada esta línea a /etc/rc.conf:

cfumass_enable="YES"

Para configurar el destino sin reiniciar, ejecute esta orden:

# service cfumass start

A diferencia de la funcionalidad serie y de red, la plantilla no se debe establecer en 0 o 10 en /boot/loader.conf. Esto se debe a que el LUN debe configurarse antes de establecer la plantilla. El script de arranque cfumass establece automáticamente el número de plantilla correcto al iniciarse.

29.4.2. Configuración de almacenamiento masivo USB por otros medios

El resto de este capítulo ofrece una descripción detallada de cómo configurar el destino sin usar el fichero rc de cfumass. Esto es necesario si, por ejemplo, se desea proporcionar un LUN con escritura.

El almacenamiento masivo USB no requiere que el demonio ctld(8) se esté ejecutando, aunque puede utilizarse si se desea. Esto es diferente de iSCSI. Por tanto, hay dos formas de configurar el destino: ctladm(8) o ctld(8). Ambas requieren que se cargue el módulo del kernel cfumass.ko. El módulo se puede cargar manualmente:

# kldload cfumass

Si cfumass.ko no se ha compilado en el kernel, se puede configurar /boot/loader.conf para cargar el módulo durante el arranque:

cfumass_load="YES"

Se puede crear un LUN sin el demonio ctld(8):

# ctladm create -b block -o file=/data/target0

Esto presenta el contenido del fichero de imagen /data/target0 como un LUN al host USB. El fichero debe existir antes de ejecutar la orden. Para configurar el LUN en el arranque del sistema, añada la orden a /etc/rc.local.

También se puede utilizar ctld(8) para gestionar LUN. Cree /etc/ctl.conf, añada una línea a /etc/rc.conf para asegurarse de que ctld(8) se inicie automáticamente durante el arranque y, a continuación, inicie el demonio.

Este es un ejemplo de un fichero de configuración /etc/ctl.conf sencillo. Consulte ctl.conf(5) para obtener una descripción completa de las opciones.

target naa.50015178f369f092 {
	lun 0 {
		path /data/target0
		size 4G
	}
}

El ejemplo crea un único destino con un único LUN. naa.50015178f369f092 es un identificador de dispositivo compuesto por 32 dígitos hexadecimales aleatorios. La línea path define la ruta completa a un fichero o zvol que sirve de respaldo al LUN. Ese fichero debe existir antes de iniciar ctld(8). La segunda línea es opcional y especifica el tamaño del LUN.

Para asegurarse de que el demonio ctld(8) se inicie durante el arranque, añada esta línea a /etc/rc.conf:

ctld_enable="YES"

Para iniciar ctld(8) ahora, ejecute esta orden:

# service ctld start

Al iniciarse, el demonio ctld(8) lee /etc/ctl.conf. Si se edita este fichero después de que se inicie el demonio, recargue los cambios para que tengan efecto inmediatamente:

# service ctld reload