The Evangeist .INFO

CCNP SWITCH 4: Virtual LANs

NOTA: esta serie de artículos son una especie de apuntes del libro oficial por lo que se irán actualizando a menudo.

Redes conmutadas pueden dividirse en VLANs. Por definición una VLAN es un único dominio de colisión. Todos los dispositivos conectados a la VLAN reciben los broadcast enviados por cualquier miembro de la misma VLAN. sin embargo dispositivos conectados a otra vlan no reciben esos broadcast. Está claro que los miembros de la VLAN reciben los paquetes unicast enviados directamente por otros miembros de la misma VLAN.

VLAN estáticas

Son las VLANs que se configuran manualmente en el switch. Por defecto todos los puertos de un switch están asignados a la VLAN 1, configurados para ser de tipo Ethernet y tener una unidad máxima de transmisión (MTU) de 1500 bytes.

Los identificadores de las VLANs puede ir de 1 a 1005 (1 y de 1002 a 1005 son creado automáticamente y no pueden ser borrados). Para poder usar el rango extendido (de 1 a 4094) para que sea compatible con el estándar IEEE 802.1.Q se debe configurar el switch en modo transparente (se verá más adelante).

Para configurar una VLAN estática primero hay que definirla de la siguiente manera:

Switch(config)# vlan vlan-num
Switch(config-vlan)# name vlan-name

La VLAN con identificador vlan-num se crea y almacena en la base de datos inmediatamente junto con el nombre descriptivo vlan-name, que puede ser de hasta 32 caracteres y no permite espacios y es totalmente opcional su definición. Para borrar una VLAN usaremos el comando:

Switch(config)# no vlan vlan-num

Una vez definida la VLAN tenemos que asignar la VLAN en el puerto que queramos usando estos 4 comandos:

Switch(config)# interface type module/number

seleccionamos el puerto a configurar en la VLAN

Switch(config-if)# switchport

configura el puerto para operar en Capa 2, por defecto algunos switches Catalyst viene preparados para operar en Capa 3.

Switch(config-if)# switchport mode access

Configura el puerto para una sola VLAN la cual se indica con el siguiente comando.

Switch(config-if)# switchport access vlan vlan-num

indicamos el identificador de la VLAN, con lo que ya queda configurado el puerto en la VLAN.
Para verificar que la configuración podemos usar el comando “show vlan“.

Despliegue de VLANs

Para implementar VLANs hay que tener en cuenta el numero de VLANs que se necesitan y como mejor colocarlas. Por lo general, el numero de VLANs depende en los patrones de tráfico, tipos de aplicaciones, segmentación de grupos de trabajo y requerimientos de la gestión de la red. Cisco recomienda emparejar una red con una VLAN.

End-to-End VLANs

Son las que se distribuyen por toda la red para poder dar mayor flexibilidad al usuario final el cual puede moverse por toda la red manteniendo la misma VLAN. Los usuarios pueden asignarse independientemente de su ubicación geográfica. Este tipo de despliegue tiene la regla 80/20 que significa que el 80% del tráfico es local y el 20% es remoto (aunque es posible que ciertas VLANs usen el 100% para tráfico remoto).
NOTA: no se recomienda este tipo de despliegue para redes empresariales ya que puede crear la posibilidad de tormentas de broadcast.

VLANs locales

Son VLANs que se organizan por su ubicación geográfica local y se suelen distribuir en switches en un rack o en un mismo edificio. Tiene la regla contraria a End-to-End ya que el 20% del tráfico es local mientras que el 80% es remoto.

VLAN Trunks

Inter-Switch Link Protocol ISL

Es propietario de Cisco y lo que hace es encapsular cada trama con una cabecera y un nuevo CRC al final. Cuando una trama tiene que salir por un enlace Trunk se añade una cabecera de 26 bytes y el nuevo CRC de 4 bytes al final. Si por el contrario la trama sale por un enlace de acceso no se añade ni la cabecera ni el CRC, solo se añade en los enlaces Trunk que están configurado con ISL. Otra característica es que encapsula el tráfico no marcado (lo que en 802.1Q se conoce como VLAN nativa).
NOTA: el método ISL ya no está soportado por todos los Cisco Catalyst, pero debe ser familiar y entender las diferencias con IEEE 802.1Q.

IEEE 802.1Q Protocol

Este protocolo al ser estándar puede operar con equipos de otros fabricantes y lo que hace es insertar la información de la VLAN en la trama sin tener que encapsular de nuevo toda la trama. Este método se conoce como single tagging o internal tagging.
802.1Q introduce el concepto de VLAN nativa que significa que las tramas en esta VLAN no son etiquetadas, por lo que por el TRUNK pasarán las VLANs etiquetadas y la nativa sin etiquetar.
La etiqueta que se inserta en la cabecera de la trama es de 4 bytes y va justo tras el campo de dirección origen.

Configuración de VLAN Trunk

Por defecto todos los puertos en Capa 2 están en modo acceso por lo que es necesario configurar el puerto para que sea un Trunk. Primero el puerto debe estar en Capa 2 para ello usaremos el comando “switchport” y luego procederemos a configurarlo con los siguientes comandos:
Indicamos la encapsulación que se va a usar, isl encasula y etiqueta todas las tramas, dot1q etiqueta todo excepto la vlan nativa y negotiate negocia el tipo siempre favoreciendo a ISL.

Switch(config-if)# switchport trunk encapsulation {isl | dot1q | negotiate}

Configura la VLAN nativa para el caso de 802.1Q en ISL no tiene efecto alguno. Por defecto en 802.1Q la VLAN nativa si no se especifica es al VLAN 1.

Switch(config-if)# switchport trunk native vlan vlan-id

Indica que VLANs se permite pasar por el enlace Trunk. Si no se especifica se permite pasar TODAS las VLANs activas que son las que están definidas y están asignadas a algún puerto.

Switch(config-if)# switchport trunk allowed vlan {vlan-list | all | {add | except | remove} vlan-list}

Configura el modo del Trunk.

Switch(config-if)# switchport mode {trunk | dynamic {desirable | auto}}

Resolviendo problemas de VLANs y Trunks

Para verificar la configuración de una VLAN en un switch podemos usar el comando:

Switch# show vlan id vlan-id

en el listado que muestra este comando debemos asegurarnos que la VLAN está activa y que está asignada a los puertos correctos, recordando que si un puerto está en modo Trunk no aparecerá, para ello debemos usar el comando “show interface type mod/num switchport” y fijarnos principalmente en estas dos líneas “Administrative Mode” y en “Operational Mode“. Si el puerto es Trunk para obtener información concreta debemos usar el comando “show interface [type mod/num] trunk“.

CCNP SWITCH 2: Funcionamiento de un Switch

NOTA: esta serie de artículos son una especie de apuntes del libro oficial por lo que se irán actualizando a menudo.

Funcionamiento de un Switch de Capa 2

En una red donde  los hosts comparten el mismo ancho de banda se llama “red de Medio compartido” (shared media network) y usa carrier sense multiple access collision detect (CSMA/CD) para determinar cunado un dispositivo puede transmitir.
Leer más »

CCNP SWITCH 3: configuración de un puerto de Switch

NOTA: esta serie de artículos son una especie de apuntes del libro oficial por lo que se irán actualizando a menudo.

Conceptos de Ethernet

Ethernet (10 Mbps, IEEE 802.3)

Para evitar el problema de medio compartido y por lo tanto half-duplex Ethernet Switching dedica un ancho de banda de 10 Mbps dedicado por cada uno de los puertos del switch. Con esto se consigue que el número de usuarios conectados a un segmente Ethernet se reduzca y por tanto es menos probable que haya colisiones y que el dominio de colisión se reduzca de tamaño.

FastEthernet (100 Mbps, IEEE 802.3u)

La velocidad del enlace se determina vía una señalización eléctrica para que cada extremo del enlace pueda determinar que velocidad está intentando usar el otro extremo. Si ambos extremos están configurados para auto negociación, se usará la velocidad más alta posible para ambos extremos.

El duplex de un enlace se negocia a través de intercambio de información. Si la auto negociación del duplex falla, el puerto de switch se pone en su configuración por defecto: half-duplex.

Cisco recomienda configurar la velocidad (speed) y duplex en ambos extremos para asegurar que alguno de los extremos cambie su configuración y pueda causar que el enlace se caiga (corte).

GigabitEthernet (1.000 Mbps o 1Gbps, IEEE 802.3z)

La ventaja de GigabitEther es que a pesar de que la Capa 1 se ha modificado para incrementar la velocidad de transmisión, todo el resto es compatible con los anteriores Ethernet.
El duplex de los puertos GigabitEthernet está siempre activado en los switches Cisco, por lo que NO la auto negociación del duplex no es posible.

GigabitEthernet (10.000 Mbps o 10Gbps, IEEE 802.3ae)

Ethernet escala de la siguiente forma, 10 Mbps, 100 Mbps, 1.000 Mbps y ahora 10.000 Mbps. Las características de Ethernet Capa 2 se mantienen operando SOLO a full duplex, lo que si difiere es la Capa Física (PHY) que pueden ser:

  • LAN PHY: interconecta switches en una red de campus y predomina en la capa del nucleo (core layer).
  • WAN PHY: se encuentran en redes de area metropolitana (MAN = metropolitan-area networks) y sus interfaces son synchronous optical network (SONET) o synchronous digital hierarchy (SDH).

Cisco Catalyst switches soportan 10-Gigabit Ethernet PMDs en la forma de XENPAK, X2 y SFP+ transceivers. Generalmente, el formato X2 es más pequeño que el de XENPAK y el SFP+ es incluso más pequeño permitiendo más densidad de puertos en un módulo de un switch.

Configuración del puerto de switch

Seleccionando un puerto a configurar

Aunque por lo general se suele decir puerto de switch en IOS de Cisco se denominan “interfaces”. Para elegir un puerto a configurar se usa el comando en modo de configuración global:

Switch(config)# interface type module/number

El tipo (type) puede ser fastethernet, gigabitethernet, tengigabitethernet o vlan, el módulo (module) es el módulo o slot donde está localizado, lo que no soporten módulos ni slots se usa el módulo 0 (cero) y por último se indica el número de puerto (number) dentro del módulo. En algunos modelos puede haber chasis o stacks en cuyo caso sería stack/module/number.
Para seleccionar varios puertos y configurarlos a la vez y no tener que estar entrando puerto por puerto podemos usar este comando si son puertos no contiguos:

Switch(config)# interface range type module/number [, type module/number ...]

o este comando si son puertos contiguos:

Switch(config)# interface range type module/firstnumber – lastnumber

También podemos definir una macro que contenga un listado de puertos, rangos o ambos, para ello debemos seguir estos pasos:

  1. definir el nombre de la macro y especificar el listado de puertos y/o rangos de puertos como se necesite
    Switch(config)# define interface-range macro-name type module/number [,	type module/ number ...] [type module/first-number – last-number] [...]
  2. invocar la macro que se ha definido justo antes de aplicar los comando comunes.
    Switch(config)# interface range macro macro-name

NOTA: es muy importante que tanto las comas como los guiones (-) tengan un espacio delante y detrás en el comando interface range anterior.

Identificando puertos

Se puede añadir una descripción o comentario a cada puerto que nos ayude a identificar lo que hay en ese puerto.

Switch(config-if)# description description-string

y para quitar el comentario:

Switch(config-if)# no description

Velocidad del puerto

Se puede especificar una velocidad concreta a un puerto (siempre que esté soportada) o dejarlo en auto negociación (auto) que es como está por defecto, menos los puerto GBIC que están a 1000.

Switch(config-if)# speed {10 | 100 | 1000 | auto}

El modo duplex del puerto

También se puede especificar el modo del puerto (duplex mode) que puede ser half-duplex, full-duplex o auto negociado, que está por defecto y solo está permitido en UTP Fast y Giga Ethernet. En auto negociación primero se intenta negociar a full-duplex y si falla se queda en half-duplex. El proceso de negociación de repita cada vez que el enlace (link) cambia de estado. Es importante configurar ambos extremos de identica forma para evitar problemas de discordancias y por lo tanto half-duplex.

Switch(config-if)# duplex {auto | full | half}

Gestionando condiciones de error en un puerto

Detectando condiciones de error

Por defecto un switch Catalyst detecta un condición de error en cada puerto por cada posible causa (ver más abajo). Si se detecta una condición de error, el puerto se pone en modo errdisable y se deshabilita. Se puede configurar este comportamiento para que solo ciertas condiciones aplique el modo errdisable del puerto en caso de error. Para configurar que condiciones deshabilitan el puerto se usa este comando:

Switch(config)# [no] errdisable detect cause [all | cause-name]

Se puede repetir el comando por cada uno de los siguientes causas:

  • all—Detecta todas las posibles causas
  • arp-inspection—Detects errors with dynamic ARP inspection
  • bpduguard—Detects when a spanning-tree bridge protocol data unit (BPDU) is re- ceived on a port configured for STP PortFast
  • channel-misconfig—Detects an error with an EtherChannel bundle
  • dhcp-rate-limit—Detects an error with DHCP snooping
  • dtp-flap—Detects when trunking encapsulation is changing from one type to another
  • gbic-invalid—Detects the presence of an invalid GBIC or SFP module
  • ilpower—Detects an error with offering inline power
  • l2ptguard—Detects an error with Layer 2 Protocol Tunneling
  • link-flap—Detects when the port link state is “flapping” between the up and down states
  • loopback—Detects when an interface has been looped back ■ pagp-flap—Detects when an EtherChannel bundle’s ports no longer have consistent configurations
  • psecure-violation—Detects conditions that trigger port security configured on a port
  • rootguard—Detects when an STP BPDU is received from the root bridge on an un- expected port
  • security-violation—Detects errors related to port security
  • storm-control—Detects when a storm control threshold has been exceeded on a port
  • udld—Detects when a link is seen to be unidirectional (data passing in only one direction)
  • unicast-flood—Detects conditions that trigger unicast flood blocking on a port
  • vmps—Detects errors when assigning a port to a dynamic VLAN through VLAN membership policy server (VMPS)

Recuperar automáticamente desde condiciones de error

Por defecto cuando un puerto se pone en modo errdisable debe ser habilitado de nuevo manualmente. Esto se hace bajando (shutdown) y levantando (no shutdown) el puerto concreto. Antes de proceder a habilitar el puerto se debe comprobar la causa del error para que no se vuelva a deshabilitar de nuevo.
También se puede configurar el switch para que habilite automáticamente el puerto deshabilitado, si es más importante que el puerto esté levantado. Para ello se debe especificar que causas se permiten que se habilite el puerto automáticamente con el comando (ver las cusas más arriba):

Switch(config)# errdisable recovery cause [all | cause-name]

Por defecto desde que el puerto es deshabilitado hasta que se habilita automáticamente pasan 300 segundos (5 minutos). Este valor se puede cambiar con el comando (de 30 a 86400 segundos = 24 horas):

Switch(config)# errdisable recovery interval seconds

Resolviendo conectividad de un puerto

Para resolver un problema de conectividad podemos usar el comando “show interfaces” que muestra una completa información sobre el puerto del switch.
La primera línea nos muestra el estado, indicando en la primera parte el estado del enlace físico (data link layer) que si está a down indica que está físicamente desconectado o no detecta enlace y la segunda parte nos indica el estado del protocolo (line protocol) es decir el estado de la Capa 2, si está en errdisable es que se ha detectado una condición de error y automáticamente se ha deshabilitado el puerto.
Una forma rápida de ver los estados de TODOS los puertos podemos usar el comando “show interface status“. Y para ver TODOS los puertos que están en errdisable podemos usar este comando “show interface status err-disabled“.
Otro posible problema puede surgir si un usuario detecta un tiempo de respuesta lento o bajo ancho de banda cuyo problema puede ser causado a una discordancia en la velocidad y/o el duplex entre el puerto del switch y el servidor. Esto es bastante común cuando un extremo está puesto que auto negocie y el otro no. Para ello observaremos que no haya ningún valor de error mayor de cero y también que no esté a half-duplex.

Ejecutar GNS3 en MAC OS X

Como parece ser que la versión de DNS3 para MAC no la distribuyen en DMG debido a que debe ser bastante tedioso y problemático, aquí expongo como hacerlo paso a paso:

Métod0 1

  • Instalar Apple Devs Tools (viene en el DVD de Mac OS X o puedes descargarlo de una cuenta de desarrollador ADC). Ejecuta XcodeTools.mpkg.
  • Descarga SIP, abre un terminal ve a la carpeta donde has descargado el fichero tar.gz y compila el programa siguiendo estos pasos: (ejemplo para SIP 4.9.3):
    tar xvzf sip-4.9.3.tar.gz
    cd sip-4.9.3
    python configure.py
    make
    make install
  • Descarga PyQt y sigue estos pasos para descomprimir y compilar PyQt (ejemplo para PyQt 4.6.2):
    tar xvzf PyQt-mac-gpl-4.6.2.tar.gz
    cd PyQt-mac-gpl-4.6.2
    python configure.py
    make
    make install

Método 2

Este método puede llevar varias horas ya que todo se compila aunque es más flexible ya que se puede elegir entre versiones de dependencias más fácilmente.

  • Abrir un terminal e instalar la dependencias de GNS3, siguiendo estos pasos:
    sudo port install python26
    sudo port install python_select
    sudo python_select python26
    sudo port install py26-sip
    sudo port install py26-pyqt4
    sudo port install qt4-mac

Notas sobre MacPorts

Para evitar que MacPort instale las últimas versiones de las dependencias (algunas pueden no funcionar correctamente con GNS3) se puede forzar una versión concreta con @.

Ejemplo:

sudo port install py26-sip @4.9.3_0
sudo port install py26-pyqt4 @4.6.2_0
sudo port install qt4-mac @4.5.3_0

También podemos hacer en caso de que tengamos la última versión de QT y esta no funcione correctamente con GNS3, cambiar la versión a utilizar con MacPort usando el comando:

sudo port activate qt4-mac  @version_number

Esto lo que hace es desactivar la versión actual y activar la que se ha especificado.

Fuente: GNS3 Blog.

AWK: extraer un fragmento de texto

Con AWK podemos buscar una parte de un texto la cual empiece por una cadena y termine por otra.

cat /etc/passwd | awk '/100/,/111/ { print } '

VLANs

Las Vlans se usan para crear dominios de broadcast y segmentos de Capa 3 lógicos para poder dividir o segmentar el tráfico compartiendo recursos físicos (como pueden ser switches). Las Vlans están identificadas por un número que va del 1 al 4095 (ver tabla 1).

Tabla 1
Rangos Tipo Uso VTP
0, 4095 Reservado Uso exclusivo del sistema.
No pueden ser usadas ni vistas.
1 Normal Vlan por defecto de Cisco.
Puede ser usara pero no modificada ni borrada.
SI
2 – 1001 Normal Estas Vlans puedes ser creadas, modificadas y borradas. SI
1002 – 1005 Normal Vlans por defecto en Cisco para FDDI y Token Ring.
No pueden ser borradas.
SI
1006 – 4094 Extendidas Vlans para Ethernet solo. (Ver nota 1) NO

NOTA 1: Los puertos de Capa 3 y algunas características requieren Vlans internas que son asignadas a partir del ID 1006 por lo que es aconsejable empezar a asignar ID del 4094 e ir bajando. Cisco no permite configurar IDs del 1006 al 1024.

Comandos referentes a Vlans

Switch(config)# vlan vlan_id

Crea o configurar la vlan con ID vlan_id, para borrarla anteponer no.

Switch(config-vlan)# name vlan_name

Añade o cambia el nombre de la vlan, para eliminar su nombre anteponer no.

Switch(config-if)# switchport mode access

Asigna la interfaz correspondiente en modo acceso.

Switch(config-if)# switchport access vlan vlan_id

Asigna la Vlan vlan_id a la interfaz correspondiente.

Switch#show interface type slot/port switchport
Switch#show running-config interface type slot/port

Verifica un interfaz para ver si está en la Vlan correspondiente.

Switch#show vlan_id

Muestra información de las vlans (ver tabla 2).

Tabla 2
VLAN identificador de Vlan
Name nombre de la Vlan si está configurado
Status Estado de la Vlan (activo o suspendido)
Ports Puertos que perteneces a la Vlan
Type Media type of the VLAN
SAID Security association ID value for the VLAN
MTU Maximum transmission unit size for the VLAN
Parent Vlan padre si es que existe
RingNo Ring number for the VLAN, if applicable
BrfgNo Bridge number for the VLAN, if applicable
STP Spanning Tree Protocol type used on the VLAN
BrgdMode Bridging mode for this VLAN
Trans1 Translation bridge 1
AREHops Maximum number of hops for all-routes explorer frames
STEHops Maximum number of hops for spanning tree explorer frames

Configurar el mando en un Dreambox

Cuando tenemos dos Dreambox juntos y queremos que cada mando SOLO gestione su Dreambox concreto (ya que por defecto con cualquier manda funcionarán ambos Dreambox, lo cual puede ser un lío) tenemos que configurar el mando y el Dreambox para asociarlos. Solo podemos asociar 4 mandos con sus Dreambox respectivos pero no creo que nadie tenga más de 4 Dreambox juntas, pero en tal caso debería comprar un mando universal programable (por ejemplo los de Marmitek).

Tenemos que realizar 2 pasos, uno en el mando y otro en el Dreambox:

NOTA: solo está probado en DM7020, DM7025 y DM600, puede funcionar en otros modelos. Los mandos probados tiene el código: URC-39930BJ0-03 y parece ser que los mandos con código URC-39930RJ0-04 necesitan de un cable para desbloquear el mando. El código está en la tapa de la pilas del mando.

Configuración del mando.

  1. Primero debemos desbloquear el mando:
  2. Pulsamos el botón DREAM (parpadea)
  3. Pulsamos el botón SHIFT (arriba junto al botón de encendido) y lo mantenemos pulsado hasta que el botón DREAM parpadee DOS VECES.
  4. Pulsamos (sin equivocarnos) los siguientes botones numéricos: 9 8 2, el botón DREAM parpadea CUATRO VECES. Si solo parpadea DOS VECES, el manda ya estaba desbloqueado y lo que hemos hecho es bloquearlo. Repetimos el proceso para desbloquearlo.
  5. Ahora elegimos la asociación (recuerda que solo se pueden 4). Pulsamos el botón DREAM
  6. Pulsamos el botón SHIFT y mantenemos pulsado hasta que el botón DREAM parpadee DOS VECES.
  7. Pulsamos una de las siguientes combinaciones numéricas:
    1. Para asociación 1: 0 0 3 1
    2. Para asociación 2: 0 0 3 2
    3. Para asociación 3: 0 0 3 3
    4. Para asociación 4: 0 0 3 4
  8. El botón DREAM debe parpadear DOS VECES confirmando la asociación. Si solo parpadea UNA VEZ es que el mando está bloqueado y no permite asociar.

Una vez terminado podemos bloquear el mando para evitar problemas aunque no es obligatorio pero si recomendable.

Con esto SOLO le decimos al mando que manda una de las 4 señales, pero aún el Dreambox está configurado para recibir cualquiera de las 4 señales por lo que de momento es como si no hubiésemos hecho nada.

Configuración del Dreambox

  1. Primero entramos al Dreambox, vía Telnet o SSH
  2. Elegimos el valor de la asociación:
    1. Para asociación 1: valor = 1
    2. Para asociación 2: valor = 2
    3. Para asociación 3: valor = 4
    4. Para asociación 4: valor = 8
  3. Cambiamos la asociación (sustituir valor por el número):
    • Para el Dreambox 7025:
      echo valor > /proc/stb/ir/rc/mask0
    • Para el Dreambox 600 y 7020:
      echo valor > /proc/stb/ir/rc/mask

NOTA: este valor se perderá en el reinicio del Dreambox por lo que es aconsejable ponerlo en un fichero de arranque para que se configure cada vez que se arranca el Dreambox, como por ejemplo al final del fichero /etc/init./bootup.

vimdiff: editando y comparando 2 ficheros a la vez

En alguna ocasión tenemos 2 ficheros que en principio son iguales pero tienen algunas diferencias, por ejemplo cuando programamos y un fichero lo modificamos o cuando tenemos un texto y hemos modificado parte o en general cuando queremos comparar dos documentos pero no solo queremos ver las diferencias si no que además queremos ajustar esas diferencias o reducirlas.

Con el comando diff podemos ver las diferencias de 2 ficheros (incluso de más) pero no es mejor ver esas diferencias y poder modificar todo en tiempo real ?

Supongamos que tenemos 1 fichero (extraído de un fichero C):

//----------------------------------------------------------------------------
//      MagnifyEventLoopTimer
//
//      Our magnification timer. Ideally we should be event based, but we can't
//      detect every event that might cause a screen update (window move, etc.)
//      so we resort to this.
//----------------------------------------------------------------------------

pascal void
MagnifyEventLoopTimer(EventLoopTimerRef /*inTimer*/, void *inUserData)
{
        WindowRef       window = (WindowRef)inUserData;
        Point           mouse;
        GrafPtr         windowPort;
        GrafPtr         savePort;
        Rect            sourceRect;
        Rect            destRect;
        Rect            portBounds;
        SInt16          distance;
    static Point        sLastMouse = { -1, -1};

        GetPort( &savePort );
        windowPort = GetWindowPort(window);

        GetPortBounds( windowPort, &portBounds );

al cual vamos a hacer algunas modificaciones:

//----------------------------------------------------------------------------
//      MagnifyEventLoopTimer
//
//      Our magnification timer. Ideally we should be event based, but we can't
//      detect every event that might cause a screen update (window move)
//      so we resort to this.
//----------------------------------------------------------------------------

pascal void
MagnifyEventLoopTimer(EventLoopTimerRef /*inTimer*/, void *inUserData)
{
        WindowRef       window = (WindowRef)inUserData;
        Point           mouse;
        GrafPtr         windowPort;
         Rect            sourceRect;
        Rect            destRect;
        Rect            portBounds;
        SInt            distance;
    static Point        sLastMouse = { -1, -1};

        GetPort( &savePortLocal );
        windowPort =  GetWindowPort(window);

        GetPortBounds( windowPort, &portBounds );

así a simple vista es complicado ver las diferencias, para eso tenemos el comando diff:

5c5
< //      detect every event that might cause a screen update (window move, etc.)
---
> //      detect every event that might cause a screen update (window move)
15,17c15,16
<         GrafPtr         savePort;
<         Rect            sourceRect;
<         Rect            destRect;
---
>          Rect            sourceRect;
>         Rect            destRect;
19c18
<         SInt16          distance;
---
>         SInt            distance;
22,23c21,22
<         GetPort( &savePort );
<         windowPort = GetWindowPort(window);
---
>         GetPort( &savePortLocal );
>         windowPort =  GetWindowPort(window);

aunque al ser código C es mejor verlas así:

@@ -2,7 +2,7 @@
 //      MagnifyEventLoopTimer
 //
 //      Our magnification timer. Ideally we should be event based, but we can't
-//      detect every event that might cause a screen update (window move, etc.)
+//      detect every event that might cause a screen update (window move)
 //      so we resort to this.
 //----------------------------------------------------------------------------

@@ -12,15 +12,14 @@
         WindowRef       window = (WindowRef)inUserData;
         Point           mouse;
         GrafPtr         windowPort;
-        GrafPtr         savePort;
-        Rect            sourceRect;
-        Rect            destRect;
+         Rect            sourceRect;
+        Rect            destRect;
         Rect            portBounds;
-        SInt16          distance;
+        SInt            distance;
     static Point        sLastMouse = { -1, -1};

-        GetPort( &savePort );
-        windowPort = GetWindowPort(window);
+        GetPort( &savePortLocal );
+        windowPort =  GetWindowPort(window);

         GetPortBounds( windowPort, &portBounds );

con lo que vemos que se ha modificado y ahora deberíamos editar los ficheros y modificarlos por separado con nuestro editor favorito que si es vim podemos hacer algo mucho mejor y es ver las diferencias mientras los modificamos con el comando vimdiff:

vimdiff en acción

Lo que vemos con fondo rosa son líneas que tiene alguna diferencia, con fondo azul oscuro línaes que se han añadido, con fondo azul claro líneas que faltan, con fondo rojo los caracteres que cambian.
Como podemos ver en el cuadro de la izquierda tenemos una línea con fondo azul oscuro y en la parte derecha una con azul claro, indicando que hay una línea en la parte izquierda que no está en la derecha. Y con fondo rojo los cambios en un lado y otro.
Aquí estamos en el editor vim así que podemos usar todas las combinaciones de teclas y demás opciones del vim y según vayamos editando se irán comparando los dos ficheros y mostrando las diferencias.
Como recordatorio para pasar de una ventana a otra: control+w dos veces.

otool, la alternativa “ldd” en OSX

Para ver que librerías depende cierto binario, en Linux se hace con LDD pero en OSX no funciona así que una alternativa es OTOOL.

Según el manual (recomiendo leerlo man otool) con -L se lista las librerías dinámicas (con nombre y versión) que usa un binario, aquí pongo un ejemplo:

$ otool -L /opt/local/bin/minicom
/opt/local/bin/minicom:
        /opt/local/lib/libintl.8.dylib (compatibility version 9.0.0, current version 9.2.0)
        /opt/local/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
        /opt/local/lib/libncurses.5.dylib (compatibility version 5.0.0, current version 5.0.0)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)

Compilar un paquete Debian

Para compilar un paquete de la distribución estable (o en la que estemos) para modificar algo o simplemente para compilarlo nosotros (no recomendado), primero nos vamos a un directorio temporal, por ejemplo:

cd /usr/src/nombre_del_paquete

Luego nos bajamos el fuente y los ficheros necesarios, como el .diff y el .dsc:

apt-get source nombre_del_paquete

Para asegurarnos de que tenemos los paquetes necesarios para compilar:

apt-get build-dep netatalk

Ahora podemos ir al directorio donde están las fuentes y demás ficheros y directorios y modificar lo que necesitemos. Un fichero importante donde casi siempre añadiremos variables y opciones que por defecto no vienen es:

debian/rules

Una vez modificado lo que necesitemos, compilamos y generamos el o los paquetes tal cual lo haría un desarrollador:

dpkg-buildpackage

Una vez que termine (si no ha dado ningún error) un nivel por encima de donde estamos habrá generado el/los .deb que podremos instalar o actualizar y tendremos el paquete modificado casi como si fuera el oficial.