Categoría: Uncategorized

  • Laboratorio DOSBox — Montaje, configuración y pruebas

    Laboratorio DOSBox — Montaje, configuración y pruebas

    1. Introducción

    En este proyecto vamos a montar un pequeño laboratorio retro usando DOSBox, una herramienta que nos permite ejecutar programas y juegos antiguos de MS-DOS en ordenadores modernos.

    El objetivo no es solamente “abrir un juego antiguo”, sino aprender cómo funcionaba un entorno DOS:

    • Unidades como C: o D:.
    • Carpetas y rutas.
    • Archivos ejecutables .EXE, .COM y .BAT.
    • Montaje de carpetas como discos duros.
    • Montaje de imágenes ISO como CD-ROM.
    • Configuración del teclado.
    • Configuración del sonido.
    • Ajustes de velocidad.
    • Automatización con la sección [autoexec].
    • Uso y modificación del archivo dosbox.conf.

    La práctica está planteada como una misión técnica. Cada alumno deberá preparar su propio entorno, probar programas, documentar los comandos utilizados y entregar evidencias.


    Parte 1 — Preparación del laboratorio

    2. Crear la carpeta principal de trabajo

    Antes de abrir DOSBox vamos a crear una carpeta en nuestro ordenador. Esta carpeta será nuestro “disco duro virtual” dentro de DOSBox.


    3. Estructura recomendada en Windows

    Crea la siguiente carpeta:

    C:\DOSLAB

    Dentro de ella crea estas subcarpetas:

    C:\DOSLAB\JUEGOS
    C:\DOSLAB\PROGRAMAS
    C:\DOSLAB\ISOS
    C:\DOSLAB\UTILIDADES
    C:\DOSLAB\CAPTURAS
    C:\DOSLAB\CONFIG

    También puedes crear las carpetas desde PowerShell:

    mkdir C:\DOSLAB
    mkdir C:\DOSLAB\JUEGOS
    mkdir C:\DOSLAB\PROGRAMAS
    mkdir C:\DOSLAB\ISOS
    mkdir C:\DOSLAB\UTILIDADES
    mkdir C:\DOSLAB\CAPTURAS
    mkdir C:\DOSLAB\CONFIG

    4. Estructura recomendada en Linux

    En Linux crea la estructura con estos comandos:

    mkdir -p ~/DOSLAB/JUEGOS
    mkdir -p ~/DOSLAB/PROGRAMAS
    mkdir -p ~/DOSLAB/ISOS
    mkdir -p ~/DOSLAB/UTILIDADES
    mkdir -p ~/DOSLAB/CAPTURAS
    mkdir -p ~/DOSLAB/CONFIG

    5. Estructura recomendada en macOS

    En macOS puedes usar la misma estructura que en Linux:

    mkdir -p ~/DOSLAB/JUEGOS
    mkdir -p ~/DOSLAB/PROGRAMAS
    mkdir -p ~/DOSLAB/ISOS
    mkdir -p ~/DOSLAB/UTILIDADES
    mkdir -p ~/DOSLAB/CAPTURAS
    mkdir -p ~/DOSLAB/CONFIG

    6. Qué guardaremos en cada carpeta

    CarpetaUso
    JUEGOSJuegos antiguos de MS-DOS
    PROGRAMASAplicaciones DOS, editores, herramientas, demos
    ISOSImágenes de CD-ROM en formato .iso
    UTILIDADESHerramientas auxiliares para DOS
    CAPTURASCapturas de pantalla del proyecto
    CONFIGArchivos de configuración personalizados

    Parte 2 — Primer arranque de DOSBox

    7. Abrir DOSBox

    Al abrir DOSBox aparecerá una ventana con un prompt parecido a este:

    Z:\>

    La unidad Z: es una unidad interna de DOSBox. No es nuestro disco duro real.

    Desde aquí todavía no podemos acceder a nuestra carpeta DOSLAB. Primero debemos montarla.


    Parte 3 — Montar carpetas como unidades

    8. Qué significa montar una carpeta

    Montar una carpeta significa decirle a DOSBox:

    “Esta carpeta de mi ordenador moderno quiero que se comporte como si fuera un disco duro dentro de DOSBox”.

    Por ejemplo, podemos hacer que:

    C:\DOSLAB

    se vea dentro de DOSBox como:

    C:

    9. Montar carpeta en Windows

    Si has creado la carpeta en:

    C:\DOSLAB

    dentro de DOSBox escribe:

    mount c c:\doslab

    Después cambia a la unidad C:

    c:

    Ahora deberías ver:

    C:\>

    Comprueba el contenido con:

    dir

    Si la carpeta está en:


    10. Montar carpeta en Linux

    ~/DOSLAB

    dentro de DOSBox escribe:

    mount c ~/DOSLAB

    Después cambia a la unidad C:

    c:

    Y comprueba:

    dir

    11. Montar carpeta en macOS

    En macOS, si la carpeta está en:

    ~/DOSLAB

    dentro de DOSBox escribe:

    mount c ~/DOSLAB

    Después:

    c:
    dir

    12. Montar una carpeta con espacios en la ruta

    Si la carpeta tiene espacios, hay que usar comillas.

    Ejemplo en Windows:

    mount c "c:\mis juegos dos"

    Ejemplo en Linux/macOS:

    mount c "~/Mis Juegos DOS"

    Aunque es posible hacerlo, para evitar problemas se recomienda usar nombres sin espacios:

    DOSLAB
    JUEGOS
    PROGRAMAS
    ISOS

    13. Desmontar una unidad

    Si queremos desmontar la unidad C:, usamos:

    mount -u c

    Después, si intentamos cambiar a C:, ya no estará disponible.


    14. Ver unidades montadas

    Para ver información sobre los montajes activos:

    mount

    15. Actividad 1 — Montaje básico

    Realiza los siguientes pasos:

    1. Abre DOSBox.
    2. Monta tu carpeta DOSLAB como unidad C:.
    3. Cambia a la unidad C:.
    4. Muestra el contenido.
    5. Crea una carpeta desde DOSBox.
    6. Comprueba desde tu sistema operativo real que la carpeta se ha creado.

    Comandos para Windows

    mount c c:\doslab
    c:
    dir
    md PRUEBA
    dir

    Comandos para Linux/macOS

    mount c ~/DOSLAB
    c:
    dir
    md PRUEBA
    dir

    Preguntas

    1. ¿Qué comando has usado para montar la unidad?
    2. ¿Qué carpeta real representa la unidad C:?
    3. ¿Qué ocurre si creas una carpeta dentro de DOSBox?
    4. ¿Puedes verla desde Windows, Linux o macOS?
    5. ¿Qué ventaja tiene este sistema?

    Parte 4 — Comandos básicos de MS-DOS

    16. Comandos de navegación

    Ver contenido

    dir

    Cambiar de carpeta

    cd NOMBRECARPETA

    Volver a la carpeta anterior

    cd ..

    Ir a la raíz de la unidad

    cd \

    Cambiar de unidad

    c:
    d:
    z:

    17. Comandos para crear y borrar carpetas

    Crear una carpeta

    md NOMBRE

    Ejemplo:

    md JUEGO1

    Borrar una carpeta vacía

    rd NOMBRE

    Ejemplo:

    rd JUEGO1

    18. Comandos para trabajar con archivos

    Copiar archivos

    copy archivo.txt copia.txt

    Copiar todos los archivos de una carpeta

    copy *.* destino

    Borrar un archivo

    del archivo.txt

    Ver el contenido de un archivo de texto

    type archivo.txt

    Renombrar archivo

    ren viejo.txt nuevo.txt

    19. Buscar ejecutables

    Los programas DOS suelen ejecutarse con archivos:

    .EXE
    .COM
    .BAT

    Para buscarlos:

    dir *.exe
    dir *.com
    dir *.bat

    20. Actividad 2 — Explorador DOS

    Dentro de DOSBox realiza:

    c:
    md MISION2
    cd MISION2
    md DATOS
    md PRUEBAS
    dir
    cd DATOS
    copy con nota.txt

    Escribe un pequeño texto, por ejemplo:

    Laboratorio DOSBox iniciado correctamente.

    Para terminar la escritura pulsa:

    Ctrl + Z
    Enter

    Ahora comprueba el archivo:

    dir
    type nota.txt

    Vuelve atrás:

    cd ..
    dir

    Preguntas

    1. ¿Qué hace el comando md?
    2. ¿Qué hace el comando cd?
    3. ¿Qué hace dir?
    4. ¿Qué extensión tiene el archivo creado?
    5. ¿Qué comando permite ver el contenido del archivo?

    Parte 5 — Ejecutar programas y juegos DOS

    21. Copiar un juego a la carpeta del laboratorio

    Supongamos que tienes un juego llamado JUEGO1.

    Copia la carpeta del juego dentro de:

    DOSLAB\JUEGOS

    Debería quedar así:

    DOSLAB
    └── JUEGOS
        └── JUEGO1
            ├── JUEGO.EXE
            ├── SETUP.EXE
            ├── README.TXT
            └── DATA

    22. Entrar en la carpeta del juego

    Dentro de DOSBox:

    c:
    cd JUEGOS
    cd JUEGO1
    dir

    23. Localizar el archivo de arranque

    Busca ejecutables:

    dir *.exe
    dir *.bat
    dir *.com

    Archivos habituales:

    GAME.EXE
    PLAY.EXE
    START.EXE
    RUN.EXE
    INSTALL.EXE
    SETUP.EXE
    CONFIG.EXE
    SOUND.EXE

    24. Ejecutar el juego

    Si el archivo se llama JUEGO.EXE, puedes escribir:

    juego

    O también:

    juego.exe

    Si el archivo se llama START.BAT:

    start

    25. Actividad 3 — Primer programa ejecutado

    Realiza estos pasos:

    c:
    cd JUEGOS
    dir
    cd JUEGO1
    dir
    dir *.exe
    dir *.bat
    dir *.com

    Después ejecuta el archivo principal:

    juego

    O el nombre correspondiente en tu caso.

    Preguntas

    1. ¿Qué ejecutables has encontrado?
    2. ¿Cuál ha arrancado correctamente?
    3. ¿Había archivo README.TXT?
    4. ¿Había archivo SETUP.EXE?
    5. ¿El programa ha funcionado directamente o ha necesitado configuración?

    Parte 6 — Montar imágenes ISO como CD-ROM

    26. Qué es una imagen ISO

    Una imagen ISO es una copia de un CD-ROM guardada en un archivo.

    Muchos juegos antiguos necesitan que el CD esté insertado. En DOSBox podemos montar una ISO como si fuera una unidad de CD.

    Normalmente usaremos la unidad D: como CD-ROM.


    27. Preparar carpeta de ISOS

    Guarda tus imágenes ISO dentro de:

    Windows

    C:\DOSLAB\ISOS

    Linux/macOS

    ~/DOSLAB/ISOS

    Ejemplo:

    DOSLAB
    └── ISOS
        └── JUEGOCD.iso

    28. Montar una ISO en Windows

    Dentro de DOSBox:

    imgmount d c:\doslab\isos\juegocd.iso -t iso

    Después entra en la unidad D:

    d:
    dir

    29. Montar una ISO en Linux

    Dentro de DOSBox:

    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso

    Después:

    d:
    dir

    30. Montar una ISO en macOS

    Dentro de DOSBox:

    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso

    Después:

    d:
    dir

    31. Montar una carpeta como CD-ROM

    A veces no tenemos una ISO, sino una carpeta con el contenido de un CD.

    Podemos montarla como CD-ROM usando mount.

    Windows

    mount d c:\doslab\cdrom -t cdrom

    Linux/macOS

    mount d ~/DOSLAB/CDROM -t cdrom

    Después:

    d:
    dir

    32. Montar varias imágenes de CD

    Algunos juegos tienen varios CDs. En DOSBox se pueden montar varias imágenes en una misma unidad.

    Ejemplo:

    imgmount d c:\doslab\isos\cd1.iso c:\doslab\isos\cd2.iso -t iso

    Durante la ejecución, normalmente se puede cambiar de disco con:

    Ctrl + F4

    33. Actividad 4 — El CD-ROM virtual

    Realiza estos pasos:

    1. Guarda una ISO dentro de la carpeta ISOS.
    2. Monta tu carpeta DOSLAB como C:.
    3. Monta la ISO como D:.
    4. Entra en D:.
    5. Lista el contenido.
    6. Busca archivos de instalación.

    Comandos Windows

    mount c c:\doslab
    imgmount d c:\doslab\isos\juegocd.iso -t iso
    c:
    dir
    d:
    dir
    dir *.exe
    dir *.bat

    Comandos Linux/macOS

    mount c ~/DOSLAB
    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso
    c:
    dir
    d:
    dir
    dir *.exe
    dir *.bat

    Preguntas

    1. ¿Qué comando se usa para montar una carpeta?
    2. ¿Qué comando se usa para montar una ISO?
    3. ¿Qué unidad has usado como disco duro?
    4. ¿Qué unidad has usado como CD-ROM?
    5. ¿Qué archivos ejecutables había en el CD?

    Parte 7 — Instalar un juego desde CD a C:

    34. Instalación típica desde CD-ROM

    Muchos juegos antiguos se instalaban desde CD-ROM a disco duro.

    La estructura sería:

    • Unidad C: disco duro virtual.
    • Unidad D: CD-ROM virtual.

    Primero montamos C: y D:.

    Windows

    mount c c:\doslab
    imgmount d c:\doslab\isos\juegocd.iso -t iso

    Linux/macOS

    mount c ~/DOSLAB
    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso

    Entramos en D:

    d:
    dir

    Buscamos instalador:

    dir *.exe
    dir *.bat

    Ejecutamos el instalador:

    install

    O:

    setup

    35. Elegir ruta de instalación

    Cuando el instalador pregunte dónde instalar, usaremos una ruta dentro de C:.

    Ejemplo:

    C:\JUEGOS\JUEGOCD

    Si la carpeta no existe, muchos instaladores la crean automáticamente.

    Si no la crean, podemos crearla antes:

    c:
    cd JUEGOS
    md JUEGOCD

    36. Ejecutar después de instalar

    Una vez instalado:

    c:
    cd JUEGOS
    cd JUEGOCD
    dir
    dir *.exe
    dir *.bat

    Ejecutamos el archivo correspondiente:

    juego

    37. Actividad 5 — Instalación completa

    Realiza una instalación desde CD-ROM o ISO.

    Comandos orientativos

    mount c c:\doslab
    imgmount d c:\doslab\isos\juegocd.iso -t iso
    d:
    dir
    install

    Después:

    c:
    cd JUEGOS
    cd JUEGOCD
    dir
    juego

    Preguntas

    1. ¿Desde qué unidad has instalado?
    2. ¿En qué carpeta se ha instalado el programa?
    3. ¿Qué archivo ejecuta el programa instalado?
    4. ¿El programa sigue necesitando el CD montado?
    5. ¿Qué ocurre si ejecutas el juego sin montar la ISO?

    Parte 8 — Configurar teclado

    38. Problema habitual con el teclado

    Puede ocurrir que algunas teclas no coincidan, especialmente:

    :
    \
    /
    -
    _
    ñ

    Para configurar el teclado español podemos probar:

    keyb sp

    O:

    keyb es

    Dependiendo de la versión de DOSBox, puede funcionar una u otra.


    39. Probar caracteres importantes

    Escribe dentro de DOSBox:

    :
    \
    /
    -
    _

    Si no salen correctamente, prueba:

    keyb sp

    Después vuelve a probar.


    40. Añadir teclado al autoexec

    Para que el teclado se configure automáticamente, luego añadiremos esto al apartado [autoexec]:

    keyb sp

    O:

    keyb es

    41. Actividad 6 — Teclado español

    Realiza:

    keyb sp

    Prueba:

    cd \
    dir
    mount c c:\doslab

    Preguntas

    1. ¿Funcionan correctamente los dos puntos?
    2. ¿Funciona correctamente la barra invertida?
    3. ¿Has usado keyb sp o keyb es?
    4. ¿Qué problema puede causar tener mal configurado el teclado?

    Parte 9 — Configurar pantalla

    42. Cambiar entre ventana y pantalla completa

    Dentro de DOSBox:

    Alt + Enter

    Esto alterna entre:

    • Modo ventana.
    • Pantalla completa.

    43. Opciones importantes de pantalla en dosbox.conf

    El archivo de configuración contiene una sección parecida a esta:

    [sdl]
    fullscreen=false
    fulldouble=false
    fullresolution=desktop
    windowresolution=original
    output=surface
    autolock=true
    sensitivity=100
    waitonerror=true
    priority=higher,normal
    mapperfile=mapper.map
    usescancodes=true

    Algunas opciones útiles:

    Arrancar directamente a pantalla completa

    fullscreen=true

    Arrancar en ventana

    fullscreen=false

    Resolución en pantalla completa

    fullresolution=desktop

    Tamaño de ventana

    windowresolution=1280x960

    Sistema de salida gráfica

    output=surface

    En algunas versiones se pueden usar otras opciones:

    output=opengl
    output=overlay

    No todas las opciones funcionan igual en todos los sistemas.


    44. Configuración recomendada básica de pantalla

    Para empezar:

    [sdl]
    fullscreen=false
    fullresolution=desktop
    windowresolution=1280x960
    output=surface
    autolock=true
    sensitivity=100

    Si se quiere arrancar a pantalla completa:

    [sdl]
    fullscreen=true
    fullresolution=desktop
    windowresolution=original
    output=surface
    autolock=true
    sensitivity=100

    45. Actividad 7 — Ajuste de pantalla

    1. Abre el archivo dosbox.conf.
    2. Localiza la sección [sdl].
    3. Cambia fullscreen=false por fullscreen=true.
    4. Guarda el archivo.
    5. Abre DOSBox.
    6. Comprueba si arranca en pantalla completa.
    7. Vuelve a dejarlo en ventana si lo prefieres.

    Preguntas

    1. ¿Qué opción activa la pantalla completa?
    2. ¿Qué combinación de teclas permite cambiar manualmente?
    3. ¿Qué resolución te resulta más cómoda?
    4. ¿Se ve deformada la imagen?

    Parte 10 — Configurar velocidad y ciclos

    46. Qué son los ciclos

    Los ciclos controlan la velocidad de la CPU emulada.

    Si los ciclos son bajos, el programa irá lento.

    Si los ciclos son demasiado altos, algunos juegos antiguos pueden funcionar demasiado rápido o de forma inestable.


    47. Cambiar ciclos durante la ejecución

    Reducir ciclos

    Ctrl + F11

    Aumentar ciclos

    Ctrl + F12

    48. Opciones de ciclos en dosbox.conf

    Busca la sección [cpu].

    Ejemplo:

    [cpu]
    core=auto
    cputype=auto
    cycles=auto
    cycleup=10
    cycledown=20

    49. Configuración automática

    cycles=auto

    Es la opción más cómoda para empezar.


    50. Configuración fija

    Para usar un número fijo de ciclos:

    cycles=10000

    Ejemplos:

    cycles=3000
    cycles=8000
    cycles=12000
    cycles=20000

    51. Configuración máxima

    cycles=max

    Puede funcionar bien en algunos programas, pero en otros puede hacer que todo vaya demasiado rápido.


    52. Configuración recomendada

    Para empezar:

    [cpu]
    core=auto
    cputype=auto
    cycles=auto
    cycleup=10
    cycledown=20

    Para juegos muy antiguos:

    [cpu]
    core=auto
    cputype=auto
    cycles=3000
    cycleup=10
    cycledown=20

    Para juegos algo más modernos:

    [cpu]
    core=auto
    cputype=auto
    cycles=12000
    cycleup=10
    cycledown=20

    53. Actividad 8 — Controlando el tiempo

    1. Ejecuta un juego o programa.
    2. Pulsa varias veces Ctrl + F12.
    3. Observa si va más rápido.
    4. Pulsa varias veces Ctrl + F11.
    5. Observa si va más lento.
    6. Cambia cycles=auto por cycles=8000.
    7. Vuelve a probar.

    Preguntas

    1. ¿Qué ocurre al aumentar ciclos?
    2. ¿Qué ocurre al reducir ciclos?
    3. ¿Qué configuración te ha funcionado mejor?
    4. ¿Por qué algunos juegos antiguos son sensibles a la velocidad?

    Parte 11 — Configurar memoria

    54. Memoria emulada

    En la sección [dosbox] o similar puede aparecer una opción de memoria:

    memsize=16

    Esto indica la memoria RAM emulada en MB.

    Valores habituales:

    memsize=16
    memsize=32
    memsize=64

    Para la mayoría de juegos DOS, 16 MB suele ser suficiente. Para pruebas más avanzadas se puede usar 32 o 64 MB.


    55. Configuración recomendada

    [dosbox]
    memsize=16

    Para pruebas avanzadas:

    [dosbox]
    memsize=32

    56. Actividad 9 — Memoria

    1. Localiza la opción memsize.
    2. Anota su valor.
    3. Cambia el valor a 32.
    4. Guarda el archivo.
    5. Ejecuta un programa.
    6. Comprueba si notas algún cambio.

    Preguntas

    1. ¿Qué valor tenía inicialmente?
    2. ¿Qué valor has puesto?
    3. ¿Ha cambiado algo en el programa probado?
    4. ¿Crees que más memoria siempre mejora el funcionamiento?

    Parte 12 — Configurar sonido

    57. Sonido en DOSBox

    Muchos juegos antiguos permiten elegir tarjeta de sonido.

    Las más comunes son:

    • PC Speaker.
    • AdLib.
    • Sound Blaster.
    • Sound Blaster Pro.
    • Sound Blaster 16.
    • General MIDI.

    58. Buscar configuración de sonido en un juego

    Dentro de la carpeta del juego busca archivos como:

    dir setup.exe
    dir install.exe
    dir setsound.exe
    dir config.exe
    dir sound.exe

    O de forma general:

    dir *.exe

    Después prueba:

    setup

    O:

    install

    59. Valores típicos de Sound Blaster en DOSBox

    Muchos juegos funcionan con estos valores:

    Sound Blaster 16
    Port: 220
    IRQ: 7
    DMA: 1
    HDMA: 5

    También puedes encontrar:

    Port: 220
    IRQ: 5
    DMA: 1

    Si una opción no funciona, prueba la otra.


    60. Sección Sound Blaster en dosbox.conf

    Busca la sección [sblaster].

    Ejemplo:

    [sblaster]
    sbtype=sb16
    sbbase=220
    irq=7
    dma=1
    hdma=5
    mixer=true
    oplmode=auto
    oplemu=default
    oplrate=44100

    61. Configuración recomendada de sonido

    [sblaster]
    sbtype=sb16
    sbbase=220
    irq=7
    dma=1
    hdma=5
    mixer=true
    oplmode=auto
    oplemu=default
    oplrate=44100

    62. Actividad 10 — Configuración de sonido

    1. Entra en la carpeta de un juego.
    2. Busca el archivo de configuración.
    3. Ejecuta setup, install, config o similar.
    4. Selecciona Sound Blaster 16.
    5. Usa puerto 220.
    6. Usa IRQ 7.
    7. Usa DMA 1.
    8. Guarda la configuración.
    9. Ejecuta el juego.

    Preguntas

    1. ¿Qué archivo has usado para configurar el sonido?
    2. ¿Qué tarjeta de sonido has seleccionado?
    3. ¿Qué puerto has usado?
    4. ¿Qué IRQ has usado?
    5. ¿Qué DMA has usado?
    6. ¿Funcionan música y efectos?
    7. ¿Qué diferencia hay entre música y efectos de sonido?

    Parte 13 — Configurar ratón

    63. Capturar y liberar el ratón

    DOSBox puede capturar el ratón dentro de su ventana.

    Para capturar o liberar el ratón:

    Ctrl + F10

    64. Opción autolock

    En la sección [sdl] aparece:

    autolock=true

    Si está activado, DOSBox intenta capturar automáticamente el ratón cuando haces clic dentro de la ventana.


    65. Sensibilidad del ratón

    También puede aparecer:

    sensitivity=100

    Podemos modificarlo:

    sensitivity=80
    sensitivity=120
    sensitivity=150

    66. Configuración recomendada de ratón

    [sdl]
    autolock=true
    sensitivity=100

    67. Actividad 11 — Ratón

    1. Ejecuta un juego que use ratón.
    2. Haz clic dentro de la ventana.
    3. Prueba a capturar y liberar con Ctrl + F10.
    4. Cambia la sensibilidad a 120.
    5. Vuelve a probar.

    Preguntas

    1. ¿El juego reconoce el ratón?
    2. ¿Qué hace Ctrl + F10?
    3. ¿Qué valor de sensibilidad te resulta más cómodo?
    4. ¿Qué problema puede aparecer si el ratón queda capturado?

    Parte 14 — Archivo dosbox.conf

    68. Qué es dosbox.conf

    dosbox.conf es el archivo principal de configuración de DOSBox.

    En él podemos configurar:

    • Pantalla.
    • Sonido.
    • CPU.
    • Memoria.
    • Teclado.
    • Ratón.
    • Montaje automático de carpetas.
    • Comandos de arranque.
    • Opciones específicas del emulador.

    69. Crear un archivo de configuración

    Dentro de DOSBox podemos generar un archivo de configuración con:

    config -writeconf dosbox.conf

    Esto crea un archivo llamado dosbox.conf en la ubicación desde la que DOSBox pueda escribirlo.

    También podemos indicar una ruta concreta.

    Windows

    config -writeconf c:\doslab\config\dosbox.conf

    Linux/macOS

    config -writeconf ~/DOSLAB/CONFIG/dosbox.conf

    70. Abrir el archivo de configuración

    El archivo se puede abrir con un editor de texto.

    Windows

    Puedes usar Bloc de notas, Notepad++ o Visual Studio Code.

    Desde PowerShell:

    notepad C:\DOSLAB\CONFIG\dosbox.conf

    Con Visual Studio Code:

    code C:\DOSLAB\CONFIG\dosbox.conf

    Linux

    nano ~/DOSLAB/CONFIG/dosbox.conf

    O con Visual Studio Code:

    code ~/DOSLAB/CONFIG/dosbox.conf

    macOS

    nano ~/DOSLAB/CONFIG/dosbox.conf

    O:

    code ~/DOSLAB/CONFIG/dosbox.conf

    71. Secciones principales de dosbox.conf

    Las secciones más importantes suelen ser:

    [sdl]
    [dosbox]
    [render]
    [cpu]
    [mixer]
    [midi]
    [sblaster]
    [gus]
    [speaker]
    [joystick]
    [serial]
    [dos]
    [ipx]
    [autoexec]

    No siempre aparecerán exactamente igual en todas las versiones, pero la idea general es la misma.


    Parte 15 — La sección [autoexec]

    72. Qué es [autoexec]

    La sección [autoexec] permite ejecutar comandos automáticamente al arrancar DOSBox.

    Es una de las partes más útiles de la configuración.

    En vez de escribir siempre:

    mount c c:\doslab
    c:
    cd juegos
    dir

    podemos dejarlo preparado en el archivo de configuración.


    73. Autoexec básico para Windows

    Al final de dosbox.conf, busca:

    [autoexec]

    Añade:

    [autoexec]
    mount c c:\doslab
    c:
    cls
    echo Laboratorio DOSBox iniciado
    dir

    74. Autoexec básico para Linux/macOS

    [autoexec]
    mount c ~/DOSLAB
    c:
    cls
    echo Laboratorio DOSBox iniciado
    dir

    75. Autoexec con teclado español

    Windows

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cls
    echo Laboratorio DOSBox iniciado
    dir

    Linux/macOS

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    c:
    cls
    echo Laboratorio DOSBox iniciado
    dir

    76. Autoexec entrando directamente en la carpeta JUEGOS

    Windows

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cd JUEGOS
    cls
    echo Carpeta de juegos cargada
    dir

    Linux/macOS

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    c:
    cd JUEGOS
    cls
    echo Carpeta de juegos cargada
    dir

    77. Autoexec montando disco duro e ISO

    Windows

    [autoexec]
    keyb sp
    mount c c:\doslab
    imgmount d c:\doslab\isos\juegocd.iso -t iso
    c:
    cls
    echo Disco duro C: y CD-ROM D: preparados
    dir

    Linux/macOS

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso
    c:
    cls
    echo Disco duro C: y CD-ROM D: preparados
    dir

    78. Autoexec para arrancar un juego automáticamente

    Supongamos que tenemos el juego en:

    C:\JUEGOS\JUEGO1

    y que se ejecuta con:

    JUEGO.EXE

    Windows

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cd JUEGOS
    cd JUEGO1
    cls
    juego

    Linux/macOS

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    c:
    cd JUEGOS
    cd JUEGO1
    cls
    juego

    79. Autoexec con menú sencillo

    Podemos crear un pequeño menú visual usando echo.

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cls
    echo ================================
    echo      LABORATORIO DOSBOX
    echo ================================
    echo.
    echo Comandos utiles:
    echo   dir       - Ver archivos
    echo   cd nombre - Entrar en carpeta
    echo   cd ..     - Volver atras
    echo   cls       - Limpiar pantalla
    echo.
    echo Carpetas disponibles:
    echo   JUEGOS
    echo   PROGRAMAS
    echo   ISOS
    echo.
    dir

    Para Linux/macOS cambia la línea del montaje:

    mount c ~/DOSLAB

    80. Actividad 12 — Autoexec personalizado

    Configura DOSBox para que al arrancar:

    1. Configure teclado español.
    2. Monte la carpeta DOSLAB.
    3. Entre en la unidad C:.
    4. Limpie la pantalla.
    5. Muestre un mensaje personalizado.
    6. Liste el contenido.

    Ejemplo Windows

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cls
    echo Bienvenido al laboratorio retro
    echo Tu unidad C: esta preparada
    dir

    Ejemplo Linux/macOS

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    c:
    cls
    echo Bienvenido al laboratorio retro
    echo Tu unidad C: esta preparada
    dir

    Preguntas

    1. ¿Qué hace keyb sp?
    2. ¿Qué hace mount c?
    3. ¿Qué hace cls?
    4. ¿Qué hace echo?
    5. ¿Qué ventajas tiene usar [autoexec]?

    Parte 16 — Usar varios archivos de configuración

    81. Por qué crear varias configuraciones

    Podemos tener un archivo de configuración para cada juego o práctica.

    Ejemplo:

    dosbox_basico.conf
    dosbox_juego1.conf
    dosbox_cdrom.conf
    dosbox_rapido.conf
    dosbox_lento.conf

    Esto permite arrancar DOSBox con diferentes opciones según lo que queramos probar.


    82. Crear una configuración para un juego

    Copia tu archivo dosbox.conf y crea otro llamado:

    dosbox_juego1.conf

    En Windows:

    copy C:\DOSLAB\CONFIG\dosbox.conf C:\DOSLAB\CONFIG\dosbox_juego1.conf

    En Linux/macOS:

    cp ~/DOSLAB/CONFIG/dosbox.conf ~/DOSLAB/CONFIG/dosbox_juego1.conf

    83. Modificar el autoexec del juego

    Edita dosbox_juego1.conf y deja al final:

    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cd JUEGOS
    cd JUEGO1
    juego

    En Linux/macOS:

    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    c:
    cd JUEGOS
    cd JUEGO1
    juego

    84. Arrancar DOSBox con un archivo de configuración concreto

    Windows

    Desde PowerShell o CMD:

    dosbox -conf C:\DOSLAB\CONFIG\dosbox_juego1.conf

    Si el comando dosbox no funciona directamente, habrá que usar la ruta completa del ejecutable o crear un acceso directo.


    Linux

    dosbox -conf ~/DOSLAB/CONFIG/dosbox_juego1.conf

    macOS

    dosbox -conf ~/DOSLAB/CONFIG/dosbox_juego1.conf

    85. Actividad 13 — Perfil personalizado

    Crea dos archivos de configuración:

    dosbox_basico.conf
    dosbox_juego1.conf

    El primero debe arrancar en C:\.

    El segundo debe arrancar directamente dentro de la carpeta de un juego.

    Preguntas

    1. ¿Qué ventaja tiene usar varios archivos .conf?
    2. ¿Qué diferencia hay entre tus dos configuraciones?
    3. ¿Cuál usarías para una práctica general?
    4. ¿Cuál usarías para abrir directamente un juego?

    Parte 17 — Crear archivos BAT dentro de DOSBox

    86. Qué es un archivo BAT

    Un archivo .BAT contiene comandos que se ejecutan en orden.

    Sirve para automatizar tareas dentro de DOS.

    Por ejemplo, podemos crear un archivo llamado:

    MENU.BAT

    87. Crear un BAT desde DOSBox

    Entra en C:

    c:

    Crea un archivo:

    copy con menu.bat

    Escribe:

    @echo off
    cls
    echo ==========================
    echo      MENU DOSBOX
    echo ==========================
    echo.
    echo 1. Ir a juegos
    echo 2. Ir a programas
    echo.
    echo Escribe cd JUEGOS para entrar en juegos
    echo Escribe cd PROGRAMAS para entrar en programas

    Termina con:

    Ctrl + Z
    Enter

    Ejecuta:

    menu

    88. Crear un lanzador para un juego

    Supongamos que queremos crear un lanzador llamado juego1.bat.

    copy con juego1.bat

    Contenido:

    @echo off
    cls
    cd \JUEGOS\JUEGO1
    JUEGO.EXE
    cd \

    Termina con:

    Ctrl + Z
    Enter

    Ejecuta:

    juego1

    89. Actividad 14 — Crear lanzadores

    Crea al menos dos archivos .BAT:

    1. Uno que muestre un menú.
    2. Uno que arranque un juego o programa.

    Preguntas

    1. ¿Para qué sirve un archivo .BAT?
    2. ¿Qué significa @echo off?
    3. ¿Qué ventaja tiene crear lanzadores?
    4. ¿Dónde has guardado tus archivos .BAT?

    Parte 18 — Capturas de pantalla

    90. Capturas desde DOSBox

    En muchas versiones de DOSBox se pueden hacer capturas con:

    Ctrl + F5

    Las capturas se guardan en la carpeta configurada para capturas, dependiendo de la versión y sistema.

    Si no funciona, puedes usar las herramientas del sistema operativo:

    Windows

    Win + Shift + S

    macOS

    Cmd + Shift + 4

    Linux

    Depende del entorno, pero suele funcionar:

    Impr Pant

    O herramientas como Flameshot.


    91. Actividad 15 — Evidencias

    Realiza capturas de:

    1. DOSBox recién abierto.
    2. Unidad C: montada.
    3. Contenido de DOSLAB.
    4. Imagen ISO montada como D:.
    5. Juego o programa funcionando.
    6. Archivo dosbox.conf editado.
    7. Sección [autoexec].

    Parte 19 — Comandos rápidos de DOSBox

    92. Comandos internos útiles

    AcciónComando
    Montar carpeta como C:mount c ruta
    Desmontar unidadmount -u c
    Montar ISOimgmount d archivo.iso -t iso
    Cambiar a C:c:
    Cambiar a D:d:
    Ver archivosdir
    Entrar en carpetacd carpeta
    Volver atráscd ..
    Ir a raízcd \
    Limpiar pantallacls
    Crear carpetamd carpeta
    Borrar carpeta vacíard carpeta
    Borrar archivodel archivo
    Ver textotype archivo.txt
    Buscar EXEdir *.exe
    Buscar BATdir *.bat
    Buscar COMdir *.com
    Cambiar tecladokeyb sp
    Salir de DOSBoxexit

    93. Atajos útiles

    AcciónAtajo
    Pantalla completaAlt + Enter
    Capturar/liberar ratónCtrl + F10
    Bajar ciclosCtrl + F11
    Subir ciclosCtrl + F12
    Captura de pantallaCtrl + F5
    Cambiar disco en imágenes múltiplesCtrl + F4

    Parte 20 — Configuración completa recomendada

    94. Ejemplo de dosbox.conf básico para clase

    Este ejemplo no incluye todo el archivo, solo las partes más importantes que conviene revisar.

    [sdl]
    fullscreen=false
    fullresolution=desktop
    windowresolution=1280x960
    output=surface
    autolock=true
    sensitivity=100
    
    [dosbox]
    machine=svga_s3
    memsize=16
    
    [cpu]
    core=auto
    cputype=auto
    cycles=auto
    cycleup=10
    cycledown=20
    
    [sblaster]
    sbtype=sb16
    sbbase=220
    irq=7
    dma=1
    hdma=5
    mixer=true
    oplmode=auto
    oplemu=default
    oplrate=44100
    
    [autoexec]
    keyb sp
    mount c c:\doslab
    c:
    cls
    echo ================================
    echo      LABORATORIO DOSBOX
    echo ================================
    echo.
    echo Unidad C: montada correctamente.
    echo Usa DIR para ver archivos.
    echo Usa CD JUEGOS para entrar en juegos.
    echo.
    dir

    Para Linux/macOS, cambia esta línea:

    mount c c:\doslab

    por:

    mount c ~/DOSLAB

    Parte 21 — Configuración para juego con CD-ROM

    95. Ejemplo Windows

    [sdl]
    fullscreen=false
    fullresolution=desktop
    windowresolution=1280x960
    output=surface
    autolock=true
    sensitivity=100
    
    [dosbox]
    machine=svga_s3
    memsize=16
    
    [cpu]
    core=auto
    cputype=auto
    cycles=12000
    cycleup=10
    cycledown=20
    
    [sblaster]
    sbtype=sb16
    sbbase=220
    irq=7
    dma=1
    hdma=5
    mixer=true
    oplmode=auto
    oplemu=default
    oplrate=44100
    
    [autoexec]
    keyb sp
    mount c c:\doslab
    imgmount d c:\doslab\isos\juegocd.iso -t iso
    c:
    cd JUEGOS
    cd JUEGOCD
    cls
    echo Juego con CD-ROM preparado
    juego

    96. Ejemplo Linux/macOS

    [sdl]
    fullscreen=false
    fullresolution=desktop
    windowresolution=1280x960
    output=surface
    autolock=true
    sensitivity=100
    
    [dosbox]
    machine=svga_s3
    memsize=16
    
    [cpu]
    core=auto
    cputype=auto
    cycles=12000
    cycleup=10
    cycledown=20
    
    [sblaster]
    sbtype=sb16
    sbbase=220
    irq=7
    dma=1
    hdma=5
    mixer=true
    oplmode=auto
    oplemu=default
    oplrate=44100
    
    [autoexec]
    keyb sp
    mount c ~/DOSLAB
    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso
    c:
    cd JUEGOS
    cd JUEGOCD
    cls
    echo Juego con CD-ROM preparado
    juego

    Parte 22 — Solución de problemas

    97. Error: Directory does not exist

    Significa que la carpeta indicada no existe o la ruta está mal escrita.

    Ejemplo incorrecto:

    mount c c:\doslabb

    Ejemplo correcto:

    mount c c:\doslab

    Comprueba desde tu sistema operativo que la carpeta existe.


    98. Error: Drive C already mounted

    La unidad C: ya está montada.

    Puedes desmontarla:

    mount -u c

    Y volver a montarla:

    mount c c:\doslab

    99. No encuentro el juego

    Usa:

    dir
    cd JUEGOS
    dir

    Busca ejecutables:

    dir *.exe
    dir *.bat
    dir *.com

    100. El juego pide CD

    Monta la ISO:

    imgmount d c:\doslab\isos\juegocd.iso -t iso

    O en Linux/macOS:

    imgmount d ~/DOSLAB/ISOS/juegocd.iso -t iso

    101. El juego va muy rápido

    Reduce ciclos:

    Ctrl + F11

    O cambia en dosbox.conf:

    cycles=3000

    102. El juego va muy lento

    Aumenta ciclos:

    Ctrl + F12

    O cambia:

    cycles=12000

    103. No funciona el sonido

    Ejecuta el configurador del juego:

    setup

    O:

    install

    Busca:

    dir *.exe

    Configura:

    Sound Blaster 16
    Port 220
    IRQ 7
    DMA 1
    HDMA 5

    104. No funciona el ratón

    Captura el ratón:

    Ctrl + F10

    Comprueba también si el juego tiene opción de ratón.


    105. El teclado escribe símbolos raros

    Prueba:

    keyb sp

    O:

    keyb es

    Añádelo después en [autoexec].


    Parte 23 — Entrega final del alumno

    106. Documento que debe entregar el alumno

    El alumno deberá entregar un documento con:

    1. Portada.
    2. Sistema operativo usado.
    3. Versión de DOSBox usada.
    4. Captura de la estructura de carpetas.
    5. Comandos usados para montar C:.
    6. Comandos usados para montar D: o ISO.
    7. Captura del juego o programa funcionando.
    8. Explicación de la configuración de sonido.
    9. Explicación de la configuración de ciclos.
    10. Captura del archivo dosbox.conf.
    11. Captura de la sección [autoexec].
    12. Problemas encontrados.
    13. Soluciones aplicadas.
    14. Conclusión personal.

    107. Tabla de comandos usados

    El alumno debe completar esta tabla:

    AcciónComando usadoResultado
    Montar unidad C:
    Cambiar a C:
    Ver archivos
    Entrar en carpeta
    Buscar ejecutables
    Ejecutar programa
    Montar ISO
    Cambiar a D:
    Configurar teclado
    Cambiar ciclos
    Pantalla completa
    Capturar ratón

    Parte 24 — Reto final

    108. Reto: Museo DOSBox

    Cada alumno o grupo deberá preparar un pequeño museo retro con tres elementos:

    1. Un juego.
    2. Un programa de utilidad.
    3. Un programa educativo, demo o herramienta técnica.

    Para cada elemento deberá indicar:

    CampoInformación
    Nombre
    Tipo
    Año aproximado
    Carpeta
    Ejecutable principal
    Comandos de arranque
    ¿Necesita CD-ROM?
    ¿Necesita sonido?
    Configuración usada
    Problemas encontrados
    Solución aplicada
    Captura

    Parte 25 — Conclusión

    DOSBox nos permite aprender mucho más que a ejecutar juegos antiguos.

    Con esta práctica hemos trabajado conceptos muy importantes:

    • Sistemas operativos antiguos.
    • Línea de comandos.
    • Rutas y unidades.
    • Montaje de discos.
    • Imágenes ISO.
    • Configuración de hardware emulado.
    • Sonido.
    • Ratón.
    • Teclado.
    • Automatización de arranque.
    • Documentación técnica.

    Este proyecto nos ayuda a entender mejor cómo ha evolucionado la informática y por qué muchos conceptos antiguos siguen presentes en los sistemas actuales.

    Tabla resumen de comandos principales de DOSBox

    CategoríaAcciónComando / AtajoEjemploExplicación
    UnidadesMontar una carpeta como disco duromount c rutamount c c:\doslabConvierte una carpeta real en la unidad C: dentro de DOSBox
    UnidadesMontar carpeta en Linux/macOSmount c rutamount c ~/DOSLABMonta una carpeta del usuario como unidad C:
    UnidadesCambiar a unidad C:c:c:Entra en la unidad C:
    UnidadesCambiar a unidad D:d:d:Entra en la unidad D:, normalmente usada como CD-ROM
    UnidadesCambiar a unidad Z:z:z:Vuelve a la unidad interna de DOSBox
    UnidadesVer unidades montadasmountmountMuestra información de las unidades montadas
    UnidadesDesmontar una unidadmount -u letramount -u cDesmonta la unidad indicada
    CD-ROM / ISOMontar una ISO como CD-ROMimgmount d archivo.iso -t isoimgmount d c:\doslab\isos\juego.iso -t isoMonta una imagen ISO como unidad D:
    CD-ROM / ISOMontar una carpeta como CD-ROMmount d ruta -t cdrommount d c:\doslab\cdrom -t cdromHace que una carpeta funcione como un CD-ROM
    CD-ROM / ISOMontar varias ISOsimgmount d iso1 iso2 -t isoimgmount d cd1.iso cd2.iso -t isoPermite montar varios CDs para juegos con varios discos
    CD-ROM / ISOCambiar de CD montadoCtrl + F4Ctrl + F4Cambia entre imágenes montadas en la misma unidad
    NavegaciónVer contenido de carpetadirdirLista archivos y carpetas
    NavegaciónEntrar en una carpetacd carpetacd JUEGOSCambia a una carpeta concreta
    NavegaciónVolver a la carpeta anteriorcd ..cd ..Sube un nivel en la estructura de carpetas
    NavegaciónIr a la raíz de la unidadcd \cd \Vuelve al inicio de la unidad actual
    NavegaciónLimpiar pantallaclsclsBorra el contenido visible de la pantalla
    CarpetasCrear carpetamd nombremd PRUEBACrea una carpeta
    CarpetasBorrar carpeta vacíard nombrerd PRUEBAElimina una carpeta si está vacía
    ArchivosCopiar archivocopy origen destinocopy nota.txt copia.txtCopia un archivo
    ArchivosBorrar archivodel archivodel nota.txtElimina un archivo
    ArchivosRenombrar archivoren antiguo nuevoren viejo.txt nuevo.txtCambia el nombre de un archivo
    ArchivosVer archivo de textotype archivotype readme.txtMuestra el contenido de un archivo de texto
    ArchivosCrear archivo desde consolacopy con archivo.txtcopy con nota.txtPermite crear un archivo escribiendo desde DOS
    ArchivosFinalizar creación con copy conCtrl + Z y EnterCtrl + Z + EnterGuarda el archivo creado con copy con
    EjecutablesBuscar archivos EXEdir *.exedir *.exeMuestra los ejecutables .EXE
    EjecutablesBuscar archivos BATdir *.batdir *.batMuestra scripts .BAT
    EjecutablesBuscar archivos COMdir *.comdir *.comMuestra ejecutables .COM
    EjecutablesEjecutar programanombrejuegoEjecuta un archivo .EXE, .COM o .BAT
    ConfiguraciónGenerar archivo de configuraciónconfig -writeconf archivo.confconfig -writeconf c:\doslab\config\dosbox.confCrea un archivo de configuración de DOSBox
    ConfiguraciónUsar un archivo de configuracióndosbox -conf archivo.confdosbox -conf C:\DOSLAB\CONFIG\juego.confArranca DOSBox usando una configuración concreta
    ConfiguraciónConfigurar teclado españolkeyb spkeyb spIntenta activar distribución de teclado española
    ConfiguraciónAlternativa teclado españolkeyb eskeyb esOtra opción según versión de DOSBox
    PantallaCambiar pantalla completa / ventanaAlt + EnterAlt + EnterAlterna entre modo ventana y pantalla completa
    RatónCapturar o liberar ratónCtrl + F10Ctrl + F10Hace que el ratón quede dentro o fuera de DOSBox
    VelocidadReducir ciclosCtrl + F11Ctrl + F11Reduce la velocidad de la CPU emulada
    VelocidadAumentar ciclosCtrl + F12Ctrl + F12Aumenta la velocidad de la CPU emulada
    CapturasCaptura de pantallaCtrl + F5Ctrl + F5Guarda una captura, si la versión lo soporta
    SalidaSalir de DOSBoxexitexitCierra DOSBox
    AyudaVer ayuda básicaintrointroMuestra información introductoria de DOSBox
    AyudaVer ayuda de comandoshelphelpMuestra ayuda de comandos disponibles
    AyudaAyuda de un comando concretocomando /?mount /?Muestra ayuda del comando indicado, si está disponible

    Tabla rápida de configuraciones habituales en dosbox.conf

    SecciónOpciónEjemploUso
    [sdl]fullscreenfullscreen=falseIndica si DOSBox arranca en pantalla completa
    [sdl]fullresolutionfullresolution=desktopUsa la resolución del escritorio en pantalla completa
    [sdl]windowresolutionwindowresolution=1280x960Define el tamaño de la ventana
    [sdl]outputoutput=surfaceDefine el sistema de salida gráfica
    [sdl]autolockautolock=trueCaptura automáticamente el ratón al hacer clic
    [sdl]sensitivitysensitivity=100Ajusta la sensibilidad del ratón
    [dosbox]machinemachine=svga_s3Define el tipo de máquina gráfica emulada
    [dosbox]memsizememsize=16Define la memoria RAM emulada en MB
    [cpu]corecore=autoDefine el núcleo de emulación de CPU
    [cpu]cputypecputype=autoDefine el tipo de CPU emulada
    [cpu]cyclescycles=autoControla la velocidad de la CPU emulada
    [cpu]cycleupcycleup=10Cantidad que suben los ciclos con Ctrl + F12
    [cpu]cycledowncycledown=20Cantidad que bajan los ciclos con Ctrl + F11
    [sblaster]sbtypesbtype=sb16Define el tipo de Sound Blaster
    [sblaster]sbbasesbbase=220Puerto base de la Sound Blaster
    [sblaster]irqirq=7IRQ de la tarjeta de sonido
    [sblaster]dmadma=1Canal DMA principal
    [sblaster]hdmahdma=5Canal DMA de alta velocidad
    [sblaster]mixermixer=trueActiva el mezclador de sonido
    [sblaster]oplmodeoplmode=autoConfigura la síntesis FM/AdLib
    [autoexec]mountmount c c:\doslabMonta automáticamente una carpeta al arrancar
    [autoexec]imgmountimgmount d c:\doslab\isos\juego.iso -t isoMonta una ISO automáticamente
    [autoexec]keybkeyb spConfigura el teclado automáticamente
    [autoexec]echoecho BienvenidoMuestra mensajes al arrancar
    [autoexec]clsclsLimpia la pantalla al arrancar
    [autoexec]cdcd JUEGOSEntra automáticamente en una carpeta
    [autoexec]Ejecutar programajuegoArranca automáticamente un programa o juego
  • [Prueba competencial] – Servicios utilizando Docker y Docker Compose

    1. Contexto de la práctica

    En esta práctica vas a desplegar una pequeña infraestructura de servicios utilizando Docker y Docker Compose.

    El objetivo no es únicamente “levantar contenedores”, sino comprender cómo se organizan los servicios, cómo se comunican entre ellos, cómo se almacenan los datos, cómo se exponen puertos al exterior y cómo se puede documentar y justificar una instalación técnica.

    Durante la práctica se trabajará con servicios similares a los vistos en clase:

    • Servidor web HTTP con Apache.
    • PHP para ejecutar código dinámico.
    • MySQL como base de datos relacional.
    • phpMyAdmin como herramienta de administración.
    • MongoDB como base de datos NoSQL.
    • Mongo Express como herramienta de administración.
    • Redes Docker.
    • Volúmenes persistentes.
    • Variables de entorno.
    • Logs y comprobaciones.
    • Copias de seguridad básicas.
    • Documentación técnica.

    2. Objetivos de aprendizaje

    Al finalizar la práctica, el alumno deberá ser capaz de:

    1. Explicar qué es Docker y para qué se utiliza.
    2. Diferenciar una imagen de un contenedor.
    3. Crear y ejecutar contenedores mediante Docker Compose.
    4. Configurar servicios conectados entre sí.
    5. Usar volúmenes para conservar datos.
    6. Usar redes Docker para aislar servicios.
    7. Configurar variables de entorno.
    8. Desplegar una aplicación PHP conectada a MySQL.
    9. Desplegar y consultar una base de datos MongoDB.
    10. Comprobar el estado de los servicios mediante comandos.
    11. Interpretar errores básicos mediante logs.
    12. Documentar una instalación técnica de forma clara.
    13. Defender oralmente el trabajo realizado.

    3. Resultado final esperado

    Al terminar la práctica deberás tener funcionando una infraestructura compuesta por varios contenedores:

    ServicioTecnologíaPuerto externo sugeridoFunción
    Web PHPApache + PHP8080Servidor web principal
    MySQLMySQL3306 o solo internoBase de datos relacional
    phpMyAdminphpMyAdmin8081Administración de MySQL
    MongoDBMongoDB27017 o solo internoBase de datos NoSQL
    Mongo ExpressMongo Express8082Administración de MongoDB

    La aplicación PHP deberá mostrar una página web con información del alumno, conexión a MySQL y, opcionalmente, conexión a MongoDB.


    4. Normas de entrega

    El alumno deberá entregar:

    1. Carpeta completa del proyecto.
    2. Archivo docker-compose.yml.
    3. Archivo .env.
    4. Código fuente de la aplicación PHP.
    5. Capturas de pantalla.
    6. Documento de memoria en PDF.
    7. Comandos utilizados.
    8. Respuestas a las preguntas de reflexión.
    9. Evidencias de funcionamiento.
    10. Breve vídeo opcional de demostración.

    5. Estructura recomendada del proyecto

    Crea una carpeta llamada:

    practica-docker-servicios-nombre-apellido

    Dentro de ella deberás crear una estructura similar a esta:

    practica-docker-servicios-nombre-apellido/

    ├── docker-compose.yml
    ├── .env
    ├── README.md

    ├── web/
    │ ├── index.php
    │ ├── conexion_mysql.php
    │ ├── insertar.php
    │ ├── listar.php
    │ └── estilos.css

    ├── mysql/
    │ └── init.sql

    ├── evidencias/
    │ ├── captura_01_docker_version.png
    │ ├── captura_02_contenedores.png
    │ ├── captura_03_web_funcionando.png
    │ ├── captura_04_phpmyadmin.png
    │ ├── captura_05_mongo_express.png
    │ └── captura_06_logs.png

    └── memoria/
    └── memoria_practica.pdf

    6. Fase 1 — Preparación del entorno

    6.1. Comprobar Docker

    Ejecuta los siguientes comandos:

    docker --version
    docker compose version

    Guarda una captura de pantalla donde se vea el resultado.

    Preguntas de reflexión

    Responde en tu memoria:

    1. ¿Qué diferencia hay entre Docker y Docker Compose?
    2. ¿Qué problema soluciona Docker cuando trabajamos con varios servicios?
    3. ¿Por qué puede ser útil usar Docker en un entorno educativo o de laboratorio?

    6.2. Comprobar que Docker funciona

    Ejecuta:

    docker run hello-world

    Evidencia obligatoria

    Incluye una captura del resultado del comando.

    Pregunta de reflexión

    Explica con tus palabras qué ha ocurrido al ejecutar hello-world.

    Debes mencionar:

    • Si Docker ha usado una imagen local o la ha descargado.
    • Qué es un contenedor.
    • Por qué el contenedor termina después de ejecutarse.

    7. Fase 2 — Primer diseño de la infraestructura

    Antes de escribir el docker-compose.yml, realiza un pequeño esquema de la infraestructura.

    Puedes hacerlo con una tabla, un dibujo o un diagrama sencillo.

    Debe aparecer:

    • Servicio web.
    • Base de datos MySQL.
    • phpMyAdmin.
    • MongoDB.
    • Mongo Express.
    • Red interna.
    • Volúmenes de datos.
    • Puertos publicados.

    Ejemplo conceptual:

    Navegador
    |
    | puerto 8080
    v
    Apache + PHP
    |
    | red interna docker
    v
    MySQL

    Navegador
    |
    | puerto 8081
    v
    phpMyAdmin
    |
    v
    MySQL

    Navegador
    |
    | puerto 8082
    v
    Mongo Express
    |
    v
    MongoDB

    Preguntas de reflexión

    1. ¿Por qué no es recomendable instalar todos los servicios dentro del mismo contenedor?
    2. ¿Qué ventajas tiene separar web, base de datos y herramientas de administración?
    3. ¿Qué servicios deberían ser accesibles desde el navegador y cuáles deberían quedar solo dentro de la red Docker?

    8. Fase 3 — Creación del archivo .env

    Crea un archivo llamado .env en la raíz del proyecto.

    Ejemplo:

    MYSQL_ROOT_PASSWORD=rootpassword
    MYSQL_DATABASE=asir_db
    MYSQL_USER=asir_user
    MYSQL_PASSWORD=asir_password

    MONGO_INITDB_ROOT_USERNAME=admin
    MONGO_INITDB_ROOT_PASSWORD=adminpassword
    MONGO_DATABASE=asir_mongo

    WEB_PORT=8080
    PHPMYADMIN_PORT=8081
    MONGO_EXPRESS_PORT=8082

    Importante

    El archivo .env permite separar configuración del archivo docker-compose.yml.

    No deberías escribir directamente las contraseñas dentro del docker-compose.yml si puedes evitarlo.

    Preguntas de reflexión

    1. ¿Qué ventaja tiene usar variables de entorno?
    2. ¿Por qué puede ser peligroso subir un archivo .env real a un repositorio público?
    3. ¿Qué información sensible contiene este archivo?

    9. Fase 4 — Creación del docker-compose.yml

    Crea el archivo docker-compose.yml.

    Propuesta base:

    services:

    web:
    image: php:8.2-apache
    container_name: asir_web_php
    ports:
    - "${WEB_PORT}:80"
    volumes:
    - ./web:/var/www/html
    depends_on:
    - mysql
    - mongodb
    networks:
    - red_asir

    mysql:
    image: mysql:8.0
    container_name: asir_mysql
    restart: always
    environment:
    MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    MYSQL_DATABASE: ${MYSQL_DATABASE}
    MYSQL_USER: ${MYSQL_USER}
    MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
    - mysql_data:/var/lib/mysql
    - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
    - red_asir

    phpmyadmin:
    image: phpmyadmin:latest
    container_name: asir_phpmyadmin
    restart: always
    ports:
    - "${PHPMYADMIN_PORT}:80"
    environment:
    PMA_HOST: mysql
    PMA_PORT: 3306
    depends_on:
    - mysql
    networks:
    - red_asir

    mongodb:
    image: mongo:latest
    container_name: asir_mongodb
    restart: always
    environment:
    MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
    MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
    volumes:
    - mongo_data:/data/db
    networks:
    - red_asir

    mongo-express:
    image: mongo-express:latest
    container_name: asir_mongo_express
    restart: always
    ports:
    - "${MONGO_EXPRESS_PORT}:8081"
    environment:
    ME_CONFIG_MONGODB_ADMINUSERNAME: ${MONGO_INITDB_ROOT_USERNAME}
    ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
    ME_CONFIG_MONGODB_SERVER: mongodb
    depends_on:
    - mongodb
    networks:
    - red_asir

    volumes:
    mysql_data:
    mongo_data:

    networks:
    red_asir:
    driver: bridge

    9.1. Preguntas sobre el docker-compose.yml

    Responde en tu memoria:

    1. ¿Qué significa services?
    2. ¿Qué diferencia hay entre image y container_name?
    3. ¿Para qué sirve ports?
    4. ¿Qué diferencia hay entre el puerto de la izquierda y el de la derecha en esta línea?
    - "8080:80"
    1. ¿Para qué sirve volumes?
    2. ¿Qué pasaría con los datos de MySQL si no usásemos un volumen?
    3. ¿Qué hace depends_on?
    4. ¿Qué limitación tiene depends_on?
    5. ¿Para qué sirve definir una red propia llamada red_asir?
    6. ¿Por qué el servicio web puede conectarse a MySQL usando el nombre mysql?

    10. Fase 5 — Script inicial de MySQL

    Dentro de la carpeta mysql, crea el archivo init.sql.

    Ejemplo:

    CREATE TABLE IF NOT EXISTS alumnos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    apellido VARCHAR(100) NOT NULL,
    curso VARCHAR(100) NOT NULL,
    fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    INSERT INTO alumnos (nombre, apellido, curso)
    VALUES
    ('Alumno', 'Ejemplo', 'ASIR'),
    ('Docker', 'Compose', 'Servicios');

    Este script se ejecutará automáticamente cuando se cree por primera vez el contenedor de MySQL y el volumen esté vacío.

    Preguntas de reflexión

    1. ¿Cuándo se ejecutan los scripts dentro de /docker-entrypoint-initdb.d/?
    2. Si modificas init.sql después de haber creado el volumen, ¿se vuelve a ejecutar automáticamente?
    3. ¿Qué tendrías que hacer para reiniciar completamente la base de datos desde cero?
    4. ¿Por qué hay que tener cuidado al borrar volúmenes?

    11. Fase 6 — Crear la aplicación PHP

    Dentro de la carpeta web, crea el archivo index.php.

    Ejemplo:

    <?php
    $host = 'mysql';
    $db = 'asir_db';
    $user = 'asir_user';
    $password = 'asir_password';

    $conexionCorrecta = false;
    $error = '';

    try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $password);
    $conexionCorrecta = true;
    } catch (PDOException $e) {
    $error = $e->getMessage();
    }
    ?>

    <!DOCTYPE html>
    <html lang="es">
    <head>
    <meta charset="UTF-8">
    <title>Práctica Docker ASIR</title>
    <link rel="stylesheet" href="estilos.css">
    </head>
    <body>

    <main>
    <h1>Práctica Docker, Docker Compose y Servicios</h1>

    <section>
    <h2>Datos del alumno</h2>
    <p><strong>Nombre:</strong> Escribe aquí tu nombre</p>
    <p><strong>Curso:</strong> ASIR</p>
    <p><strong>Módulo:</strong> Implantación de aplicaciones / Servicios / Sistemas</p>
    </section>

    <section>
    <h2>Estado de la conexión con MySQL</h2>

    <?php if ($conexionCorrecta): ?>
    <p class="ok">Conexión correcta con MySQL.</p>
    <?php else: ?>
    <p class="error">Error de conexión con MySQL.</p>
    <pre><?php echo $error; ?></pre>
    <?php endif; ?>
    </section>

    <section>
    <h2>Listado de alumnos desde MySQL</h2>

    <?php
    if ($conexionCorrecta) {
    $consulta = $pdo->query("SELECT * FROM alumnos");

    echo "<table>";
    echo "<tr><th>ID</th><th>Nombre</th><th>Apellido</th><th>Curso</th><th>Fecha</th></tr>";

    while ($fila = $consulta->fetch(PDO::FETCH_ASSOC)) {
    echo "<tr>";
    echo "<td>" . htmlspecialchars($fila['id']) . "</td>";
    echo "<td>" . htmlspecialchars($fila['nombre']) . "</td>";
    echo "<td>" . htmlspecialchars($fila['apellido']) . "</td>";
    echo "<td>" . htmlspecialchars($fila['curso']) . "</td>";
    echo "<td>" . htmlspecialchars($fila['fecha_registro']) . "</td>";
    echo "</tr>";
    }

    echo "</table>";
    }
    ?>
    </section>
    </main>

    </body>
    </html>

    11.1. Archivo CSS

    Crea estilos.css:

    body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 0;
    }

    main {
    width: 80%;
    margin: 40px auto;
    background-color: white;
    padding: 30px;
    border-radius: 10px;
    }

    h1 {
    color: #333;
    }

    section {
    margin-bottom: 30px;
    }

    .ok {
    color: green;
    font-weight: bold;
    }

    .error {
    color: red;
    font-weight: bold;
    }

    table {
    width: 100%;
    border-collapse: collapse;
    }

    th {
    background-color: #333;
    color: white;
    }

    td, th {
    padding: 10px;
    border: 1px solid #ccc;
    }

    11.2. Problema intencionado

    Con la imagen oficial php:8.2-apache, puede ocurrir que PHP no tenga activada la extensión necesaria para conectarse a MySQL mediante PDO.

    Si al abrir la web aparece un error relacionado con MySQL o PDO, deberás investigarlo y solucionarlo.

    Pista

    Puede ser necesario crear un Dockerfile personalizado para el servicio web.


    12. Fase 7 — Crear una imagen personalizada para PHP

    Crea un archivo llamado Dockerfile dentro de la carpeta web.

    FROM php:8.2-apache

    RUN docker-php-ext-install pdo pdo_mysql mysqli

    Ahora modifica el servicio web en el docker-compose.yml.

    Antes:

    web:
    image: php:8.2-apache

    Después:

    web:
    build: ./web

    El servicio completo quedaría así:

    web:
    build: ./web
    container_name: asir_web_php
    ports:
    - "${WEB_PORT}:80"
    volumes:
    - ./web:/var/www/html
    depends_on:
    - mysql
    - mongodb
    networks:
    - red_asir

    Preguntas de reflexión

    1. ¿Qué diferencia hay entre usar image y usar build?
    2. ¿Para qué sirve un Dockerfile?
    3. ¿Qué hace esta línea?
    RUN docker-php-ext-install pdo pdo_mysql mysqli
    1. ¿Por qué necesitamos instalar extensiones de PHP?
    2. ¿Qué ventaja tiene crear nuestra propia imagen personalizada?

    13. Fase 8 — Levantar los servicios

    Ejecuta:

    docker compose up -d

    Después comprueba:

    docker compose ps

    También puedes usar:

    docker ps

    Evidencias obligatorias

    Incluye capturas donde se vea:

    • Los contenedores levantados.
    • Los puertos publicados.
    • El estado de cada contenedor.

    Preguntas de reflexión

    1. ¿Qué significa ejecutar Docker Compose con -d?
    2. ¿Qué diferencia hay entre docker compose ps y docker ps?
    3. ¿Qué significa que un contenedor esté en estado Up?
    4. ¿Qué harías si un contenedor aparece como Restarting?

    14. Fase 9 — Comprobación de servicios en navegador

    Accede desde el navegador a:

    http://localhost:8080

    Deberías ver la aplicación PHP.

    Accede también a:

    http://localhost:8081

    Deberías ver phpMyAdmin.

    Accede a:

    http://localhost:8082

    Deberías ver Mongo Express.

    Evidencias obligatorias

    Incluye capturas de:

    1. Página PHP funcionando.
    2. phpMyAdmin mostrando la base de datos.
    3. Tabla alumnos dentro de MySQL.
    4. Mongo Express funcionando.

    Preguntas de reflexión

    1. ¿Por qué accedemos a la web usando localhost:8080 y no localhost:80?
    2. ¿Qué usuario y contraseña has utilizado para entrar en phpMyAdmin?
    3. ¿Qué base de datos aparece creada automáticamente?
    4. ¿Qué diferencia hay entre administrar MySQL desde línea de comandos y hacerlo desde phpMyAdmin?
    5. ¿Qué riesgos tendría dejar phpMyAdmin abierto en un servidor real?

    15. Fase 10 — Insertar datos desde PHP

    Crea un archivo llamado insertar.php.

    <?php
    $host = 'mysql';
    $db = 'asir_db';
    $user = 'asir_user';
    $password = 'asir_password';

    try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $password);

    $sql = "INSERT INTO alumnos (nombre, apellido, curso) VALUES (:nombre, :apellido, :curso)";
    $stmt = $pdo->prepare($sql);

    $stmt->execute([
    ':nombre' => 'NombreAlumno',
    ':apellido' => 'ApellidoAlumno',
    ':curso' => 'ASIR'
    ]);

    echo "Registro insertado correctamente.";
    } catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
    }

    Accede a:

    http://localhost:8080/insertar.php

    Después vuelve a:

    http://localhost:8080/index.php

    Comprueba que el nuevo registro aparece en la tabla.

    Trabajo obligatorio

    Modifica el archivo para que inserte tus propios datos.

    Preguntas de reflexión

    1. ¿Qué ocurre cada vez que recargas insertar.php?
    2. ¿Por qué puede ser peligroso insertar datos directamente sin un formulario controlado?
    3. ¿Qué diferencia hay entre una consulta normal y una consulta preparada?
    4. ¿Qué problema de seguridad ayudan a evitar las consultas preparadas?

    16. Fase 11 — Crear formulario de inserción

    Crea una página formulario.php.

    <!DOCTYPE html>
    <html lang="es">
    <head>
    <meta charset="UTF-8">
    <title>Formulario de alumnos</title>
    <link rel="stylesheet" href="estilos.css">
    </head>
    <body>

    <main>
    <h1>Insertar alumno</h1>

    <form action="guardar.php" method="post">
    <label>Nombre:</label><br>
    <input type="text" name="nombre" required><br><br>

    <label>Apellido:</label><br>
    <input type="text" name="apellido" required><br><br>

    <label>Curso:</label><br>
    <input type="text" name="curso" required><br><br>

    <button type="submit">Guardar</button>
    </form>
    </main>

    </body>
    </html>

    Crea ahora guardar.php.

    <?php
    $host = 'mysql';
    $db = 'asir_db';
    $user = 'asir_user';
    $password = 'asir_password';

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nombre = $_POST['nombre'] ?? '';
    $apellido = $_POST['apellido'] ?? '';
    $curso = $_POST['curso'] ?? '';

    try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $password);

    $sql = "INSERT INTO alumnos (nombre, apellido, curso) VALUES (:nombre, :apellido, :curso)";
    $stmt = $pdo->prepare($sql);

    $stmt->execute([
    ':nombre' => $nombre,
    ':apellido' => $apellido,
    ':curso' => $curso
    ]);

    echo "Alumno guardado correctamente.";
    echo "<br><a href='index.php'>Volver al listado</a>";

    } catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
    }
    }

    Evidencia obligatoria

    Incluye captura del formulario y del registro insertado.

    Preguntas de reflexión

    1. ¿Qué método HTTP utiliza el formulario?
    2. ¿Qué diferencia hay entre GET y POST?
    3. ¿Dónde llegan los datos enviados por el formulario?
    4. ¿Qué validaciones mínimas debería tener este formulario?
    5. ¿Por qué no deberíamos confiar nunca únicamente en la validación del navegador?

    17. Fase 12 — Trabajo con MongoDB

    MongoDB es una base de datos NoSQL. En lugar de trabajar con tablas y filas, trabaja con bases de datos, colecciones y documentos.

    Accede a Mongo Express:

    http://localhost:8082

    Crea una base de datos llamada:

    asir_mongo

    Crea una colección llamada:

    inventario

    Inserta al menos tres documentos similares a estos:

    {
    "nombre": "Servidor web",
    "tipo": "contenedor",
    "servicio": "Apache PHP",
    "puerto": 8080
    }
    {
    "nombre": "Base de datos relacional",
    "tipo": "contenedor",
    "servicio": "MySQL",
    "puerto": 3306
    }
    {
    "nombre": "Base de datos NoSQL",
    "tipo": "contenedor",
    "servicio": "MongoDB",
    "puerto": 27017
    }

    Evidencias obligatorias

    Incluye capturas de:

    • Base de datos creada.
    • Colección creada.
    • Documentos insertados.

    Preguntas de reflexión

    1. ¿Qué diferencia hay entre una tabla de MySQL y una colección de MongoDB?
    2. ¿Qué diferencia hay entre una fila y un documento?
    3. ¿Qué ventajas puede tener MongoDB frente a MySQL?
    4. ¿Qué ventajas puede tener MySQL frente a MongoDB?
    5. ¿En qué tipo de proyecto usarías cada uno?

    18. Fase 13 — Comandos de administración

    Ejecuta y documenta los siguientes comandos.

    Ver contenedores activos

    docker ps

    Ver todos los contenedores

    docker ps -a

    Ver imágenes

    docker images

    Ver redes

    docker network ls

    Ver volúmenes

    docker volume ls

    Ver logs del servicio web

    docker compose logs web

    Ver logs de MySQL

    docker compose logs mysql

    Entrar dentro del contenedor web

    docker exec -it asir_web_php bash

    Dentro del contenedor, ejecuta:

    ls -la /var/www/html

    Después sal:

    exit

    Evidencias obligatorias

    Incluye capturas de al menos cinco comandos anteriores.

    Preguntas de reflexión

    1. ¿Para qué sirve docker ps?
    2. ¿Qué información muestra docker images?
    3. ¿Qué diferencia hay entre una imagen y un contenedor?
    4. ¿Qué utilidad tienen los logs?
    5. ¿Para qué puede servir entrar dentro de un contenedor?
    6. ¿Por qué no deberíamos modificar manualmente demasiadas cosas dentro de un contenedor en producción?

    19. Fase 14 — Persistencia de datos

    Vas a comprobar que los datos sobreviven aunque los contenedores se detengan.

    Ejecuta:

    docker compose down

    Después vuelve a levantar:

    docker compose up -d

    Comprueba:

    • Que la web sigue funcionando.
    • Que los datos de MySQL siguen estando.
    • Que los documentos de MongoDB siguen estando.

    Ahora ejecuta:

    docker compose down -v

    Vuelve a levantar:

    docker compose up -d

    Comprueba qué ha ocurrido con los datos.

    Mucho cuidado

    El parámetro -v elimina los volúmenes asociados al proyecto.

    Preguntas de reflexión

    1. ¿Qué diferencia hay entre docker compose down y docker compose down -v?
    2. ¿Por qué se han conservado los datos en el primer caso?
    3. ¿Por qué se han perdido los datos en el segundo caso?
    4. ¿Qué papel tienen los volúmenes en Docker?
    5. ¿Por qué la persistencia es fundamental en bases de datos?

    20. Fase 15 — Copia de seguridad de MySQL

    Realiza una copia de seguridad de la base de datos MySQL.

    Ejemplo:

    docker exec asir_mysql mysqldump -u root -p asir_db > backup_asir_db.sql

    El sistema pedirá la contraseña de root.

    Después comprueba que se ha creado el archivo:

    ls -lh backup_asir_db.sql

    Evidencia obligatoria

    Incluye captura del archivo generado.

    Preguntas de reflexión

    1. ¿Qué es mysqldump?
    2. ¿Por qué es importante hacer copias de seguridad?
    3. ¿Dónde se ha guardado el archivo SQL?
    4. ¿Qué información contiene ese archivo?
    5. ¿Sería suficiente esta copia de seguridad en un entorno real? Justifica la respuesta.

    21. Fase 16 — Restauración básica de MySQL

    Para comprobar la restauración, puedes crear una nueva base de datos desde phpMyAdmin o desde consola e importar el archivo.

    Ejemplo orientativo:

    docker exec -i asir_mysql mysql -u root -p asir_db < backup_asir_db.sql

    Preguntas de reflexión

    1. ¿Qué diferencia hay entre exportar e importar una base de datos?
    2. ¿Qué riesgos existen al restaurar una copia sobre una base de datos que ya contiene información?
    3. ¿Qué medidas tomarías antes de restaurar una copia en producción?

    22. Fase 17 — Comprobación de red entre contenedores

    Entra en el contenedor web:

    docker exec -it asir_web_php bash

    Instala herramientas de red si fuera necesario:

    apt update
    apt install -y iputils-ping

    Prueba conectividad:

    ping mysql
    ping mongodb

    Sal del contenedor:

    exit

    Preguntas de reflexión

    1. ¿Por qué podemos hacer ping mysql y no necesitamos conocer la IP del contenedor?
    2. ¿Qué papel hace el DNS interno de Docker?
    3. ¿Cambiaría la IP del contenedor si lo eliminamos y lo volvemos a crear?
    4. ¿Por qué es mejor usar nombres de servicio que direcciones IP?

    23. Fase 18 — Seguridad básica

    Analiza la configuración actual.

    Responde:

    1. ¿Qué puertos están expuestos al equipo anfitrión?
    2. ¿Qué servicios son accesibles desde el navegador?
    3. ¿Tiene sentido exponer MySQL directamente al exterior?
    4. ¿Tiene sentido exponer MongoDB directamente al exterior?
    5. ¿Qué contraseñas son débiles?
    6. ¿Qué cambiarías si esto fuese un servidor real?
    7. ¿Qué riesgos tiene usar root para administrar la base de datos?
    8. ¿Qué riesgos tiene dejar herramientas como phpMyAdmin o Mongo Express accesibles públicamente?

    Mejora obligatoria

    Modifica el docker-compose.yml para que MySQL y MongoDB no publiquen puertos hacia el exterior.

    Es decir, evita configuraciones como:

    ports:
    - "3306:3306"

    o:

    ports:
    - "27017:27017"

    Los servicios internos deben comunicarse por la red Docker, no necesariamente por puertos públicos.

    Pregunta de reflexión

    Si MySQL no tiene puerto publicado, ¿por qué phpMyAdmin puede seguir conectando con él?


    24. Fase 19 — Personalización del proyecto

    El alumno deberá personalizar la práctica.

    Como mínimo deberá:

    1. Cambiar el nombre de los contenedores.
    2. Cambiar el nombre de la base de datos.
    3. Cambiar usuario y contraseña.
    4. Personalizar la página principal.
    5. Insertar datos propios.
    6. Añadir una nueva tabla en MySQL.
    7. Añadir una nueva colección en MongoDB.
    8. Documentar los cambios realizados.

    Nueva tabla obligatoria

    Crea una tabla llamada servicios.

    Ejemplo:

    CREATE TABLE IF NOT EXISTS servicios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    imagen VARCHAR(100) NOT NULL,
    puerto VARCHAR(20),
    descripcion TEXT
    );

    Inserta al menos cinco servicios:

    • Apache/PHP.
    • MySQL.
    • phpMyAdmin.
    • MongoDB.
    • Mongo Express.

    Preguntas de reflexión

    1. ¿Qué campos has elegido para la tabla servicios?
    2. ¿Por qué has elegido esos campos?
    3. ¿Qué relación existe entre esta tabla y la infraestructura desplegada?
    4. ¿Cómo podrías mostrar esta tabla desde PHP?

    25. Fase 20 — Ampliación opcional

    Para subir nota, puedes realizar una o varias de estas mejoras.

    Opción A — Añadir Nginx como proxy inverso

    Añade un contenedor Nginx que actúe como punto de entrada.

    Debe permitir acceder a la aplicación PHP desde otro puerto o ruta.

    Opción B — Añadir Adminer

    Añade Adminer como alternativa a phpMyAdmin.

    Opción C — Añadir Redis

    Añade Redis como servicio adicional y explica para qué se utiliza.

    Opción D — Crear una aplicación PHP más completa

    La aplicación deberá permitir:

    • Insertar alumnos.
    • Listar alumnos.
    • Borrar alumnos.
    • Editar alumnos.

    Opción E — Crear documentación técnica avanzada

    Incluye:

    • Diagrama de red.
    • Tabla de servicios.
    • Tabla de puertos.
    • Tabla de volúmenes.
    • Tabla de variables de entorno.
    • Problemas encontrados.
    • Soluciones aplicadas.

    26. Documento de memoria

    El documento final debe tener la siguiente estructura:

    Portada

    Debe incluir:

    • Nombre del alumno.
    • Curso.
    • Módulo o asignatura.
    • Nombre de la práctica.
    • Fecha.
    • Profesor.

    Índice

    Debe estar generado o escrito de forma ordenada.

    1. Introducción

    Explica brevemente qué se ha hecho en la práctica.

    2. Objetivos

    Enumera los objetivos técnicos.

    3. Herramientas utilizadas

    Incluye:

    • Sistema operativo.
    • Docker.
    • Docker Compose.
    • Editor de código.
    • Navegador.
    • Terminal.
    • Otros programas usados.

    4. Estructura del proyecto

    Incluye la estructura de carpetas y explica para qué sirve cada una.

    5. Explicación del docker-compose.yml

    No basta con pegar el archivo.

    Hay que explicar:

    • Servicios.
    • Imágenes.
    • Puertos.
    • Volúmenes.
    • Redes.
    • Variables de entorno.
    • Dependencias.

    6. Desarrollo de la aplicación PHP

    Explica:

    • Qué archivos has creado.
    • Cómo se conecta PHP con MySQL.
    • Cómo se insertan datos.
    • Cómo se muestran datos.

    7. Trabajo con MySQL

    Explica:

    • Base de datos creada.
    • Tablas.
    • Registros.
    • Acceso desde phpMyAdmin.
    • Copia de seguridad.

    8. Trabajo con MongoDB

    Explica:

    • Base de datos creada.
    • Colecciones.
    • Documentos.
    • Acceso desde Mongo Express.

    9. Evidencias de funcionamiento

    Incluye capturas claras y comentadas.

    Cada captura debe tener una breve explicación.

    10. Problemas encontrados

    Incluye al menos tres problemas, aunque sean pequeños.

    Ejemplos:

    • Error de puerto ocupado.
    • Error de conexión a MySQL.
    • Contenedor reiniciándose.
    • Variable mal escrita.
    • Volumen que no se reiniciaba.
    • Falta de extensión PHP.

    Para cada problema indica:

    • Qué ocurrió.
    • Cómo lo detectaste.
    • Qué comando usaste.
    • Cómo lo solucionaste.

    11. Preguntas de reflexión

    Incluye todas las preguntas respondidas.

    12. Conclusión

    Explica qué has aprendido y qué mejorarías.


    27. Defensa oral o presencial

    Después de entregar la práctica, el alumno deberá defenderla.

    La defensa puede ser online o presencial.

    El alumno deberá ser capaz de:

    1. Explicar la estructura del proyecto.
    2. Abrir el docker-compose.yml y explicar cada servicio.
    3. Levantar y detener los contenedores.
    4. Mostrar la aplicación funcionando.
    5. Enseñar phpMyAdmin y Mongo Express.
    6. Explicar qué son los volúmenes.
    7. Explicar qué son las redes.
    8. Mostrar los logs de un contenedor.
    9. Explicar cómo hizo la copia de seguridad.
    10. Justificar los problemas encontrados y las soluciones aplicadas.

    28. Preguntas posibles para la defensa

    Estas preguntas se pueden usar para comprobar la autoría real del trabajo.

    Docker básico

    1. ¿Qué es una imagen Docker?
    2. ¿Qué es un contenedor?
    3. ¿Qué diferencia hay entre imagen y contenedor?
    4. ¿Qué comando usas para ver contenedores activos?
    5. ¿Qué comando usas para ver imágenes descargadas?
    6. ¿Qué ocurre si borras un contenedor?
    7. ¿Qué ocurre si borras una imagen?

    Docker Compose

    1. ¿Para qué sirve Docker Compose?
    2. ¿Qué archivo utiliza Docker Compose por defecto?
    3. ¿Qué hace docker compose up -d?
    4. ¿Qué hace docker compose down?
    5. ¿Qué hace docker compose down -v?
    6. ¿Qué diferencia hay entre image y build?
    7. ¿Para qué sirve depends_on?

    Redes

    1. ¿Qué red has creado?
    2. ¿Por qué los contenedores pueden comunicarse usando nombres?
    3. ¿Qué diferencia hay entre una red interna Docker y la red de tu ordenador?
    4. ¿Por qué no es recomendable publicar todos los puertos?

    Volúmenes

    1. ¿Qué volúmenes has creado?
    2. ¿Para qué sirve un volumen?
    3. ¿Dónde guarda MySQL sus datos dentro del contenedor?
    4. ¿Qué pasa si eliminas los volúmenes?
    5. ¿Cómo comprobarías que los datos persisten?

    MySQL y PHP

    1. ¿Cómo se conecta PHP a MySQL?
    2. ¿Qué host usa PHP para conectarse a MySQL?
    3. ¿Por qué el host es mysql y no localhost?
    4. ¿Qué tabla has creado?
    5. ¿Qué consulta SQL has usado?
    6. ¿Qué es una consulta preparada?
    7. ¿Qué error te apareció con PHP y MySQL?

    MongoDB

    1. ¿Qué diferencia hay entre MySQL y MongoDB?
    2. ¿Qué es una colección?
    3. ¿Qué es un documento?
    4. ¿Qué herramienta has usado para administrar MongoDB?
    5. ¿Qué documentos has insertado?

    Seguridad

    1. ¿Qué contraseñas has utilizado?
    2. ¿Son contraseñas seguras?
    3. ¿Qué cambiarías en producción?
    4. ¿Expondrías phpMyAdmin a Internet?
    5. ¿Expondrías MongoDB a Internet?

    Autoría

    1. Enséñame el archivo que más te costó configurar.
    2. Explícame un error concreto que hayas tenido.
    3. Cambia ahora el puerto de la web al 8090.
    4. Añade un nuevo registro a la base de datos.
    5. Para los contenedores y vuelve a levantarlos.
    6. Muéstrame los logs de MySQL.
    7. Entra dentro del contenedor web.
    8. Explica por qué tu aplicación sigue funcionando después de reiniciar los contenedores.
    9. Borra un contenedor y vuelve a crearlo.
    10. Explica qué parte del trabajo has entendido mejor y cuál peor.

    29. Rúbrica de evaluación

    CriterioPeso
    Estructura correcta del proyecto10%
    docker-compose.yml funcional y bien organizado15%
    Uso correcto de redes y volúmenes10%
    Despliegue funcional de Apache/PHP/MySQL/phpMyAdmin15%
    Despliegue funcional de MongoDB/Mongo Express10%
    Aplicación PHP conectada a MySQL10%
    Evidencias y capturas claras10%
    Respuestas de reflexión10%
    Seguridad básica y justificación técnica5%
    Defensa oral/presencial15%

    Total: 100%


    30. Penalizaciones

    Se podrán aplicar penalizaciones por:

    MotivoPenalización
    No entrega de memoriaSuspenso
    No funciona Docker ComposeHasta -40%
    No hay evidencias suficientesHasta -20%
    No responde preguntas de reflexiónHasta -20%
    No sabe defender el trabajoHasta -50%
    Copia evidente sin comprensiónSuspenso
    Archivos desordenados o incompletosHasta -15%
    Contraseñas o datos sensibles expuestos sin explicaciónHasta -10%

    31. Entrega mínima para aprobar

    Para aprobar la práctica es obligatorio:

    1. Entregar el proyecto completo.
    2. Levantar los servicios con Docker Compose.
    3. Mostrar la web PHP funcionando.
    4. Mostrar MySQL funcionando.
    5. Mostrar phpMyAdmin funcionando.
    6. Mostrar MongoDB o Mongo Express funcionando.
    7. Usar al menos un volumen persistente.
    8. Responder las preguntas principales.
    9. Defender el trabajo oralmente.

    32. Entrega excelente

    Una entrega excelente incluirá:

    1. Proyecto ordenado.
    2. docker-compose.yml limpio y comentado.
    3. Uso correcto de .env.
    4. Aplicación PHP personalizada.
    5. Inserción y listado de datos.
    6. MySQL y MongoDB correctamente documentados.
    7. Capturas claras.
    8. Explicaciones propias.
    9. Problemas reales documentados.
    10. Defensa fluida y técnica.
    11. Mejoras opcionales implementadas.
    12. Buena presentación del PDF.

    33. Conclusión para el alumno

    Esta práctica no consiste únicamente en ejecutar comandos. El objetivo es que comprendas cómo se despliega una pequeña infraestructura de servicios usando contenedores.

    Docker permite crear entornos reproducibles, rápidos de montar y fáciles de compartir. Docker Compose permite definir varios servicios en un único archivo y levantar toda la infraestructura con un solo comando.

    Si has completado la práctica correctamente, habrás trabajado conceptos fundamentales para la administración de sistemas y el despliegue de aplicaciones modernas:

    • Servicios.
    • Contenedores.
    • Redes.
    • Puertos.
    • Volúmenes.
    • Bases de datos.
    • Aplicaciones web.
    • Seguridad básica.
    • Documentación técnica.
    • Resolución de problemas.

    Esta práctica está bastante bien como práctica troncal de evaluación. Mi recomendación sería que no la valores solo por “si funciona”, sino por tres cosas: funcionamiento, memoria técnica y defensa. Ahí es donde realmente puedes detectar si el alumno lo ha hecho, lo ha entendido o simplemente lo ha copiado.

  • Mis extensiones de Vs-Code

    Remote – SSH

    Nombre: Remote – SSH
    Autor: Microsoft

    Descripción:
    Permite conectarte a un servidor remoto mediante SSH y abrir carpetas, editar archivos, ejecutar terminal y trabajar exactamente igual que si el proyecto estuviera en tu equipo local. VS Code instala automáticamente un “mini-servidor” en la máquina remota para que todo funcione de forma transparente.

    Qué la hace especial (dato importante):

    • No trabajas sobre copias → trabajas directamente en el servidor
    • Permite usar entornos reales (Linux, Docker host, servidores cloud, Raspberry, etc.)
    • Soporta claves SSH, config ~/.ssh/config, jump hosts y túneles
    • Puedes ejecutar extensiones en remoto (Python, Java, Node, Docker…)
    • Ideal para desarrollo en servidores, laboratorios, contenedores o máquinas virtuales
    • Reduce el clásico caos: “en mi máquina funciona”
  • [Reto] – Aletheia un Sistema de Auditoría y Análisis Forense Automatizado

    [Reto] – Aletheia un Sistema de Auditoría y Análisis Forense Automatizado

    El término aletheia proviene del griego antiguo αλήθεια y significa «verdad», pero con un matiz profundo que va más allá de una simple correspondencia con la realidad; se refiere al «desocultamiento del ser» o al proceso de hacer evidente lo que estaba oculto.

    En entornos profesionales de administración de sistemas, auditoría y ciberseguridad, el análisis de evidencias no se realiza en el equipo personal del analista.
    Los datos —logs, resultados de auditoría, informes técnicos o documentación sensible— se envían a servidores dedicados, diseñados para procesar información de forma controlada, trazable y reproducible.

    El proyecto Aletheia plantea la construcción de uno de estos servidores.

    Aletheia es una máquina independiente dentro de la red cuya función no es almacenar información ni ofrecer servicios al usuario final, sino transformar evidencias técnicas en conocimiento estructurado.
    Para ello, integra un motor de inteligencia artificial local, accesible únicamente desde el propio servidor, que actúa como sistema de análisis y apoyo a la toma de decisiones.

    A diferencia de soluciones basadas en la nube, este servidor:

    • no envía información a terceros,
    • no depende de conectividad externa,
    • y permite mantener control total sobre los datos analizados.

    Durante el desarrollo del proyecto, el alumnado diseñará y desplegará un servicio capaz de:

    • recibir archivos y evidencias técnicas,
    • procesarlos de forma segura y estática,
    • analizarlos desde una perspectiva de auditoría o forense,
    • y generar informes claros, coherentes y reutilizables.

    El objetivo no es “usar IA”, sino integrarla como parte de una arquitectura real de sistemas, entendiendo su papel como herramienta de análisis, no como sustituto del criterio técnico.

    Este proyecto reproduce un escenario habitual en organizaciones reales, donde la inteligencia no reside en el usuario final, sino en la infraestructura que da soporte al análisis.

    Fase 1 — Puesta a punto del servidor

    Requisitos mínimos de la VM

    1. Crea una VM en VirtualBox:
      • Ubuntu Server 22.04/24.04 (64-bit)
      • 4 vCPU
      • 8 GB RAM
      • 40 GB disco
      • Red: Adaptador puente

    Instala Ubuntu Server y crea un usuario (no root), por ejemplo: alumno.


    1) Actualiza el sistema

    sudo apt update && sudo apt -y upgrade
    sudo reboot
    

    2) Instala herramientas base

    Instalar utilidades básicas:

    • curl
    • unzip
    • jq
    • python3
    sudo apt -y install curl unzip jq ca-certificates gnupg python3 python3-venv python3-pip
    

    3) Configura hostname (opcional pero recomendado)

    sudo hostnamectl set-hostname forense-ai
    

    Comprueba:

    hostnamectl
    

    4) Comprueba IP del servidor

    ip a
    

    Fase 2 — Instalar y probar Ollama

    5) Instala Ollama

    curl -fsSL https://ollama.com/install.sh | sh
    

    6) Comprueba que el servicio está activo

    sudo systemctl status ollama --no-pager
    

    7) Descarga un modelo ligero (recomendado para VM)

    ollama pull phi3
    

    8) Prueba que responde

    ollama run phi3 "Resume en 5 líneas qué es una auditoría de sistemas."
    

    Si esto funciona, ya tienes “motor IA” listo.

    Fase 3 — Instalar Apache + PHP (interfaz web)

    9) Instala Apache y PHP

    sudo apt -y install apache2 php libapache2-mod-php
    

    10) Habilita y arranca Apache

    sudo systemctl enable --now apache2
    

    11) Abre el firewall (solo si lo estás usando)

    Si tienes UFW activo:

    sudo ufw allow 'Apache'
    sudo ufw status
    

    12) Comprueba acceso web

    Desde tu PC (host), abre:

    • http://IP_DEL_SERVIDOR/

    Debes ver la página por defecto de Apache.


    Fase 4 — Crear la estructura del servicio “Forense-AI”

    13) Crea carpetas del proyecto

    sudo mkdir -p /var/www/forense-ai/{uploads,results,scripts,logs}
    sudo chown -R www-data:www-data /var/www/forense-ai
    sudo chmod -R 750 /var/www/forense-ai
    

    14) Crea un VirtualHost

    sudo nano /etc/apache2/sites-available/forense-ai.conf
    

    Pega esto:

    <VirtualHost *:80>
        ServerName forense-ai.local
        DocumentRoot /var/www/forense-ai
    
        <Directory /var/www/forense-ai>
            Options -Indexes
            AllowOverride All
            Require all granted
        </Directory>
    
        ErrorLog ${APACHE_LOG_DIR}/forense-ai_error.log
        CustomLog ${APACHE_LOG_DIR}/forense-ai_access.log combined
    </VirtualHost>
    

    Activa el sitio:

    sudo a2ensite forense-ai
    sudo a2dissite 000-default
    sudo systemctl reload apache2
    

    Fase 5 — Servicio web: formulario de subida + análisis

    15) Instala herramientas para extraer texto de PDF

    sudo apt -y install poppler-utils
    

    (trae pdftotext)

    16) Crea el formulario web index.php

    sudo nano /var/www/forense-ai/index.php
    

    Contenido:

    <?php
    $maxSize = 8 * 1024 * 1024; // 8 MB
    $allowed = ['txt','log','pdf'];
    
    function safe_name($name) {
      $name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name);
      return $name;
    }
    
    ?>
    <!doctype html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Forense-AI</title>
      <style>
        body { font-family: Arial, sans-serif; margin: 40px; max-width: 900px; }
        .box { padding: 16px; border: 1px solid #ccc; border-radius: 8px; }
        input, textarea, select { width: 100%; padding: 8px; margin-top: 8px; }
        button { padding: 10px 14px; margin-top: 12px; }
        .small { color: #555; font-size: 0.9em; }
      </style>
    </head>
    <body>
      <h1>Forense-AI — Analizador de evidencias</h1>
      <div class="box">
        <form action="process.php" method="post" enctype="multipart/form-data">
          <label>Evidencia (TXT/LOG/PDF, máx 8 MB)</label>
          <input type="file" name="evidence" required>
    
          <label>Tipo de análisis</label>
          <select name="mode">
            <option value="audit">Auditoría (hallazgos y riesgos)</option>
            <option value="forensic">Forense (línea temporal y eventos)</option>
            <option value="summary">Resumen ejecutivo</option>
          </select>
    
          <label>Contexto (opcional)</label>
          <textarea name="context" rows="4" placeholder="Ej: Esto es un auth.log de un servidor SSH expuesto a Internet..."></textarea>
    
          <button type="submit">Subir y analizar</button>
          <p class="small">El análisis se realiza localmente en el servidor (Ollama). No se envía nada a Internet.</p>
        </form>
      </div>
    </body>
    </html>
    

    17) Crea el script de procesamiento process.php

    sudo nano /var/www/forense-ai/process.php
    

    Contenido:

    <?php
    $uploadDir = __DIR__ . "/uploads/";
    $resultDir = __DIR__ . "/results/";
    $logDir    = __DIR__ . "/logs/";
    
    $maxSize = 8 * 1024 * 1024;
    $allowed = ['txt','log','pdf'];
    
    function safe_name($name) {
      return preg_replace('/[^a-zA-Z0-9._-]/', '_', $name);
    }
    
    function ext($name) {
      $p = pathinfo($name);
      return strtolower($p['extension'] ?? '');
    }
    
    function run_cmd($cmd) {
      $output = [];
      $ret = 0;
      exec($cmd . " 2>&1", $output, $ret);
      return [$ret, implode("\n", $output)];
    }
    
    if (!isset($_FILES['evidence'])) {
      http_response_code(400);
      exit("No file uploaded");
    }
    
    $f = $_FILES['evidence'];
    if ($f['error'] !== UPLOAD_ERR_OK) {
      http_response_code(400);
      exit("Upload error");
    }
    
    if ($f['size'] > $maxSize) {
      http_response_code(400);
      exit("File too large");
    }
    
    $original = $f['name'];
    $extension = ext($original);
    
    if (!in_array($extension, $allowed, true)) {
      http_response_code(400);
      exit("Invalid extension");
    }
    
    $mode = $_POST['mode'] ?? 'audit';
    $context = trim($_POST['context'] ?? '');
    
    $base = date("Ymd_His") . "_" . safe_name($original);
    $dest = $uploadDir . $base;
    
    if (!move_uploaded_file($f['tmp_name'], $dest)) {
      http_response_code(500);
      exit("Failed to save upload");
    }
    
    // Extraer texto
    $textFile = $dest . ".txt";
    if ($extension === 'pdf') {
      // pdftotext
      [$ret, $out] = run_cmd("pdftotext " . escapeshellarg($dest) . " " . escapeshellarg($textFile));
      if ($ret !== 0) {
        http_response_code(500);
        exit("pdftotext failed:\n" . htmlspecialchars($out));
      }
    } else {
      // Copiar tal cual
      copy($dest, $textFile);
    }
    
    // Leer texto (limitamos por tamaño para no petar memoria)
    $raw = file_get_contents($textFile);
    if ($raw === false) {
      http_response_code(500);
      exit("Cannot read extracted text");
    }
    $raw = substr($raw, 0, 50000); // 50k chars (suficiente para práctica)
    
    $promptBase = "Eres un analista de ciberseguridad. Responde en español con formato claro.\n";
    if ($mode === 'audit') {
      $task = "Analiza la evidencia como auditoría. Devuelve: 1) Resumen, 2) Hallazgos (con evidencias), 3) Riesgos, 4) Recomendaciones priorizadas.";
    } elseif ($mode === 'forensic') {
      $task = "Analiza la evidencia con enfoque forense. Devuelve: 1) Resumen, 2) Línea temporal aproximada, 3) Eventos relevantes, 4) Hipótesis, 5) Próximos pasos.";
    } else {
      $task = "Resume la evidencia para un responsable no técnico. Devuelve un resumen ejecutivo y 5 puntos clave.";
    }
    
    $contextPart = $context ? "\nContexto aportado por el usuario:\n" . $context . "\n" : "";
    
    $prompt = $promptBase . $task . $contextPart . "\nEVIDENCIA (texto):\n" . $raw . "\n";
    
    // Llamar a Ollama
    $model = "phi3";
    $cmd = "ollama run " . escapeshellarg($model) . " " . escapeshellarg($prompt);
    
    [$ret, $analysis] = run_cmd($cmd);
    if ($ret !== 0) {
      http_response_code(500);
      exit("Ollama failed:\n" . htmlspecialchars($analysis));
    }
    
    $reportName = basename($dest) . "_informe.md";
    $reportPath = $resultDir . $reportName;
    
    $report = "# Informe Forense-AI\n\n"
            . "- Archivo: **" . htmlspecialchars($original) . "**\n"
            . "- Fecha: **" . date("Y-m-d H:i:s") . "**\n"
            . "- Modo: **" . htmlspecialchars($mode) . "**\n\n"
            . "---\n\n"
            . $analysis . "\n";
    
    file_put_contents($reportPath, $report);
    
    // Log básico
    file_put_contents($logDir . "activity.log",
      date("c") . " file=" . $base . " mode=" . $mode . " ip=" . ($_SERVER['REMOTE_ADDR'] ?? 'unknown') . "\n",
      FILE_APPEND
    );
    
    header("Location: result.php?f=" . urlencode($reportName));
    

    18) Crea la página de resultados result.php

    sudo nano /var/www/forense-ai/result.php
    

    Contenido:

    <?php
    $resultDir = __DIR__ . "/results/";
    $f = $_GET['f'] ?? '';
    $f = basename($f); // evita traversal
    $path = $resultDir . $f;
    
    if (!$f || !file_exists($path)) {
      http_response_code(404);
      exit("Report not found");
    }
    
    $txt = file_get_contents($path);
    ?>
    <!doctype html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Resultado — Forense-AI</title>
      <style>
        body { font-family: Arial, sans-serif; margin: 40px; max-width: 900px; }
        pre { white-space: pre-wrap; border: 1px solid #ccc; padding: 16px; border-radius: 8px; }
        a { display:inline-block; margin-top: 12px; }
      </style>
    </head>
    <body>
      <h1>Informe generado</h1>
      <a href="download.php?f=<?php echo urlencode($f); ?>">Descargar informe</a>
      <pre><?php echo htmlspecialchars($txt); ?></pre>
      <a href="index.php">⬅ Volver</a>
    </body>
    </html>
    

    19) Crea el descargador download.php

    sudo nano /var/www/forense-ai/download.php
    

    Contenido:

    <?php
    $resultDir = __DIR__ . "/results/";
    $f = $_GET['f'] ?? '';
    $f = basename($f);
    $path = $resultDir . $f;
    
    if (!$f || !file_exists($path)) {
      http_response_code(404);
      exit("Not found");
    }
    
    header('Content-Type: text/markdown; charset=utf-8');
    header('Content-Disposition: attachment; filename="' . $f . '"');
    readfile($path);
    

    Fase 6 — Permisos y seguridad mínima del servicio

    20) Permisos finales (muy importante)

    sudo chown -R www-data:www-data /var/www/forense-ai
    sudo find /var/www/forense-ai -type d -exec chmod 750 {} \;
    sudo find /var/www/forense-ai -type f -exec chmod 640 {} \;
    sudo systemctl reload apache2
    

    21) Importante: Ollama solo local

    Comprueba que Ollama no está expuesto:

    • El servicio web llama a ollama run localmente.
    • No hace falta abrir puertos de Ollama.

    Fase 7 — Pruebas obligatorias (para entregar)

    22) Caso de prueba A (Auditoría)

    1. Sube un auth.log (o un ejemplo creado por vosotros)
    2. Modo: Auditoría
    3. Debe devolver hallazgos y recomendaciones

    23) Caso de prueba B (Forense)

    1. Sube una salida de nmap guardada como TXT
    2. Modo: Forense
    3. Debe generar hipótesis y próximos pasos

    24) Caso de prueba C (PDF)

    1. Sube un PDF técnico (manual, informe)
    2. Modo: Resumen ejecutivo
    3. Debe resumir y extraer puntos clave
  • Etica para Ingenieros – 11 Mapa conceptual

    MAPA CONCEPTUAL — Ética para ingenieros


    🌍 INGENIERÍA

    ➜ no es solo técnica

    ➜ es una PROFESIÓN SOCIAL

    • Basada en conocimiento especializado
    • Reconocida socialmente
    • Con poder transformador
    • Fundada en la confianza pública

    ⬇️
    ➡️ Toda profesión genera responsabilidades éticas


    🧱 1. LA INGENIERÍA COMO PROFESIÓN SOCIAL (Cap. 1)

    • Actúa dentro de la sociedad
    • Produce efectos colectivos
    • No es neutral ni individual

    ➡️ El ingeniero:

    • No trabaja solo para un cliente
    • Trabaja indirectamente para la sociedad
    • Tiene responsabilidad pública

    🌐 2. TECNOLOGÍA Y SOCIEDAD (Cap. 2)

    La tecnología:

    • No es una herramienta aislada
    • Es un sistema social

    Influye en:

    • Economía
    • Política
    • Cultura
    • Formas de vida

    ❌ Mito: “la tecnología es neutral”
    ✅ Realidad: la tecnología incorpora valores

    ➡️ Diseñar tecnología = diseñar sociedad


    🧪 3. FENÓMENO TECNOCIENTÍFICO (Cap. 3)

    Tecnociencia =

    • Ciencia + Tecnología + Organización + Poder

    Características:

    • Orientada a la aplicación
    • Condicionada por intereses
    • Generadora de impactos sociales

    ❌ Ingeniero = ejecutor neutral
    ✅ Ingeniero = actor moral

    ➡️ Toda decisión técnica contiene una decisión ética


    ⚠️ 4. SOCIEDAD DEL RIESGO (Cap. 5)

    La sociedad actual:

    • Produce riesgos tecnológicos
    • Vive con incertidumbre

    Riesgos:

    • Globales
    • Complejos
    • A veces irreversibles
    • Desigualmente repartidos

    ➡️ El ingeniero:

    • No solo gestiona riesgos
    • Contribuye a crearlos

    ➡️ El riesgo es:

    • Técnico ❌
    • Ético y social ✅

    🧭 5. VIRTUD DE LA PRUDENCIA (Cap. 6)

    La prudencia NO es:

    • Miedo
    • Inmovilismo

    La prudencia ES:

    • Juicio racional
    • Reconocimiento de límites
    • Deliberación antes de actuar

    Exige:

    • Anticipar consecuencias
    • Pensar a largo plazo
    • Saber decir “no”

    ➡️ Prudencia = forma concreta de la responsabilidad


    🧠 6. DECISIÓN RACIONAL Y ÉTICA (Cap. 7)

    La ética:

    • Se concreta en decisiones

    Decisión ética:

    • No es automática
    • No es solo técnica
    • Es deliberativa

    Incluye:

    • Análisis de alternativas
    • Evaluación de consecuencias
    • Conflictos de valores
    • Justificación racional

    ➡️ No decidir = decidir
    ➡️ Toda decisión implica responsabilidad


    ⚖️ 7. PRINCIPIO DE RESPONSABILIDAD (Cap. 8)

    Responsabilidad ampliada:

    • Por acción
    • Por omisión
    • Individual y colectiva
    • Presente y futura

    El ingeniero responde ante:

    • Clientes
    • Empresas
    • Sociedad
    • Generaciones futuras

    Principio de precaución:

    • No todo lo posible es aceptable
    • La incertidumbre no exime de responsabilidad

    ➡️ A mayor poder técnico → mayor responsabilidad ética


    🏢 8. ORGANIZACIONES Y CÓDIGOS PROFESIONALES (Cap. 9)

    La ingeniería se ejerce en:

    • Empresas
    • Instituciones
    • Administraciones

    Riesgos:

    • Dilución de responsabilidad
    • Obediencia acrítica
    • Presión económica

    Códigos profesionales:

    • Expresan valores colectivos
    • Orientan la conducta
    • No sustituyen al juicio moral

    ➡️ Ética = coherencia entre:

    • Individuo
    • Profesión
    • Organización

    🎯 CONCEPTO CENTRAL DEL LIBRO

    La ingeniería construye el mundo en que vivimos,
    y por eso no puede renunciar a la responsabilidad moral sobre ese mundo.


    🧠 IDEAS CLAVE TRANSVERSALES

    • No existe neutralidad técnica
    • La ética no es un añadido, es parte de la profesión
    • La responsabilidad aumenta con el poder técnico
    • El ingeniero es agente moral
    • El riesgo es ético y social
    • La prudencia guía la acción
    • Decidir es asumir consecuencias
    • La ética sostiene la confianza social

    🧩 SÍNTESIS FINAL (MAPA EN UNA FRASE)

    Ingeniería → Tecnología → Sociedad → Riesgo → Decisión → Responsabilidad → Ética

  • Etica para Ingenieros – 10 Conclusiones finales

    📘 Ética para ingenieros — Resumen total y conclusiones

    1️⃣ Qué tipo de libro es y qué pretende

    Ética para ingenieros no es un manual de normas ni un código de conducta, sino una obra de reflexión ética profunda que busca responder a una pregunta central:

    ¿Qué significa ser ingeniero en una sociedad tecnológicamente avanzada y moralmente vulnerable?

    El libro no se limita a decir qué está bien o mal, sino que:

    • Analiza el contexto social de la ingeniería
    • Explica por qué la ética es inseparable de la técnica
    • Fundamenta la responsabilidad moral del ingeniero
    • Ofrece criterios para decidir éticamente en situaciones reales

    Su objetivo final es formar ingenieros responsables, no solo técnicamente competentes.


    2️⃣ Idea central que recorre todo el libro

    La ingeniería es una profesión social con un enorme poder transformador, y ese poder exige una responsabilidad ética proporcional.

    No existe:

    • Ingeniería neutral
    • Técnica sin valores
    • Decisión puramente técnica

    Cada decisión de ingeniería:

    • Incorpora valores
    • Produce consecuencias sociales
    • Afecta a personas presentes y futuras

    3️⃣ Grandes ejes conceptuales del libro

    El libro se articula alrededor de cinco grandes ejes éticos, que se van construyendo progresivamente.


    🧱 1. La ingeniería como profesión social

    La ingeniería:

    • No es solo una actividad técnica
    • Es una profesión socialmente reconocida
    • Basada en la confianza pública

    Esto implica que el ingeniero:

    • No trabaja solo para un cliente o empresa
    • Trabaja indirectamente para la sociedad
    • Tiene deberes que van más allá del contrato laboral

    ➡️ Ser ingeniero implica una responsabilidad pública.


    🌍 2. Tecnología, sociedad y poder

    La tecnología:

    • No es una simple herramienta
    • Es un sistema que configura la sociedad

    Influye en:

    • Economía
    • Política
    • Cultura
    • Relaciones humanas
    • Formas de vida

    Por tanto:

    • No es neutral
    • No es inevitable
    • No es ajena a valores

    ➡️ Diseñar tecnología es, en parte, diseñar sociedad.


    🧪 3. La tecnociencia y la falsa neutralidad

    Vivimos en una era de tecnociencia, donde:

    • Ciencia y tecnología están entrelazadas
    • La investigación responde a intereses económicos y políticos
    • Las decisiones técnicas ya contienen decisiones morales

    El libro desmonta definitivamente la idea de que:

    “La técnica solo ejecuta; otros deciden”

    ➡️ El ingeniero es un actor moral, no un mero ejecutor.


    ⚠️ 4. La sociedad del riesgo

    El progreso tecnológico genera:

    • Beneficios
    • Pero también riesgos creados por la propia acción humana

    Estos riesgos son:

    • Globales
    • Complejos
    • A veces irreversibles
    • Distribuidos de forma desigual

    El ingeniero:

    • No solo gestiona riesgos
    • Contribuye a producirlos

    ➡️ El riesgo no es solo un problema técnico, sino ético y social.


    🧭 5. Prudencia, decisión y responsabilidad

    Ante la incertidumbre, el libro propone tres pilares éticos fundamentales:

    🔹 Prudencia

    • Reconocer límites del conocimiento
    • Deliberar antes de actuar
    • Saber decir “no” cuando es necesario

    🔹 Decisión racional

    • Integrar técnica y valores
    • Justificar las decisiones
    • Asumir consecuencias

    🔹 Responsabilidad

    • Por acción y por omisión
    • Individual y colectiva
    • Presente y futura

    ➡️ La ética del ingeniero se concreta en cómo decide y de qué se hace responsable.


    4️⃣ El papel de las organizaciones y los códigos

    El libro no idealiza la realidad profesional:

    • El ingeniero trabaja en organizaciones
    • Hay presiones económicas, jerárquicas y temporales
    • Existe riesgo de diluir la responsabilidad

    Los códigos profesionales:

    • Son necesarios
    • Expresan valores colectivos
    • Orientan la conducta

    Pero:

    • No sustituyen al juicio moral personal
    • No eliminan los dilemas éticos

    ➡️ La ética requiere coherencia entre individuo, profesión y organización.


    5️⃣ Conceptos clave del libro (para memorizar)

    • Ingeniería como profesión social
    • No neutralidad tecnológica
    • Tecnociencia
    • Sociedad del riesgo
    • Responsabilidad ampliada
    • Prudencia
    • Decisión racional y deliberativa
    • Responsabilidad por acción y omisión
    • Justicia en la distribución del riesgo
    • Códigos profesionales
    • Ética organizacional
    • Confianza y legitimidad social

    6️⃣ Mensajes finales del libro

    El libro deja varios mensajes contundentes:

    • La excelencia técnica no basta
    • La ética no frena el progreso, lo orienta
    • No todo lo técnicamente posible es éticamente aceptable
    • La ignorancia voluntaria no exime de responsabilidad
    • La obediencia no justifica decisiones injustas
    • El ingeniero debe pensar en las consecuencias de su trabajo
    • La confianza social depende de la responsabilidad profesional

    7️⃣ ¿Qué debemos concluir tras leer este libro?

    Tras su lectura, la conclusión fundamental es clara:

    Ser ingeniero no es solo saber hacer cosas, sino hacerse cargo de lo que esas cosas provocan en el mundo.

    Un buen ingeniero es:

    • Competente técnicamente
    • Prudente en la acción
    • Responsable en la decisión
    • Honesto en la información
    • Consciente del impacto social de su trabajo

    El libro nos obliga a aceptar que:

    • La ética no es opcional
    • No es una asignatura “blanda”
    • Es parte esencial del ejercicio profesional

    8️⃣ Conclusión final (frase síntesis)

    La ingeniería construye el mundo en que vivimos; por eso, no puede renunciar a la responsabilidad moral sobre ese mundo.

  • Etica para ingenieros – 9 Códigos profesionales y ética organizacional

    Capítulo 9 — Códigos profesionales y ética organizacional

    (Resumen muy extenso y desarrollado)

    El Capítulo 9 funciona como culminación práctica de toda la obra. Tras haber fundamentado la ética de la ingeniería en la responsabilidad, la prudencia y la decisión racional, los autores analizan ahora cómo se articula esa ética en la realidad profesional concreta, marcada por organizaciones, empresas, administraciones y marcos institucionales.

    La pregunta central del capítulo es:

    ¿Cómo puede sostenerse la ética del ingeniero cuando este trabaja dentro de organizaciones complejas que imponen objetivos, normas y presiones propias?


    1️⃣ La ingeniería como práctica institucionalizada

    El capítulo parte de una constatación básica:

    • El ingeniero rara vez actúa de manera individual
    • Su trabajo se desarrolla casi siempre en:
      • Empresas
      • Administraciones públicas
      • Instituciones
      • Grandes organizaciones tecnológicas

    Esto implica que:

    • Las decisiones técnicas están condicionadas
    • Existen jerarquías, objetivos económicos y plazos
    • La autonomía profesional es real pero limitada

    ➡️ La ética del ingeniero debe enfrentarse al marco organizacional, no ignorarlo.


    2️⃣ El riesgo de dilución de la responsabilidad

    Uno de los problemas centrales que analiza el capítulo es la dilución de la responsabilidad.

    En las organizaciones:

    • Las decisiones se fragmentan
    • Las tareas se especializan
    • La responsabilidad se reparte

    Esto favorece actitudes como:

    • “Yo solo hago mi parte”
    • “La decisión viene de arriba”
    • “El sistema es así”

    Los autores advierten con claridad:

    La responsabilidad compartida no significa responsabilidad inexistente.

    Cada ingeniero sigue siendo moralmente responsable de:

    • Sus decisiones
    • Sus informes
    • Sus silencios
    • Sus omisiones

    3️⃣ Códigos profesionales: qué son y para qué sirven

    El capítulo introduce los códigos profesionales o deontológicos como uno de los principales instrumentos éticos de la profesión.

    Un código profesional es:

    • Un conjunto de principios y normas
    • Elaborado por la propia profesión
    • Que orienta el ejercicio responsable

    Sus funciones principales son:

    • Expresar los valores de la profesión
    • Orientar la conducta en situaciones conflictivas
    • Proteger a la sociedad
    • Proteger la integridad del profesional

    ➡️ No son simples reglamentos, sino expresiones del compromiso ético colectivo de la profesión.


    4️⃣ Alcance y límites de los códigos deontológicos

    Los autores analizan con realismo los límites de los códigos profesionales.

    Un código:

    • No sustituye al juicio moral personal
    • No resuelve automáticamente los dilemas
    • No puede prever todas las situaciones

    Además:

    • Puede ser interpretado de forma interesada
    • Puede quedar subordinado a la lógica empresarial
    • Puede convertirse en un documento meramente formal

    Por ello:

    El código es una guía, no un sustituto de la conciencia ética.


    5️⃣ Ética organizacional y cultura ética

    El capítulo amplía la reflexión hacia la ética de las organizaciones.

    Las organizaciones:

    • No son moralmente neutras
    • Generan culturas internas
    • Premian ciertos comportamientos y castigan otros

    Una organización puede:

    • Fomentar la responsabilidad y la transparencia
    • O incentivar la obediencia ciega, el silencio y la competitividad extrema

    La ética profesional del ingeniero:

    • Se ve profundamente afectada por la cultura organizacional
    • Puede fortalecerse o erosionarse según el entorno

    6️⃣ Conflictos entre ética profesional y objetivos organizativos

    El capítulo analiza uno de los conflictos más frecuentes:

    • Ética profesional vs. objetivos empresariales
    • Responsabilidad social vs. rentabilidad
    • Seguridad vs. reducción de costes
    • Transparencia vs. imagen corporativa

    En estos conflictos:

    • El ingeniero se encuentra bajo presión
    • Puede sufrir aislamiento o represalias
    • Puede verse tentado a ceder

    Los autores subrayan que:

    La ética profesional exige, en ocasiones, resistir presiones organizativas.


    7️⃣ Lealtad profesional y lealtad ética

    Un punto especialmente relevante del capítulo es la distinción entre:

    • Lealtad a la empresa
    • Lealtad a la profesión
    • Lealtad a la sociedad

    La lealtad profesional:

    • No puede confundirse con obediencia incondicional
    • Tiene límites éticos claros

    Cuando una organización exige actuaciones:

    • Injustas
    • Peligrosas
    • Engañosas

    El ingeniero:

    • Tiene el deber de cuestionar
    • Advertir
    • Y, en casos extremos, negarse a colaborar

    8️⃣ El papel del ingeniero como agente ético dentro de la organización

    El capítulo no presenta al ingeniero como una víctima pasiva del sistema, sino como un agente moral activo.

    El ingeniero puede:

    • Introducir criterios éticos en las decisiones
    • Favorecer la deliberación
    • Hacer visibles los riesgos
    • Defender estándares profesionales

    Esto requiere:

    • Coraje moral
    • Prudencia
    • Apoyo institucional
    • Códigos profesionales sólidos

    9️⃣ Ética organizacional y responsabilidad social

    Los autores conectan la ética organizacional con la responsabilidad social.

    Las organizaciones tecnológicas:

    • Influyen en la sociedad
    • Generan impactos amplios
    • No pueden limitarse al beneficio económico

    La ética profesional del ingeniero:

    • Es un elemento clave de la responsabilidad social corporativa
    • No puede delegarse solo en departamentos formales

    ➡️ La ética debe integrarse en la práctica cotidiana, no quedarse en declaraciones institucionales.


    🔟 Cierre del libro: ética, profesión y sociedad

    El capítulo 9 cierra el libro retomando sus ideas centrales:

    • La ingeniería es una profesión socialmente poderosa
    • Ese poder exige responsabilidad
    • La ética es parte esencial de la identidad profesional
    • Ni los códigos ni las organizaciones sustituyen al juicio moral del ingeniero

    El mensaje final es claro:

    La ética de la ingeniería solo es posible si se sostiene simultáneamente en la conciencia personal, la profesión y las instituciones.


    🧠 Ideas clave del Capítulo 9 (síntesis final)

    • La ingeniería se ejerce en organizaciones, no en el vacío
    • La estructura organizativa puede diluir la responsabilidad
    • Los códigos profesionales expresan valores colectivos
    • Los códigos orientan, pero no sustituyen al juicio moral
    • La cultura organizacional influye decisivamente en la conducta ética
    • La lealtad a la empresa tiene límites éticos
    • El ingeniero es un agente moral dentro de la organización
    • La ética profesional es parte de la responsabilidad social
    • La ética requiere coherencia entre individuo, profesión y organización
  • Etica para ingenieros – 8 El principio de responsabilidad

    (Resumen muy extenso y desarrollado)

    El Capítulo 8 profundiza en el concepto que atraviesa toda la ética de la ingeniería: la responsabilidad. Tras analizar la sociedad del riesgo (cap. 5), la prudencia (cap. 6) y la decisión racional (cap. 7), los autores se centran ahora en responder a una pregunta decisiva:

    ¿De qué es responsable el ingeniero y hasta dónde llega esa responsabilidad?

    Este capítulo sostiene que el desarrollo tecnocientífico ha ampliado enormemente el alcance de la acción humana, y que a mayor poder técnico, mayor exigencia de responsabilidad ética.


    1️⃣ El nuevo alcance de la acción técnica

    El capítulo comienza señalando que la acción técnica contemporánea:

    • Tiene un alcance sin precedentes
    • Afecta a grandes colectivos
    • Produce efectos a largo plazo
    • Puede generar daños irreversibles

    La ingeniería actual:

    • Ya no actúa solo en el presente
    • Interviene en el futuro
    • Condiciona la vida de generaciones que no pueden participar en la decisión

    ➡️ Esto obliga a repensar el concepto clásico de responsabilidad, limitado tradicionalmente al daño inmediato y visible.


    2️⃣ El principio de responsabilidad como exigencia ética central

    Los autores adoptan y desarrollan el principio de responsabilidad como núcleo de la ética de la ingeniería.

    Este principio implica que:

    • El ingeniero debe responder por las consecuencias previsibles de su acción
    • No basta con cumplir órdenes o normas
    • No basta con actuar conforme a la legalidad vigente

    La responsabilidad ética exige:

    • Reflexión
    • Anticipación
    • Asunción consciente de consecuencias

    3️⃣ Responsabilidad por acción y por omisión

    Uno de los puntos clave del capítulo es la ampliación del concepto de responsabilidad.

    El ingeniero es responsable:

    • Por lo que hace
    • Por lo que permite
    • Por lo que omite, cuando podría haber actuado razonablemente

    La omisión:

    • No es neutral
    • Puede causar tanto daño como la acción directa

    Ejemplo conceptual:

    • No advertir de un riesgo conocido
    • No oponerse a una decisión peligrosa
    • Callar por miedo o comodidad

    ➡️ La responsabilidad ética incluye el deber de advertir y de resistir decisiones irresponsables.


    4️⃣ Responsabilidad y previsión razonable

    El capítulo aclara que:

    • No se puede exigir al ingeniero prever todo
    • No se le puede responsabilizar de consecuencias absolutamente imprevisibles

    La responsabilidad se vincula a:

    • Consecuencias razonablemente previsibles
    • Riesgos conocidos o sospechados
    • Información disponible en el momento de decidir

    Esto introduce un criterio clave:

    La ignorancia culpable no exime de responsabilidad.

    El ingeniero tiene el deber de:

    • Informarse
    • Consultar
    • Actualizar conocimientos
    • No decidir desde la negligencia

    5️⃣ Responsabilidad en contextos de incertidumbre

    Uno de los retos centrales del capítulo es abordar la responsabilidad en un contexto de incertidumbre estructural.

    Los autores subrayan que:

    • La incertidumbre no elimina la responsabilidad
    • La falta de certeza no justifica la irresponsabilidad

    En ingeniería:

    • Muchas decisiones se toman sin garantías absolutas
    • Pero sí con grados de probabilidad y riesgo

    La responsabilidad ética exige:

    • Prudencia
    • Precaución
    • Honestidad sobre los límites del conocimiento

    6️⃣ Responsabilidad hacia terceros y generaciones futuras

    El capítulo amplía el horizonte moral de la responsabilidad:

    El ingeniero es responsable no solo ante:

    • Clientes
    • Empresas
    • Superiores jerárquicos

    Sino también ante:

    • Usuarios
    • Ciudadanos
    • Colectivos vulnerables
    • Generaciones futuras

    Esta ampliación es clave porque:

    • Muchas decisiones técnicas afectan a personas ausentes
    • Que no pueden consentir ni defenderse

    ➡️ La responsabilidad ética trasciende el contrato profesional inmediato.


    7️⃣ Responsabilidad individual y responsabilidad colectiva

    Los autores analizan una tensión central en la práctica profesional:

    • Las decisiones son colectivas
    • Pero la responsabilidad no desaparece

    El hecho de trabajar en:

    • Empresas
    • Administraciones
    • Equipos técnicos

    No exime al ingeniero de responsabilidad personal.

    La responsabilidad es:

    • Compartida
    • Pero no diluida

    Cada profesional debe:

    • Asumir su parte
    • No esconderse en la estructura organizativa

    8️⃣ Responsabilidad, poder y legitimidad social

    El capítulo subraya que:

    • La sociedad concede poder a los ingenieros
    • A cambio exige responsabilidad

    La legitimidad social de la ingeniería:

    • Depende de que ese poder se ejerza éticamente
    • Se rompe cuando se percibe irresponsabilidad, negligencia o ocultación

    Por eso:

    La responsabilidad ética es condición de la confianza social.

    Sin responsabilidad:

    • Aparece desconfianza
    • Rechazo social
    • Crisis de legitimidad de la tecnología

    9️⃣ El principio de precaución

    El capítulo introduce la relación entre responsabilidad y principio de precaución.

    Cuando:

    • Los riesgos son graves
    • Las consecuencias pueden ser irreversibles
    • El conocimiento es limitado

    La responsabilidad exige:

    • Extremar la prudencia
    • Evitar decisiones precipitadas
    • No trasladar el riesgo injustamente a otros

    El principio de precaución:

    • No implica paralizar la innovación
    • Implica no actuar de forma temeraria

    🔟 Responsabilidad como núcleo de la identidad profesional

    El capítulo concluye afirmando que:

    • La responsabilidad no es una carga externa
    • Es parte esencial de ser ingeniero

    Un buen ingeniero:

    • No es solo técnicamente competente
    • Es moralmente responsable

    La responsabilidad:

    • Da sentido al ejercicio profesional
    • Justifica la autonomía técnica
    • Fundamenta la confianza social

    🧠 Ideas clave del Capítulo 8 (síntesis final)

    • El poder técnico amplía el alcance de la responsabilidad
    • El ingeniero responde por acción y por omisión
    • La responsabilidad se basa en previsión razonable, no en omnisciencia
    • La incertidumbre no elimina la exigencia ética
    • La responsabilidad se extiende a terceros y generaciones futuras
    • La organización no exime de responsabilidad personal
    • La responsabilidad es condición de la confianza social
    • El principio de precaución es una expresión de la responsabilidad
    • La responsabilidad es núcleo de la identidad profesional del ingeniero
  • Etica para ingenieros – 7 Decisión racional y ética

    Capítulo 7 — Decisión racional y ética

    (Resumen muy extenso y desarrollado)

    El Capítulo 7 aborda directamente el núcleo práctico de la ética de la ingeniería: la toma de decisiones. Tras haber analizado la sociedad del riesgo (cap. 5) y la virtud de la prudencia (cap. 6), los autores se preguntan ahora:

    ¿Cómo debe decidir racionalmente un ingeniero cuando se enfrenta a dilemas éticos reales?

    Este capítulo rechaza tanto la improvisación moral como la aplicación mecánica de reglas, y propone una concepción racional, deliberativa y responsable de la decisión ética en contextos tecnocientíficos complejos.


    1️⃣ La decisión como núcleo de la acción profesional

    El capítulo parte de una idea fundamental:

    La ética profesional se concreta en decisiones.

    No basta con:

    • Tener buenos principios
    • Conocer códigos deontológicos
    • Afirmar valores generales

    La ética se pone a prueba cuando:

    • Hay que elegir entre alternativas
    • Existen consecuencias negativas inevitables
    • Hay intereses contrapuestos
    • La información es incompleta

    La ingeniería es, por tanto, una actividad decisional, no solo ejecutiva.


    2️⃣ El carácter racional de la decisión ética

    Los autores subrayan que la decisión ética:

    • No es arbitraria
    • No es puramente emocional
    • No es subjetiva

    Es una decisión racional, pero no en el sentido estrecho del cálculo técnico.

    La racionalidad ética:

    • Integra datos técnicos
    • Considera valores morales
    • Evalúa consecuencias
    • Atiende a las personas afectadas

    ➡️ Decidir éticamente es deliberar racionalmente sobre lo que debe hacerse, no solo sobre lo que puede hacerse.


    3️⃣ Límites del modelo puramente técnico de decisión

    El capítulo critica los modelos de decisión basados exclusivamente en:

    • Optimización
    • Eficiencia
    • Coste-beneficio
    • Maximización de resultados

    Estos modelos:

    • Son necesarios
    • Pero insuficientes

    Porque:

    • No captan valores como justicia, dignidad o responsabilidad
    • Tienden a reducir los problemas morales a cifras
    • Pueden legitimar decisiones injustas si son “eficientes”

    ➡️ La racionalidad técnica no agota la racionalidad ética.


    4️⃣ Decisiones en contextos de incertidumbre

    Uno de los aspectos centrales del capítulo es la toma de decisiones bajo incertidumbre.

    En ingeniería:

    • No se conocen todas las consecuencias
    • No se pueden prever todos los riesgos
    • No existe certeza absoluta

    Los autores señalan que:

    • La falta de certeza no justifica la irresponsabilidad
    • Decidir sin garantías no equivale a decidir sin criterios

    Aquí se conecta directamente con la prudencia:

    • La decisión racional reconoce los límites del conocimiento
    • Pero no renuncia a actuar responsablemente

    5️⃣ Conflictos de valores y dilemas éticos

    El capítulo analiza la existencia de conflictos reales de valores, que dan lugar a dilemas éticos.

    Ejemplos conceptuales:

    • Seguridad vs. coste
    • Eficiencia vs. equidad
    • Innovación vs. precaución
    • Beneficio privado vs. interés público

    En estos casos:

    • No hay soluciones perfectas
    • Toda decisión implica algún daño o renuncia

    La ética no consiste en:

    • Eliminar el conflicto
      Sino en:

    Justificar racionalmente por qué se elige una opción y no otra.


    6️⃣ La deliberación ética como proceso

    Los autores proponen entender la decisión ética como un proceso deliberativo, no como un acto instantáneo.

    Este proceso incluye:

    1. Análisis de la situación
    2. Identificación de alternativas
    3. Evaluación de consecuencias previsibles
    4. Consideración de los valores implicados
    5. Atención a las personas afectadas
    6. Asunción de responsabilidades

    La deliberación:

    • Reduce la arbitrariedad
    • Aumenta la calidad moral de la decisión
    • Hace explícitos los criterios utilizados

    7️⃣ Dimensión colectiva de la decisión

    El capítulo insiste en que:

    • Muchas decisiones en ingeniería no son individuales
    • Se toman en equipos, empresas e instituciones

    Esto introduce una dimensión ética adicional:

    • Responsabilidad compartida
    • Necesidad de diálogo
    • Importancia del contraste de puntos de vista

    La decisión racional exige:

    • Escuchar a otros profesionales
    • Considerar opiniones discrepantes
    • Evitar el aislamiento decisional

    ➡️ La deliberación colectiva es una exigencia ética en contextos complejos.


    8️⃣ Decisión ética y responsabilidad

    Decidir implica siempre asumir responsabilidad.

    Los autores subrayan que:

    • No decidir también es una forma de decidir
    • La pasividad puede tener consecuencias graves

    El ingeniero es responsable:

    • De lo que hace
    • De lo que permite
    • De lo que omite cuando podría actuar

    La decisión ética:

    • No elimina el riesgo
    • Pero asume conscientemente sus consecuencias

    9️⃣ Justificación pública de las decisiones

    Un aspecto especialmente relevante del capítulo es la idea de justificación pública.

    Las decisiones éticas:

    • Deben poder explicarse
    • Deben ser defendibles racionalmente
    • Deben resistir el escrutinio social

    Esto implica:

    • Transparencia
    • Argumentación
    • Honestidad

    La legitimidad ética de una decisión:

    No depende solo del resultado, sino de la calidad del proceso que la ha generado.


    🔟 Decisión racional como competencia ética del ingeniero

    El capítulo concluye afirmando que:

    • Saber decidir éticamente es una competencia profesional
    • No es solo una cualidad personal

    Por ello:

    • Debe enseñarse
    • Practicarse
    • Evaluarse

    La ética profesional no es:

    • Un código aprendido de memoria
    • Sino una capacidad de juicio racional en situaciones complejas

    🧠 Ideas clave del Capítulo 7 (síntesis final)

    • La ética profesional se concreta en decisiones
    • Decidir éticamente es un acto racional y deliberativo
    • La racionalidad técnica es necesaria pero insuficiente
    • La incertidumbre no elimina la responsabilidad
    • Los dilemas éticos implican conflictos reales de valores
    • La deliberación mejora la calidad moral de las decisiones
    • La decisión ética tiene una dimensión colectiva
    • La responsabilidad incluye acción y omisión
    • Las decisiones deben poder justificarse públicamente
    • La capacidad de decidir éticamente es una competencia profesional