domingo, 26 de julio de 2009

Appliance Redmine con Ubuntu JeOS (3-Puliendo Redmine)

Para probar Redmine por primera vez en la Intranet del trabajo usé una máquina virtual limpia con Redmine Bitnami Stack, porque instalar los componentes a mano es muy tedioso (pero no imposible). Pero en cuanto se empezaron a animar a usarlo más y más usuarios, se empezaron a crear proyectos a patadas, se subió el tamaño de adjuntos de 5 a 10 Mb. y se vió que había problemas de rendimiento. En un primer momento se pensó que era por los procesos de Mongrel; cada nodo responde a una petición y si ya está procesando algo aparecen los retrasos en las respuestas. Se añadieron nodos de Mongrel y el tiempo de respuesta mejoró, pero no lo suficiente... El nº de nodos de Mongrel viene por defecto a 2, tengo unos 30 usuarios con un uso moderado y, tras las pruebas, con 3 nodos rinde perfectamente (VMware 1 CPU, 256 Mb. RAM). Supongo que no se pueden meter nodos ilimitadamente, pues consumen 50-70 Mb. de RAM cada uno y hacen un uso exhaustivo de la CPU, asi que en caso de necesitar más potencia habría que balancear entre varias máquinas.



Luego vino el problema de la administración y configuración de la propia máquina y de Redmine, que se solventó usando Webmin (ver entrada anterior), para que los no iniciados en Linux puedan realizar tareas básicas.

Los usuarios se quejaban de acceder a traves de una IP, así que hubo que asignar un nombre a la máquina a través del servidor DHCP. Luego se quejaron del /Redmine de la URL y hubo que quitarlo tocando la configuración de Apache, asi como crear un proxy para balancear con el cluster de Mongrel:

httpd.conf

redmine.conf

Otro problema son las copias de seguridad de la máquina virtual, ya que su tamaño no hace más que crecer por los ficheros adjuntos, la base de datos y los logs... Así que ¿cómo montar esto con lo mínimo? A ver, si ya tengo un servidor de bases de datos y otro de ficheros, ambos con los backups ya programados, ¿por qué complicarme con más servidores?

Para la configuración de red y cambiar el nombre de la máquina virtual me valgo de un servidor DHCP (Windows Server) donde, en una reserva por MAC, le puedo activar la opción Nombre de Host para que automáticamente se configure a Redmine. Además añado la entrada de Host en el servidor DNS.

Luego hay que sacar la bases de datos a un servidor externo haciendo un backup que restauraremos en el servidor ya existente, donde ya tenemos toda la infraestructura montada ( almacenamiento y copias de seguridad). Hay que conceder acceso en el servidor MySQL para el usuario de Redmine, pero ojo si se pretende asignar el nombre de máquina explícitamente en el permiso: mi experiencia me ha demostrado que, aunque en principio funcione bien, hay un momento en el que la aplicación llama usando el nombre de host '%' (cualquiera) y falla. Puede que sea cosa del nombre de la máquina o del servidor DNS, el caso es que los permisos los asigno por usuario y no por el par usuario-host.

Por último hay que lograr que Redmine use un servidor de ficheros externo, Windows en mi caso. Para ello no hay más que montar el recurso compartido con CIFS (no SAMBA) en la carpeta /files durante el arranque de la máquina virtual modificando el fichero /etc/fstab y añadiendo una línea al final (asegúrate de que haya un salto de línea después):

//Servidor/Recurso /opt/apps/redmine/files cifs rw, root, username=miusuario, password=miclave 0 0

En caso de tener que asignar por usuario y grupo de Linux, usar:

//Servidor/Recurso /opt/apps/redmine/files cifs rw, uid=root, gui=www-data, username=miusuario, password=miclave 0 0

Ojo, si el recurso de red no está disponible en el arranque de la máquina puede haber problemas de funcionamento, revisar que monte bien la ubicación remota con las credenciales asignadas y no aparezca el siguiente error en /var/log/syslog:

CIFS VFS: Error connecting to IPv4 socket. Aborting operation
CIFS VFS: cifs_mount failed w/return code = -111


Al final ha quedado una máquina virtual con 256 Mb. de RAM asignada, un consumo de disco de poco más de 1 Gb. y que rinde perfecamente con 30 usuarios. Su backup (.7z) ocupa <300 style="font-style: italic;">trunk de Redmine, la diferencia de rendimiento usando Phusion Passenger en vez de Mongrel, el cambio a Ruby Enterprise por temas de gestión optimizada de la memoria y la instalación de nuevos plugins para mejorar el trabajo. Merecerá la pena.

miércoles, 22 de julio de 2009

Appliance Redmine con Ubuntu JeOS (2-Configurando Webmin)


Esta es la 2ª parte de cómo crear un appliance de Redmine 0.8.4 con Ubuntu Jeos 8.04.3 y Webmin usando el Bitnami Redmine Stack. Este artículo se centra en la integración de los tres para obtener una plataforma estable y manejable. Todos los pantallazos de Webmin son usando el tema Stressfree.

Una vez creada y funcionando la máquina virtual (ver entrada anterior), hay que asegurarse de que dure dura, asi que vamos a "endurecerla" mediante Webmin, una herramienta para manejar servidores que, bien manejada, ayuda mucho a la administración. Primero vamos a borrar los módulos que no se usan en el appliance, desde Webmin ==> Configuración de Webmin ==> Modulos de Webmin ==> Delete (ojo, por dependencias entre sí no se pueden borrar de golpe):
  • Linux Bootup Configuration
  • LDAP Users and Groups
  • PHP Configuration
  • Kerberos5
  • LDAP Client
  • SMART Drive Status
  • Sendmail Mail Server
  • System Logs NG
  • Shoreline Firewall
  • TCP Wrappers
  • SpamAssassin Mail Filter
  • WU-FTP Server
  • Webalizer Logfile Analysis
  • Squid Proxy Server
  • Squid Report Generator
  • Usermin Configuration
  • Voicemail Server
  • idmapd daemon
  • Security Sentries
  • QMail Mail Server
  • ProFTPD Server
  • Procmail Mail Filter
  • SSL Tunnels
  • Samba Windows File Sharing
  • Postfix Mail Server
  • PostgreSQL Database Server
  • NIS Client and Server
  • OpenSLP Server
  • PPP Dialin Server
  • PPP Dialup Client
  • PPTP VPN Client
  • PPTP VPN Server
  • Printer Administration
  • MON Service Monitor
  • NFS Exports
  • Exim Mailserver
  • Filter and Forward Mail
  • Majordomo List Manager
  • Frox FTP Proxy
  • HTTP Tunnel
  • Heartbeat Monitor
  • IPsec VPN Configuration
  • Jabber IM Server
  • LDAP Server
  • Extended Internet Services
  • MySQL Database Server
  • Fetchmail Mail Retrieval
  • Cluster Usermin Servers
  • Cluster Users and Groups
  • Cluster Webmin Servers
  • Cluster Copy Files
  • Configuration Engine
  • Cluster Cron Jobs
  • DHCP Server
  • Cluster Shell Commands
  • Disk Quotas
  • Cluster Software Packages
  • Dovecot IMAP/POP3 Server
  • BIND DNS Server
  • Bacula Backup System
  • CD Burner
  • CVS Server
  • Cluster Change Passwords
  • ADSL Client
Luego, como hay que enterarse si pasa algo "anormal" y tener prueba de ello en la Bandeja de Entrada, se crean las alertas básicas de aviso entrando en Otros ==> Estado de Sistema y Servidor:


Lo primero de todo es configurar el envío de alertas mediante email y que revise cada x tiempo los monitores que añadiremos a continuación:


El primer monitor que añadimos es Alive System, que indica los encendidos/apagados,


luego añadimos el de Espacio en disco, para indicarle sobre "\" (todo el disco) que avise cuando haya menos de 1 Gb. libre (por ejemplo),


Estado de Interfaz de Red indica si hay conexión de red,


Media de Carga indica cuando hay un consumo de recursos (CPU) excesivo,


Memoria Libre no tiene mayor explicación,


Chequear Proceso sirve para comprobar si hay un comando en ejecución; usaremos /opt/ruby/bin/.ruby.bin /opt/ruby/bin/mongrel_rails start para comprobar que el clúster de Mongrel está activo, indicando en Número de procesos que deben existir para que el monitor lo considere como ejecutándose el nº de nodos de Mongrel que tengamos iniciados,


y ya sólo falta el Servidor Web Apache,


con lo que nos tiene que quedar esta bonita pantalla


donde se puede apreciar de un rápido vistazo el estado del sistema. Por cierto, Apache figura mal porque no se ha configurado... en Servidores ==> Servidor Web Apache ==> Configuración del módulo, se pueden establecer los parámetros para que apunte al servidor web Apache que está instalado con Redmine:


Ahora vamos a tocar el Firewall por encima. Entramos en Red ==> Cortafuegos Linux y dejamos la siguiente configuración (ojo al orden de las reglas):


Ahora a mantener la hora sincronizada con un servidor externo, para que no haya problemas... Hardware ==> Hora del Sistema ==> Time Server Sync:


Ahora vamos a crear una serie de Comandos Personalizados que nos faciliten la vida, entrando en Otros ==> Comandos personalizados:


Estado de Redmine, comprobar el estado de los servicios: /opt/ctlscript.sh status
Parar Redmine, detener los procesos de Mongrel: /opt/ctlscript.sh stop redmine
Arrancar Redmine, iniciar los procesos de Mongrel: /opt/ctlscript.sh start redmine
Parar Apache, detener el servidor web: /opt/ctlscript.sh stop apache
Arrancar Apache, iniciar el servidor web: /opt/ctlscript.sh start apache
Contenido de carpeta files, ficheros subidos a Redmine: dir /opt/apps/redmine/files

Y también crearemos Editores de Archivo para facilitar las modificaciones a mano de archivos de configuración de Redmine:
  • Editar redmine.conf:


  • Editar database.yml:



Editar mongrel_cluster.yml:


Con esto se facilitan las modificaciones puntuales de Redmine, que luego viene el jefe con prisas y ya se sabe...

Y por supuesto, no olvidarse de rotar los logs de Redmine ni de Apache... ¿Que qué son los logs? Son los registros de la aplicación, muy útiles para analizar el uso y los errores de una aplicación, pero si no se hace nada con ellos pueden crecer hasta llenar el disco y eso es un problema. Aquí, una vez más, nos apoyamos en Webmin y la utilidad de rotación de logs, que cogerá esos ficheros cada n días, los comprimirá y, tras truncarlos (borrar su contenido), dejará los anteriores comprimidos (n copias) en la carpeta que le digamos. Es más, antes de ello parará la aplicación y a continuación la reiniciará (segundos), tanto en el caso de Apache como en el de Redmine. Vamos a ver cómo entrando en Sistema ==> Rotación de históricos (Logs) y añadiendo la de Apache en Agregar un nuevo archivo de bitácora para rotar:


Luego añadimos la rotación de logs para Redmine:


Con esto tenemos la rotación de logs controlada y sabemos que por aquí no va a romperse. Los ficheros quedan en una carpeta desde donde los podremos mover, enviar por email o dejarles que se borren (guarda un histórico de n rotaciones):


Y si nos queremos asegurar que funciona correctamente, abajo hay un botón de Rotar Ahora. Este es el aspecto de la carpeta de logs de Redmine antes de rotar:


Durante la rotación de los ficheros observamos la salida de los comandos que se ejecutan antes y después, en este caso parando Redmine antes de rotar e iniciándolo tras acabar el proceso (asi no se escapa nada):



El aspecto de la carpeta de logs de Redmine después de la rotación es este, donde puede apreciarse que los ficheros han quedado vacios:


¿Y dónde están ahora...? Comprimidos, en la carpeta que hemos indicado antes:


Por cierto, ejecutando esto diariamente se minimiza el uso de disco y se reciclan los procesos (al reiniciar los servicios), liberando memoria.

Si la política de la empresa te pide almacenar 6 meses de logs, ya sabes, a hacer copia de la carpeta todas las semanas; no recomiendo almacenar muchos logs dentro del appliance por la posible falta de espacio en disco y porque se almacenan mejor en un servidor de ficheros.

Y lo último que nos queda es comprobar que la rotación de logs está activa entrando en Sistema ==> Tareas Planificadas:


Y hasta aquí hemos llegado por hoy, consiguiendo que el appliance de Redmine gane en seguridad, estabilidad y facilidad de administración gracias a la integración con Webmin. En la próxima entrega veremos como optimizar el funcionamiento de Redmine para poder exprimirlo al máximo.

martes, 21 de julio de 2009

Appliance Redmine con Ubuntu JeOS (1-Creando la base)



Gracias a Bitnami y sus cómodos instaladores de aplicaciones, una de las últimas incorporaciones en el trabajo ha sido Redmine, un gestor de proyectos sencillo de aprender y "relativamente potente". Lo de "relativamente" es porque este software presenta una serie de cuellos de botella si se pretende virtualizar usando el instalador de Bitnami (la opción fácil de instalación):
  • La base de datos (MySQL) reside en el propio appliance.
  • Los ficheros se almacenan en el propio appliance, dentro de la carpeta de la aplicación.
La experiencia (VMware) me ha demostrado que el uso de disco en una máquina virtual es un problema debido a las bajas tasas de transferencia, asi que hay que sacar estas partes del disco virtualizado y redirigirlas a servidores existentes, con discos en RAID y varios procesadores,para aportar más fiabilidad a los datos sin añadir costes. El appliance no contendrá datos, sólo la configuración y la aplicación; un único backup bastará. Por otro lado, el uso de un servidor de ficheros externo a la carpeta de la aplicación permite el acceso desde varios appliances, pudiendo balancear mejor la carga en caso de ser necesario, cosa que se aplica también al uso de un MySQL externo. Gracias a esto, el tamaño en disco dentro de cada appliance no crecerá con el uso (excepto por los logs).

Ahora los componentes internos que instala el Stack Redmine de Bitnami:
  • MySQL. La base de datos.
  • Carpeta files. Por pemisos tiene que estar en la carpeta de la aplicación y almacena todos los ficheros adjuntados. Redmine modifica los nombres para que no haya problemas.
  • Apache. Hace de puerta de entrada (web) para redirigir las peticiones a Mongrel.
  • Mongrel. Funciona con n procesos (en modo clúster), haciendo cada proceso las llamadas a la aplicación en Ruby. Por defecto se instalan 2 nodos.
  • Ruby on Rails y Ruby Gems, el lenguaje y sus extensiones.
  • Subversion. Es un sistema de versionado. No se va a usar.
Como sistema operativo, en vez de Fedora 9 que puede estar bien para instalar directamente sobre hardware, voy a usar Ubuntu JeOS, una versión especial de Ubuntu Server para uso virtualizado que consume MUY POCOS recursos.

Para la carpeta files se usará un recurso compartido en un servidor de Windows mediante CIFS.
Para MySQL, se usará un servidor ya activo en la red, en el que se levantará una base de datos de Redmine.

Lo siguiente es crear una máquina virtual, ya explicado en una entrada anterior. Una vez creada la máquina hay que actualizarla e instalar Webmin. Como esto si que cambia respecto a Fedora 9, pongo los comandos necesarios:

sudo apt-get update

sudo apt-get upgrade


sudo apt-get install acpid wget perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl openssh-server iptables cron at logrotate

wget http://prdownloads.sourceforge.net/webadmin/webmin_1.480_all.deb

sudo dpkg -i webmin_1.480_all.deb

sudo /usr/share/webmin/changepass.pl /etc/webmin root MyNewPassw0rd


Con esto (1 y 2) se actualiza el sistema operativo, (3) se instalan dependencias necesarias y aplicaciones para un uso posterior, (4) se descarga Webmin (1.480) y (5) se instala. la última línea (6) es para cambiar la contraseña de root a MyNewPassw0rd. Y ya se puede acceder a Webmin a través de https://xx.xx.xx.xx:10000 (xx.xx.xx.xx puede ser la IP o el nombre DNS del appliance). Si te hace falta parar el Firewall momentaneamente para acceder, usa.

sudo iptables -F

Dentro de Webmin ya se puede configurar el Firewall, Apache, etc... para acceder a todo de una manera más cómoda. Hasta aquí, la máquina arranca usando unos 31 Mb de RAM:


Ahora hay que instalar Redmine:

wget http://bitnami.org/files/stacks/redmine/bitnami-redmine-0.8.4-0-linux-installer.bin


sudo chmod +x bitnami-redmine-0.8.4-0-linux-installer.bin


sudo ./bitnami-redmine-0.8.4-0-linux-installer.bin


(1) Descargar el fichero ~90Mb, (2) asignarle permisos de ejecución y (3) lanzar la instalación: Usar la carpeta /opt, el nombre de usuario y contraseña se usarán para MySQL, el correo para avisos por SMTP, Spanish, no configurar de momento SMTP, continuar, arrancar Redmine tras la instalación y la última pregunta no se ve. Igual es ¿acabar con el hambre en el mundo? como pueda ser ¿formatear Internet?, NPI... le doy que Yes, salgo y borro el instalador:

rm bitnami-redmine-0.8.4-0-linux-installer.bin

Ahora ya se puede acceder a la aplicación desde la URL http://maquina/redmine Las credenciales de acceso para administrar Redmine son los proporcionados durante la instalación.

Pero, pero, pero... siempre hay un "pero". Al reiniciar la máquina virtual no arranca Redmine... No responde porque no han arrancado los servicios... Pues a arreglarlo: se modifica el fichero /etc/rc.local y se añade ANTES del EXIT 0 unos comandos para arrancar Redmine al inicio del sistema, de hecho sólo arrancaremos Apache y Redmine, dejando MySQL y Subversion inactivos:

/opt/ctlscript.sh start redmine
/opt/ctlscript.sh start apache


y como los ficheros PID de Mongrel inactivos estorban, antes de arrancar el servicio, borrarlos también

rm /opt/apps/redmine/tmp/pids/mongrel.300?.pid

Espero que no se lie nadie. Por cierto, si se instala Webmin es para cosas de estas:


Si quieres funcionar con el MySQL integrado, añade la línea además de las anteriores:

/opt/ctlscript.sh start mysql

Una vez reiniciado el equipo deberás ver que el consumo de RAM aumenta:


Y si además arrancaste MySQL:


Pues nada, sencillito y funcional, ya está funcionando la máquina virtual con Redmine, para los que quieran ir probando, con 256 Mb de RAM y 3 Gb de HD será suficiente. Los de Bitnami ofrecen algo de virtualización basado en Suse, creo, pero el sistema operativo me gusta hacermelo a mi gusto.

Si esto interesa a los lectores, en una próxima entrega se verá cómo personalizar Webmin para este appliance, la conexión a un servidor de ficheros externo sin romper la aplicación para almacenar attachments (ficheros adjuntos), la conexión a un MySQL externo, ampliar el nº de nodos de Mongrel para soportar mayor carga de usuarios, estimar un dimensionamiento en RAM, etc... porque no es lo mismo trabajar con 5 usuarios que con 50.

sábado, 18 de julio de 2009

Creando una base virtualizada con VMware, Fedora y Webmin

Hoy voy a contar cómo hago una máquina virtual con Linux para poder reutilizar posteriormente, usando el proceso de instalación "desde la red" de Fedora 9 y su actualización posterior, aunque es muy similar para otras distros de Linux. Por último se instalará Webmin para poder manejarlo todo cómodamente desde un navegador:
  1. - Creación y configuración de la máquina virtual.
  2. - Instalación mínima de Fedora 9.
  3. - Desinstalación de aplicaciones sobrantes, actualización del sistema y eliminación del kernel anterior.
  4. - Instalación de Webmin.
Al final de todo esto quedará una imagen lista y reaprovechable para ser usada como base de futuros appliances virtualizados. Yo uso VMware para la virtualización, aunque supongo que se pueda hacer con otros sistemas de virtualización sin problemas. Como sistema operativo uso Fedora, pero se puede hacer con muchas otras distros (igual cambian los comandos).

Creación y configuración de la máquina virtual:
Primero descargate una ISO "net-inst" de cualquiera de los mirros de Fedora; este tipo de ISO tiene lo necesario para arrancar el PC y descargar de la red las partes necesarias del sistema operativo sin tener que descargarte un DVD de 4 Gb.
Abre la aplicación de VMware Server y crea una nueva máquina


con las características que ves en la siguiente imagen:


Luego hay que tocar el fichero .VMX (configuración de la máquina virtual) para acelerar un poco su funcionamiento haciendo que omita el uso del fichero NVRAM. Advierto que los puristas de VMware se echarán las manos a la cabeza, pero funciona (siempre y cuando el hardware sea TOTALMENTE FIABLE, hasta la alimentación eléctrica):
  1. Con la máquina apagada, abre el fichero .VMX usando el bloc de notas o similar.
  2. Borra la línea que contiene el nombre del fichero .NVRAM.
  3. Añade las siguientes líneas:
    mem.ShareScanVM=0
mem.ShareScanThreshold=4096
sched.mem.maxmemctl=0
sched.mem.pshare.enable = "FALSE"
MemTrimRate = 0
MemAllowAutoScaleDown = "FALSE"
mainMem.useNamedFile = "FALSE"

(Ver en http://snippets.dzone.com/posts/show/10093)

Si alguien conoce algún método más (o mejor), por favor, que me lo diga.


Instalación mínima de Fedora 9:

Ahora ya se puede arrancar la máquina. Por defecto iniciará desde la ISO, escogiendo el idioma deseado, escogiendo el mirror (p.ej: ftp://mirror.ovh.net/download.fedora.redhat.com/linux/releases/9/Fedora/i386/os/), asignando por defecto las particiones del disco, creación de un usuario/contraseña y lo más importante, la pantalla de los repositorios, donde hay que indicar sólo el de FEDORA (FEDORA UPDATES no) y que queremos personalizar el software instalado: sólo dejaremos instalado el SYSTEM BASE. Se pueden ver pantallazos del proceso aquí (inglés).

Desinstalación de aplicaciones sobrantes, actualización del sistema y eliminación del kernel anterior:
Una vez finalizada la instalación se realiza el primer arranque de la máquina virtual y nos podremos conectar a ella desde la consola de VMWare:


o desde una consola remota (mejor) usando PuTTY u otro programa similar:


Se inicia una sesión como root con la contraseña usada en la instalación y se ejecutan los siguientes comandos:

yum clean all
yum install fedora-release-9-5.transition
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-8-and-9
yum install yum-fastestmirror
yum remove cups cups-libs gpm
yum --skip-broken update

con esto (1) limpia la información almacenada del instalador, (2 y 3) prepara la actualización e importa la nueva clave de firmas de paquetes, (4) instala una utilidad para acelerar las descargas usando el mirror más rápido, (5) elimina las aplicaciones innecesarias y (6) actualiza todos los paquetes.

Como se ha actualizado el kernel, hay que eliminar el antiguo usando:
    yum remove kernel-2.6.25-14.fc9
Si quieres saber todos los que tienes instalados, usa:
    rpm -q kernel
Instalación de Webmin:
El manejo del servidor usando el Terminal no es trivial, por lo que instalaremos la aplicación Webmin para suavizarlo: abre un terminal como root y ejecuta los siguientes comandos

cd /etc/yum.repos.d/
vi webmin.repo
para (1) cambiarte a la carpeta de los repositorios y (2) crear un nuevo fichero de definición de repositorios usando VI. Pulsa la tecla "I" para poder insertar texto y copia el siguiente texto:

[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1
Para salir del modo "INSERT", pulsa la tecla [Escape] y para grabar y salir teclea :wq (raro, eh)
Luego ejecuta

rpm --import http://www.webmin.com/jcameron-key.asc
yum install webmin
para (1) importar la clave necesaria para usar el repositorio e (2) instalar Webmin. Eso si, como en Linux la seguridad es lo primero, tenemos lo puertos "capados" por el firewall, asi que le detenemos momentaneamente

service iptables stop
para poder acceder a Webmin, pero ¿qué IP tiene la máquina? Puedes mirarlo en la consola


o usar el comando
ifconfig

Una vez conocida la IP, escribirla en un navegador seguida de :10000 para acceder a Webmin y logearse como root:


Esta aplicación permite controlar practicamente todo dentro de Linux de una manera gráfica. Si no te gusta el tema, lo puedes cambiar por otro:


Y ya tenemos el Fedora 9 listo para meterle mano. Haz una copia de seguridad para poder reaprovechar sin dar estos pasos y a experimentar con aplicaciones de servidor en Linux.

lunes, 15 de junio de 2009

Trabajando con PDFs

El primer problema de los PDFs viene cuando el usuario hace dobleclic y no pasa nada; hay que instalar un visor de PDFs, como:


, etc... Hay unos cuantos. Personalmente uso el Acrobat Reader en Windows. Aunque existe versión, para Linux no la uso porque no tengo queja con el visor integrado.

El siguiente problema es la creación de documentos en formato PDF. Basta con instalar una impresora virtual que genere documentos en formato PDF: en Linux se puede hacer instalando cups-pdf (en casi todas las distros), pero para Windows se pueden usar estos:

PDF Creator


PrimoPDF


DoPDF

, etc.... Esto permite que el hecho de imprimir desde cualquier programa genere un fichero PDF con el contenido equivalente que aparecería en papel si fuese una impresora real. El que yo uso es PDF Creeator.

Cuando el usuario pide ayuda para pasar un fichero MP3 a PDF, ya es más complicado: ¿necesitas la partitura o lo quieres en formato Braile?

El último problema viene con la manipulación de ficheros PDF:
  • ¿Cómo extraigo una página (o más)? Imprime únicamente esa(s) página(s) en la impresora PDF: Archivo...Imprimir...Cambiar a la impresora de PDF... Seleccionar la(s) página(s)... Aceptar.
  • ¿Como junto 2 ficheros PDF en uno? Usa:
si estás en Windows, si estás en Linux puedes hacer lo mismo (usando Wine) o cualquiera de las herramientas disponibles si necesitas hacerlo en modo batch . También están las herramientas de PDFill PDF Tools:

  • ¿Como edito el contenido de un PDF? A nada pijo que sea el usuario, necesitará el programa Acrobat Writer (de pago) con editor WYSIWYG , pero el maravilloso programa

es capaz de abrir ficheros PDF y acceder a sus contenidos. En Linux también existen herramientas que permiten modificar los PDFs, como:Si te falta algo, consulta la wikipedia para una lista completa de software (incluido el comercial) relacionado con el mundo PDF.