<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>Carlitox en la Web</title><description>Un blog de Tecnología, Programación y Algo mas...</description><managingEditor>noreply@blogger.com (Carlos Martínez)</managingEditor><pubDate>Wed, 26 Mar 2025 15:14:00 -0400</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">361</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">3</openSearch:itemsPerPage><link>http://carlitoxenlaweb.blogspot.com/</link><language>en-us</language><item><title>Simple reproductor MP3 en Ionic</title><link>http://carlitoxenlaweb.blogspot.com/2019/05/simple-reproductor-mp3-en-ionic-con.html</link><pubDate>Fri, 3 May 2019 15:19:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8283392410523373579.post-4492573226123892208</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpGDOBUFNwB7YdKn2dIfDRucGyzeWlo-U1XpXLXwp3uqa6TRNJXVooFNyjlUsreEmhxk9Au7yxzsoHO_CaQiNL4PfwNGXS3CMEAcG8ZMt4sNYEKK5tTzOqhzCFFgUUTL6C1Tis2f9hhyphenhyphen7o/s1600/ionic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="422" data-original-width="750" height="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpGDOBUFNwB7YdKn2dIfDRucGyzeWlo-U1XpXLXwp3uqa6TRNJXVooFNyjlUsreEmhxk9Au7yxzsoHO_CaQiNL4PfwNGXS3CMEAcG8ZMt4sNYEKK5tTzOqhzCFFgUUTL6C1Tis2f9hhyphenhyphen7o/s320/ionic.jpg" width="0" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp;&amp;nbsp; Reproducir archivos MP3 no es tan difícil, en &lt;a href="https://ionicframework.com/"&gt;Ionic&lt;/a&gt; contamos con un &lt;a href="https://ionicframework.com/docs/native/media"&gt;plugin multimedia&lt;/a&gt; que nos facilita esta tarea, por eso crear un reproductor MP3 es cosa de unas simples líneas de código, lo primero es iniciar el proyecto:&lt;br /&gt;
&lt;pre class="brush:bash"&gt;# Iniciar con un proyecto en blanco
ionic start mp3-ionic blank

# Agregar la plataforma
ionic cordova platform add [android | ios | browser]

# Instalar el plugin multimedia
ionic cordova plugin add cordova-plugin-media
npm i --save @ionic-native/media&lt;/pre&gt;
&amp;nbsp;&amp;nbsp; No olvidemos agregar al plugin al core de nuestra app... Ahora vamos a nuestra ventana principal y creamos los métodos básicos:&lt;br /&gt;
&lt;pre class="brush:javascript"&gt;private index: number;

playMusic(i: number) {
  this.musicFile.play();
  this.index = i;
}

stopMusic() {
  this.musicFile.stop();
}

nextMusic() {
  this.playMusic(index + 1);
}

prevMusic() {
  this.playMusic(index - 1);
}&lt;/pre&gt;
&amp;nbsp;&amp;nbsp; Ya con esto solo nos resta crear la interfaz:&lt;br /&gt;
&lt;pre class="brush:html"&gt;&lt;ion-grid text-center&gt;
    &lt;ion-row&gt;
        &lt;ion-col&gt;
            &lt;ion-button fill="solid" shape="clear" color="dark" (click)="prevMusic()"&gt;
                &lt;ion-icon slot="icon-only" name="skip-backward"&gt;&lt;/ion-icon&gt;
            &lt;/ion-button&gt;
        &lt;/ion-col&gt;
        &lt;ion-col&gt;
            &lt;ion-button fill="solid" shape="clear" color="dark" (click)="playMusic()"&gt;
                &lt;ion-icon slot="icon-only" name="play"&gt;&lt;/ion-icon&gt;
            &lt;/ion-button&gt;
        &lt;/ion-col&gt;
        &lt;ion-col&gt;
            &lt;ion-button fill="solid" shape="clear" color="dark" (click)="stopMusic()"&gt;
                &lt;ion-icon slot="icon-only" name="square"&gt;&lt;/ion-icon&gt;
            &lt;/ion-button&gt;
        &lt;/ion-col&gt;
        &lt;ion-col&gt;
            &lt;ion-button fill="solid" shape="clear" color="dark" (click)="nextMusic()"&gt;
                &lt;ion-icon slot="icon-only" name="skip-forward"&gt;&lt;/ion-icon&gt;
            &lt;/ion-button&gt;
        &lt;/ion-col&gt;
    &lt;/ion-row&gt;
&lt;/ion-grid&gt;&lt;/pre&gt;
&amp;nbsp;&amp;nbsp; También podemos agregar una barra progresiva mientras se reproduce el audio, el código seria algo así:
&lt;pre class="brush:javascript"&gt;setInterval(function () {
  self.musicFile[self.playingIndex].getCurrentPosition().then((position) =&gt; {
    self.position = position;
  });
}, 1000);&lt;/pre&gt;
&amp;nbsp;&amp;nbsp; Si tienes dudas puedes ver el &lt;a href="https://github.com/carlitoxenlaweb/mp3-ionic/"&gt;código de ejemplo&lt;/a&gt; en mi &lt;a 
href="https://github.com/carlitoxenlaweb/"&gt;GitHub&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;Por favor, reserva el derecho de autor, no seas de esos que solo copia y pega sin agradecer a la fuente ni darle créditos.&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpGDOBUFNwB7YdKn2dIfDRucGyzeWlo-U1XpXLXwp3uqa6TRNJXVooFNyjlUsreEmhxk9Au7yxzsoHO_CaQiNL4PfwNGXS3CMEAcG8ZMt4sNYEKK5tTzOqhzCFFgUUTL6C1Tis2f9hhyphenhyphen7o/s72-c/ionic.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>noreply@blogger.com (Carlitox en la web)</author></item><item><title>CORS y Apache como Reverse Proxy</title><link>http://carlitoxenlaweb.blogspot.com/2019/03/cors-y-apache-como-reverse-proxy.html</link><category>Servidores</category><pubDate>Wed, 27 Mar 2019 10:50:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8283392410523373579.post-4593586835450228101</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-p6MaF-zMZ4OnTrMAAfOj9D4Xqef01qSSCI3tI_II-MrHH91PplgAwuGRyKJgtIYbL4EY3mgaMrVUIJ7rTdkGCjLlGoxnhQdBWgLYQrshHNIUZeeXrTJY5Ppw6YpgqI3svL9ucuwGgMZR/s1600/centos_cors1.png" imageanchor="1" &gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-p6MaF-zMZ4OnTrMAAfOj9D4Xqef01qSSCI3tI_II-MrHH91PplgAwuGRyKJgtIYbL4EY3mgaMrVUIJ7rTdkGCjLlGoxnhQdBWgLYQrshHNIUZeeXrTJY5Ppw6YpgqI3svL9ucuwGgMZR/s200/centos_cors1.png" width="0" height="0" data-original-width="0" data-original-height="0" /&gt;&lt;/a&gt;
&amp;nbsp;&amp;nbsp; Hace algún tiempo vengo usando &lt;a href="https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/"&gt;Nginx como Reverse Proxy&lt;/a&gt;, sin embargo me dio curiosidad hacer lo mismo con &lt;a href="https://httpd.apache.org/docs/trunk/es/howto/reverse_proxy.html"&gt;Apache2&lt;/a&gt; y no fue tan &lt;b&gt;complicado&lt;/b&gt;, ¿o si?. Bien, lo primero es habilitar los módulos (he colocado todos estos a modo de prueba):&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
a2enmod proxy proxy_http proxy_ajp rewrite deflate headers proxy_balancer proxy_connect proxy_html&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Luego crear el vhost (recalco que estoy utilizando SSL de &lt;a href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt;):&lt;br /&gt;
&lt;pre class="brush:html"&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName misitio.com
    ServerAlias www.misitio.com
    Redirect / https://misitio.com/
&amp;lt;/VirtualHost&amp;gt;

&amp;lt;VirtualHost *:443&amp;gt;
    SSLEngine On
    SSLProxyEngine On

    SSLCertificateFile /etc/letsencrypt/live/misitio.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/misitio.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/misitio.com/chain.pem

    ServerName misitio.com
    ServerAlias www.misitio.com

    ErrorLog ${APACHE_LOG_DIR}/misitio-error.log
    CustomLog ${APACHE_LOG_DIR}/misitio-access.log combined
&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Ahora solo debemos agregar las líneas necesarias para el proxy:&lt;br /&gt;
&lt;pre class="brush:html"&gt;ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; ¿No ha sido dificil verdad?, pero espera, probando me encuentro con un error particular: &lt;b&gt;Cross-Origin Request Blocked&lt;/b&gt;... De acuerdo, este error es común, solo debemos agregar las cabeceras:&lt;br /&gt;
&lt;pre class="brush:html"&gt;Header add Access-Control-Max-Age "1000"
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header add Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Probando de nuevo llegamos al punto de otro error: &lt;b&gt;Method not Allowed&lt;/b&gt;. En este punto es cuando nos topamos con un tema curioso, &lt;a href="https://stackoverflow.com/questions/25709175/handling-cors-preflight-request-in-apache"&gt;preflight&lt;/a&gt;. Entonces es cuando debemos modificar las cabeceras para que siempre estén los valores:&lt;br /&gt;
&lt;pre class="brush:html"&gt;Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Probamos y..... &lt;b&gt;Error&lt;/b&gt;. Las peticiones GET procesan pero el POST es otro asunto, en este punto es cuando el dichoso "preflight" nos da dolores de cabeza, entonces debemos colocar una condición para este tipo de petidiones:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{REQUEST_METHOD} OPTIONS &lt;br /&gt;
RewriteRule ^(.*)$ $1 [R=200,L]&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Volviendo a probar, resultado: &lt;span style="color: red;"&gt;&lt;b&gt;Error!&lt;/b&gt;&lt;/span&gt;. Pero ¿porque?, respuesta simple (gracias a &lt;a href="https://stackoverflow.com/questions/38053741/httpd-duplicate-access-control-allow-origin-with-header-always-set"&gt;user5994461&lt;/a&gt;):&lt;br /&gt;
&lt;pre class="brush:plain"&gt;
Es un error en Apache. Un fallo en el diseño interno y un fallo en documentarlo. Hay al menos dos tablas de cookies en apache:&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; onsuccess: por defecto, usado para códigos de estado 20X.&lt;br /&gt;
&amp;nbsp; always: usado para errores, incluyendo códigos de redirecciones.&lt;br /&gt;&lt;br /&gt;
Las tablas tienen diferentes significados dependiendo de qué módulos están en uso. Por ejemplo, cuando se utiliza proxy o CGI, la tabla relevante para las cookies es "onsuccess" si el servidor entrega un error con éxito, pero "always" si ocurre un error interno de apache.&lt;br /&gt;&lt;br /&gt;
Este comportamiento no está documentado. Eso no parece intencional sino una consecuencia del propio apache. En el estado actual, es básicamente imposible manipular correctamente los encabezados con Apache.&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Una vez visto esto solo queda una solución posible, eliminar las cabeceras y volverlas a setear justo antes de finalizar la petición:&lt;br /&gt;
&lt;pre class="brush:html"&gt;Header onsuccess unset Access-Control-Allow-Origin
Header onsuccess unset Access-Control-Allow-Methods
Header onsuccess unset Access-Control-Allow-Headers&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Por lo que nuestro "&lt;b&gt;conf&lt;/b&gt;" quedaría de la siguiente forma:&lt;br /&gt;
&lt;pre class="brush:html"&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName misition.com
    ServerAlias www.misitio.com
    Redirect / https://misitio.com/
&amp;lt;/VirtualHost&amp;gt;

&amp;lt;VirtualHost *:443&amp;gt;
    SSLEngine On
    SSLProxyEngine On

    SSLCertificateFile /etc/letsencrypt/live/misitio.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/misitio.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/misitio.com/chain.pem

    ProxyPreserveHost On
    ProxyRequests off

    &amp;lt;proxy *&amp;gt;
        Order deny,allow
        Allow from all
    &amp;lt;/proxy&amp;gt;

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    Header onsuccess unset Access-Control-Allow-Origin
    Header onsuccess unset Access-Control-Allow-Methods
    Header onsuccess unset Access-Control-Allow-Headers

    Header always set Access-Control-Max-Age &amp;quot;1000&amp;quot;
    Header always set Access-Control-Allow-Origin &amp;quot;*&amp;quot;
    Header always set Access-Control-Allow-Headers &amp;quot;X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding&amp;quot;
    Header always set Access-Control-Allow-Methods &amp;quot;POST, GET, OPTIONS, DELETE, PUT&amp;quot;

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} OPTIONS
    RewriteRule ^(.*)$ $1 [R=200,L]

    ServerName misitio.com
    ServerAlias www.misitio.com

    ErrorLog ${APACHE_LOG_DIR}/misitio-error.log
    CustomLog ${APACHE_LOG_DIR}/misitio-access.log combined
&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Si con todo esto no solucionamos entonces lo mas recomendable es migrar a Nginx, muchas horas depurando y con resultados que no son los esperados. Fuentes:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="https://httpd.apache.org/docs/trunk/es/howto/reverse_proxy.html"&gt;Apache2&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/38053741/httpd-duplicate-access-control-allow-origin-with-header-always-set"&gt;StackOverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing-everything-through/"&gt;Benjamin Horn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://awesometoast.com/cors/"&gt;Awesome Toast&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;Por favor, reserva el derecho de autor, no seas de esos que solo copia y pega sin agradecer a la fuente ni darle créditos.&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-p6MaF-zMZ4OnTrMAAfOj9D4Xqef01qSSCI3tI_II-MrHH91PplgAwuGRyKJgtIYbL4EY3mgaMrVUIJ7rTdkGCjLlGoxnhQdBWgLYQrshHNIUZeeXrTJY5Ppw6YpgqI3svL9ucuwGgMZR/s72-c/centos_cors1.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><author>noreply@blogger.com (Carlitox en la web)</author></item><item><title>Proxmox Passthrough</title><link>http://carlitoxenlaweb.blogspot.com/2019/02/proxmox-passthrough.html</link><category>Linux</category><category>Servidores</category><category>Tecnologia</category><pubDate>Mon, 4 Feb 2019 11:43:00 -0400</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-8283392410523373579.post-5319692233841646569</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Importante:&lt;/b&gt; en la versión 5.3 todo esto se simplifica en unos cuantos clicks: &lt;a href="https://www.proxmox.com/en/training/video-tutorials/item/what-s-new-in-proxmox-ve-5-3"&gt;PCI passthrough and vGPU (e.g. Intel KVMGT) via GUI&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; La virtualización hoy en día es indispensable en la mayoría (por no decir todas) las empresas de TI o que alojan un sistema propio, una de las principales ventajas es la de correr múltiples máquinas virtuales y contenedores dentro de un mismo equipo. No es simplemente virtualizar un SO como &lt;a href="https://www.vmware.com/latam/products/workstation-pro.html"&gt;VMWare Workstation&lt;/a&gt; o &lt;a href="https://www.virtualbox.org/"&gt;VirtualBox&lt;/a&gt;, es utilizar todo un sistema dedicado a la virtualización y aunque pudiéramos utilizar &lt;a href="https://www.debian.org/index.es.html"&gt;debian&lt;/a&gt; con &lt;a href="https://docs.docker.com/install/linux/docker-ce/debian/"&gt;docker&lt;/a&gt;, ya existen soluciones especializadas a esto, las más famosas son:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;a href="https://www.vmware.com/latam/products/vsphere.html"&gt;VMWare vSphere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/about/"&gt;Microsoft Hyper-V&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lac.citrix.com/products/citrix-hypervisor/"&gt;Citrix Hypervisor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xenserver.org/"&gt;XenServer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.proxmox.com/en/"&gt;Proxmox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; De todas estas soluciones mi favorita es &lt;b&gt;Proxmox&lt;/b&gt;, ya que no es solo una distro basada en debian con &lt;a href="https://www.linux-kvm.org/page/Main_Page"&gt;KVM&lt;/a&gt;, sino que extienden la funcionalidad para facilitar la configuración y muchas otras cosas como VLAN y VirtIO... Aunque esto no es programación como tal es interesante la idea de 
utilizar un entorno virtualizado con acceso a dispositivos de forma 
física o incluso 1 PC para múltiples usuarios de forma independiente.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; La razón de esta entrada es porque actualmente me veo en la necesidad de utilizar una tarjeta gráfica para un software en concreto corriendo de forma simultanea debian y otros contenedores para múltiples pruebas, por lo que esto &lt;b&gt;te puede servir si&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Necesitas máquinas virtuales que interactúen de forma directa con el Hardware&lt;/li&gt;
&lt;li&gt;Requieres de un sistema completo que funcione de forma independiente al principal&lt;/li&gt;
&lt;li&gt;Quieres tener un sistema operativo para juegos sin tener un &lt;a href="https://answers.microsoft.com/en-us/windows/forum/windows_10-windows_install-winpc/how-to-dual-boot-windows-10-with-other-versions-of/9695dfc7-1c13-4d8d-b10b-587e78c6ac36"&gt;Dual Boot&lt;/a&gt; (si, aunque no es el caso sabemos que muchos lo hacen con este fin)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;b&gt;No es necesario si&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Utilizas contenedores simples&lt;/li&gt;
&lt;li&gt;Tus máquinas virtuales no necesitan acceso a una tarjeta PCI o Hardware específico&lt;/li&gt;
&lt;li&gt;No necesitas ningún tipo de aceleración gráfica por parte de la GPU&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Sabiendo esto, lo primero que debemos saber es que pasar directamente los periféricos USB en proxmox es cosa sencilla, la misma interfaz nos permite realizar esto:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAY41JJVh6xs0Wbw5FMCXWCAWX6K3NgFyNgV7Jnrk354GnKYgepnIQi5kxTdKC_o4_OqZwV3DReyxlG3Wj1CUqGaR7RVlDMsgDdFdzHesEKWJEygVdmF334wJXjrN8CoG3tXX4CxKU8wqL/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="114" data-original-width="362" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAY41JJVh6xs0Wbw5FMCXWCAWX6K3NgFyNgV7Jnrk354GnKYgepnIQi5kxTdKC_o4_OqZwV3DReyxlG3Wj1CUqGaR7RVlDMsgDdFdzHesEKWJEygVdmF334wJXjrN8CoG3tXX4CxKU8wqL/s320/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Ahora, si queremos hacer lo mismo con una tarjeta PCI debemos seguir los pasos indicados aquí: &lt;a href="https://pve.proxmox.com/wiki/Pci_passthrough#GPU_OVMF_PCI_PASSTHROUGH_.28recommended.29"&gt;PCI Passthrough&lt;/a&gt;. Sin embargo, no es tan simple como se lee, así que vamos a los pasos.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Lo primero es tener un hardware compatible, normalmente todos los Xeon y procesadores de gama alta de &lt;a href="https://software.intel.com/en-us/blogs/2009/03/02/intels-virtualization-for-directed-io-aka-iommu-part-1"&gt;Intel&lt;/a&gt; son compatibles, en el caso de AMD no todos lo hacen de forma correcta, por lo que aconsejo &lt;a href="https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware"&gt;revisar la compatibilidad&lt;/a&gt; antes de continuar.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Una vez seguros de que nuestro hardware funcionará sin problemas, vamos a configurar el BIOS, debemos habilitar en nuestra tarjeta madre (MOBO) las opciones de virtualización (VT-d/VT-x en Intel y AMD-V en AMD), luego creamos nuestra máquina, pero aquí es donde viene el detalle que la documentación no explica...&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Si vamos a utilizar una &lt;b&gt;PCI de forma básica&lt;/b&gt; (audio, red, serial, paralelo, etc) podemos utilizar &lt;b&gt;SeaBIOS&lt;/b&gt; (legacy), sin embargo, esto se nos complica al utilizar una tarjeta &lt;span style="color: red;"&gt;&lt;b&gt;PCIe&lt;/b&gt;&lt;/span&gt; y sobre todo con las tarjetas de video, es por eso que en estos casos utilizaremos &lt;b&gt;&lt;span style="color: red;"&gt;OVMF&lt;/span&gt;&lt;/b&gt; (UEFI) y la controladora de discos &lt;span style="color: red;"&gt;&lt;b&gt;SCSI&lt;/b&gt;&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl2HTL9oktVtNQinQ0k3t0-7cPk62Jf8VEpAmI8JiPTrewdXRDXdXOsh4cPlu_h8Upu6__SyNUOjmrpdlpgICEeHNRDn8KxsslGM2U-KyxqgAMhM2C6hRKS6WnopDVjWFhPFvDh1Za_NrL/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="402" data-original-width="539" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl2HTL9oktVtNQinQ0k3t0-7cPk62Jf8VEpAmI8JiPTrewdXRDXdXOsh4cPlu_h8Upu6__SyNUOjmrpdlpgICEeHNRDn8KxsslGM2U-KyxqgAMhM2C6hRKS6WnopDVjWFhPFvDh1Za_NrL/s320/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25281%2529.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;b&gt; De aquí en adelante&lt;/b&gt; los pasos son básicos para cualquier SO, sin embargo me enfocaré en &lt;b&gt;Windows&lt;/b&gt; (específicamente &lt;b&gt;10&lt;/b&gt;) ya que es el más utilizado en estos casos, utilizando un &lt;b&gt;procesador Intel&lt;/b&gt;. Para continuar con la creación, necesitamos enfocarnos en los drivers VirtIO para Windows, por lo que vamos a la web de &lt;a href="https://getfedora.org/"&gt;Fedora&lt;/a&gt; para descargarlos: &lt;a href="https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html"&gt;Windows VirtIO Drivers&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Buscamos el ISO (Stable virtio-win iso), una vez descargados nos aseguramos de montarlo en un disco virtual aparte:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-944joot_jWflM_Ne-Zsapec6wPvxePDK2XSh5PQpdvc_rlKAemM_nNw7XHKt5EAZ1GFPUJkGAx-9vnt_9A9SRYdE7OTamNHG2YepKpXx7kO2-LQKHE2_PwZYwCzqObL_AXSYtIbUwjLM/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25282%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="131" data-original-width="697" height="60" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-944joot_jWflM_Ne-Zsapec6wPvxePDK2XSh5PQpdvc_rlKAemM_nNw7XHKt5EAZ1GFPUJkGAx-9vnt_9A9SRYdE7OTamNHG2YepKpXx7kO2-LQKHE2_PwZYwCzqObL_AXSYtIbUwjLM/s320/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25282%2529.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Pudiéramos utilizar también el &lt;b&gt;driver de red (paravirtualized)&lt;/b&gt; pero esta demostrado que en las ediciones de Windows que no sean Server tienden a tener &lt;b&gt;problemas de rendimiento&lt;/b&gt;, por lo que utilizar E1000 vendrá bien.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Al momento de llegar a la selección de discos veremos que no aparece en el listado, es porque Windows no posee estos drivers VirtIO, por lo que vamos a cargar controladores extra (abajo a la izquierda) y seleccionamos el que sea adecuado para nuestra versión dentro de la &lt;b&gt;carpeta "stor"&lt;/b&gt; (Win10 x86/x64). Una vez cargados podremos seleccionar el disco y continuar la instalación.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Ahora apagamos la máquina y nos &lt;b&gt;vamos al shell&lt;/b&gt; de nuestro nodo proxmox a modificar el GRUB para darle soporte a nuestra tarjeta PCI / PCIe:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
nano /etc/default/grub&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Dentro agregamos buscamos la línea &lt;b&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/b&gt; y la modificamos de la siguiente forma:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=10 quiet intel_iommu=on kvm=off video=efifb:off"&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Actualizamos el GRUB:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
update-grub&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Ahora reiniciamos y verificamos que todo ha salido bien con el comando &lt;b&gt;dmesg | grep -e DMAR -e IOMMU&lt;/b&gt;, si no vemos salida entonces puede que el procesador no soporte iommu o que no este habilitada la opción VT-d en el BIOS.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Lo siguiente es ubicar la dirección física (a nivel lógico) de nuestra tarjeta, por lo que un simple &lt;b&gt;lspci&lt;/b&gt; bastará, una vez hecho esto debemos ver una salida como la siguiente:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4isWZ8Ro-BEL51lgQOMrIyLwabfxtUQ9UJlUXhhqO4cq3jzqUYg7WUD5FBLqnTLypYgRlz46ZExRPxCHIeiT_FBp_NOlGDwpFWctUvrCRhy352Y3UXdR2v1rIB7NcrARYwQ9fGV8lMMvT/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25284%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="328" data-original-width="892" height="117" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4isWZ8Ro-BEL51lgQOMrIyLwabfxtUQ9UJlUXhhqO4cq3jzqUYg7WUD5FBLqnTLypYgRlz46ZExRPxCHIeiT_FBp_NOlGDwpFWctUvrCRhy352Y3UXdR2v1rIB7NcrARYwQ9fGV8lMMvT/s320/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25284%2529.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&amp;nbsp;&amp;nbsp; En mi caso la tarjeta esta ubicada en el slot 1, por lo que los dispositivos de destino son el 01:00.0 (Video) y el 01:00.1 (Audio HDMI). Hasta este punto basta con agregar el dispositivo a la conf de la máquina virtual (&lt;b&gt;/etc/pve/qemu-server/vmid.conf&lt;/b&gt;) y tendremos nuestra tarjeta funcionando:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
hostpci0: 01:00&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Pero esto no nos funcionará si queremos usar nuestra tarjeta de video con aceleración 3D, ya que necesitaremos un par de configuraciones más, por lo que vamos a ubicar el VendorID de nuestra tarjeta con el comando &lt;b&gt;lspci -n -s 01:00&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTIkza8t3HijOtVrm-e9Lov96dJ_lONru3KuEai0DN-PJbqOsdd5uEVXJjMeMEMc27jG6e4gJFs24am6wARkunDdT_Wrc4OZOWIoWe6NI9Bugh4EfPZksLRk73lQQL6WaR4k0l3PddTDM5/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25285%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="60" data-original-width="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTIkza8t3HijOtVrm-e9Lov96dJ_lONru3KuEai0DN-PJbqOsdd5uEVXJjMeMEMc27jG6e4gJFs24am6wARkunDdT_Wrc4OZOWIoWe6NI9Bugh4EfPZksLRk73lQQL6WaR4k0l3PddTDM5/s1600/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment%25285%2529.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Ya que hemos ubicado todo lo necesario comencemos por agregar nuestro Vendor en los módulos y agregar a la lista negra del sistema principal los drivers, esto con el fin de que el sistema principal no utilice la tarjeta de video de modo que sea dedicada a la VM:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
echo "options vfio-pci ids=10de:128b,10de:0e0f&amp;nbsp; disable_vga=1" &amp;gt; /etc/modprobe.d/vfio.conf&lt;br /&gt;
echo "blacklist radeon" &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf &lt;br /&gt;
echo "blacklist nouveau" &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf &lt;br /&gt;
echo "blacklist nvidia" &amp;gt;&amp;gt; /etc/modprobe.d/blacklist.conf&amp;nbsp;&amp;nbsp;&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Mucha atención con los IDs, deben ser los de nuestra tarjeta y ningún otro. Ahora si vamos a editar la conf de la VM de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Lo que hicimos es agregar nuestros dispositivos (&lt;b&gt;hostpciX&lt;/b&gt;) a la lista, también especificamos el tipo de máquina a &lt;a href="https://wiki.qemu.org/Features/Q35"&gt;Q35 para utilizar el chipset ICH9&lt;/a&gt;. Ya con esto solo nos resta asignar un teclado y mouse a nuestra VM como explicamos al inicio de la entrada, conectamos una salida a la VGA y ya podremos ver nuestro SO utilizando la VGA sin problemas, pero &lt;b&gt;aún no terminamos&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; En este punto es cuando pueden salir mal las cosas, lo primero es utilizar &lt;a href="https://www.techpowerup.com/gpuz/"&gt;GPU-z&lt;/a&gt; o &lt;a href="https://support.microsoft.com/es-py/help/4028644/windows-open-and-run-dxdiagexe"&gt;dxdiag&lt;/a&gt; para ver si la info de nuestra tarjeta esta bien, si no vemos nVidia o AMD en el fabricante junto con los valores correctos debemos volcar una ROM, para ello vamos nuevamente al shell de nuestro nodo y ejecutamos lo siguiente:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
cd /sys/bus/pci/devices/0000:01:00.0/&lt;br /&gt;
echo 1 &amp;gt; rom&lt;br /&gt;
cat rom &amp;gt; /tmp/image.rom&lt;br /&gt;
echo 0 &amp;gt; rom&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Recordando que 01:00.0 es mi tarjeta de video, ahora reiniciamos y volvemos a comprobar, si el problema persiste probemos lo siguiente:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
echo "options kvm ignore_msrs=1" &amp;gt; /etc/modprobe.d/kvm.conf&lt;/blockquote&gt;
&amp;nbsp;&amp;nbsp; Ya con esto no deberíamos tener problemas de configuración, una vez confirmado que todo esta bien entonces instalamos el driver de video y listo. Ya podemos disfrutar de una máquina virtual corriendo una aceleración completa por parte del GPU y con audio HDMI sin problemas.&lt;br /&gt;
&lt;script&gt;insertar_YouTube("XXXXXXXXXXX");&lt;/script&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;Por favor, reserva el derecho de autor, no seas de esos que solo copia y pega sin agradecer a la fuente ni darle créditos.&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAY41JJVh6xs0Wbw5FMCXWCAWX6K3NgFyNgV7Jnrk354GnKYgepnIQi5kxTdKC_o4_OqZwV3DReyxlG3Wj1CUqGaR7RVlDMsgDdFdzHesEKWJEygVdmF334wJXjrN8CoG3tXX4CxKU8wqL/s72-c/Screenshot-2019-2-4+pvea+-+Proxmox+Virtual+Environment.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><author>noreply@blogger.com (Carlitox en la web)</author></item></channel></rss>