mercredi 30 janvier 2008

Une commande Unix / Linux / Mac OS X peu connue: arch

Voyons aujourd'hui une commande Mac OS X peu connue: il s'agit de la commande arch.

Cette commande renvoie l'architecture de la machine.
Le résultat peut être:
  • ppc pour un Apple Macintosh basé sur un processeur PowerPC 32 bits (G3, G4, G5)
  • ppc64 pour un Apple Macintosh basé sur un processeur PowerPC 64 bits (G5)
  • i386 pour un Apple Macintosh basé sur un processeur x86 (Intel) 32 bits
  • x86_64 pour un Apple Macintosh basé sur un processeur x86_64 (Intel) 64 bits
  • ??? (à vérifier - probablement arm) pour un iPhone, qui fait tourner Mac OS X sur un processeur arm.

Voyons les pages de manuel de cette commande arch:

Mac OS X Tiger sur PowerPC:

ARCH(1) BSD General Commands Manual ARCH(1)

NAME
arch -- print architecture type

SYNOPSIS
arch

DESCRIPTION
The arch command displays the machine's architecture type.

SEE ALSO
machine(1)

Mac OS August 20, 1997 Mac OS

Mac OS X Leopard sur Intel:

ARCH(1) BSD General Commands Manual ARCH(1)

NAME
arch -- print architecture type or run selected architecture of a univer-
sal binary

SYNOPSIS
arch
arch [-h] [[-arch_name | -arch arch_name]...] prog [args ...]

DESCRIPTION
The arch command with no arguments, displays the machine's architecture
type.

The other use of the arch command it to run a selected architecture of a
universal binary. A universal binary contains code that can run on dif-
ferent architectures. By default, the operating system will select the
architecture that most closely matches the processor type. This means
that an intel architecture is selected on intel processors and a powerpc
architecture is selected on powerpc processors. A 64-bit architecuture
is preferred over a 32-bit architecture on a 64-bit processor, while only
32-bit architectures can run on a 32-bit processor.

When the most natural architecture is unavailable, the operating system
will try to pick another architecture. On 64-bit processors, a 32-bit
architecture is tried. If this is also unavailable, the operating system
on an intel processor will try running a 32-bit powerpc architecture.
Otherwise, no architecture is run, and an error results.

The arch command can be use to alter the operating system's normal selec-
tion order. The most common use is to select the 32-bit architecture on
a 64-bit processor, even if a 64-bit architecture is available.

The -h option prints a usage message and exits.

The arch_name argument must be one of the currently supported architec-
tures:

i386 32-bit intel

ppc 32-bit powerpc

ppc64 64-bit powerpc

x86_64 64-bit intel

Either prefix the architecture with a hyphen, or (for compatibility with
other commands), use -arch followed by the architecture.

If more than one architecture is specified, the operating system will try
each one in order, skipping an architecture that is not supported on the
current processor, or is unavailable in the universal binary.

The prog argument is the command to run, followed by any arguments to
pass to the command. It can be a full or partial path, while a lone name
will be lookup in the user's command search path.

If no architectures are specified on the command line, the arch command
takes the basename of the prog argument and searches for the first prop-
erty list file with that basename and the .plist suffix, in the
archSettings sub-directory in each of the standard domains, in the fol-
lowing order:

~/Library/archSettings User settings

/Library/archSettings Local settings

/Network/Library/archSettings Network settings
Either prefix the architecture with a hyphen, or (for compatibility with
other commands), use -arch followed by the architecture.

If more than one architecture is specified, the operating system will try
each one in order, skipping an architecture that is not supported on the
current processor, or is unavailable in the universal binary.

The prog argument is the command to run, followed by any arguments to
pass to the command. It can be a full or partial path, while a lone name
will be lookup in the user's command search path.

If no architectures are specified on the command line, the arch command
takes the basename of the prog argument and searches for the first prop-
erty list file with that basename and the .plist suffix, in the
archSettings sub-directory in each of the standard domains, in the fol-
lowing order:

~/Library/archSettings User settings

/Library/archSettings Local settings

/Network/Library/archSettings Network settings
Either prefix the architecture with a hyphen, or (for compatibility with
other commands), use -arch followed by the architecture.

If more than one architecture is specified, the operating system will try
each one in order, skipping an architecture that is not supported on the
current processor, or is unavailable in the universal binary.

The prog argument is the command to run, followed by any arguments to
pass to the command. It can be a full or partial path, while a lone name
will be lookup in the user's command search path.

If no architectures are specified on the command line, the arch command
takes the basename of the prog argument and searches for the first prop-
erty list file with that basename and the .plist suffix, in the
archSettings sub-directory in each of the standard domains, in the fol-
lowing order:

~/Library/archSettings User settings

/Library/archSettings Local settings

/Network/Library/archSettings Network settings

/System/Library/archSettings System settings

This property list contains the architecture order preferences, as well
as the full path to the real executable. For examples of the property
list format, look at the files in /System/Library/archSettings.

Example
On an intel processor:

% perl -MConfig -e 'printf "%s\n", $Config{byteorder}'
1234

shows the intel little endian byte order, while:

% arch -ppc perl -MConfig -e 'printf "%s\n", $Config{byteorder}'
4321

runs the powerpc architecture, and displays big endian byte order.

Making links to the arch command
When a link is made to arch command with a different name, that name is
used to find the corresponding property list file. Thus, other commands
can be wrapped so that they have custom architecture selection order.
Because of some internal logic in the code, hard links to the arch com-
mand may not work quite right. It is best to avoid using hard links, and
only use symbolic links to the arch command.

Environment
The environment variable ARCHPREFERENCE can be used to provide architec-
ture order preferences. It is checked before looking for the correspond-
ing property list file.

The value of the environment variable ARCHPREFERENCE is composed of one
or more specifiers, separated by semicolons. A specifier is made up of
one, two or three fields, separated by colons. Architectures specified
in order, are separated by commas and make up the last (mandatory) field.
The first field, if specified, is a name of a program, which selects this
specifier if that name matches the program name in question. If the name
field is empty or there is no name field, the specifier matches any pro-
gram name. Thus, ordering of specifiers is important, and the one with
no name should be last.

When the arch command is called directly, the prog name provides the path
information to the executable (possibly via the command search path).
When a name is specified in a ARCHPREFERENCE specifier, the path informa-
tion can alternately be specified as a second field following the name.
When the arch command is called indirectly via a link, this path informa-
tion must be specified. If not specified as a second field in a speci-
fier, the executable path will be looked up in the corresponding property
list file.

Example ARCHPREFERENCE Values
ppc,i386,ppc64,x86_64
A specifier that matches any name.

foo:ppc,i386,ppc64,x86_64
A specifier that matches the program named foo (the full executable
path is in the foo.plist file).

foo:/op/bin/boo:ppc,i386,ppc64,x86_64
A specifier with all fields specified.

baz:ppc,i386;i386,ppc
A specifier for baz and a second specifier that would match any
other name.

BUGS
BUGS
Running the arch command on an interpreter script may not work if the
interpreter is a link to the arch command, especially if a 64-bit archi-
tecture is specified (since the arch command is 2-way universal, 32-bit
only).

SEE ALSO
machine(1)

Mac OS X November 12, 2006 Mac OS X


Il est à noter que sous Debian GNU/Linux, la commande arch existe dans Debian GNU/Linux 4.0 "etch", mais a disparu de Debian GNU/Linux "lenny", car elle est considérée "obsolète". Si vous en avez malgré tout besoin, utilisez la commande uname -m. Il vous suffit de créer un petit shell script /bin/arch du genre:

#!/bin/sh
#
# Remplace la commande arch
# Renvoie l'architecture de la machine
#
# Pierre Bauduin
# Le 24 décembre 2007
#
/bin/uname -m

Certains distributions Linux ont la commande arch, d'autres ne l'ont pas.

vendredi 25 janvier 2008

Pourquoi Apple n'a pas choisi X11 pour l'affichage dans Mac OS X

Pour l'affichage dans Mac OS X, n' a donc pas choisi d'utiliser X11 qui est majoritairement utilisé sous Unix, mais a développé sa propre technologie appelée Quartz.Ce commentaire sur slashdot nous explique pourquoi et indique aussi que Quartz est en partie basé sur NextStep. qui utilisait Display Postscript, une technologie basée en gros sur le même principe...

jeudi 24 janvier 2008

Voyagons dans le temps: video: Steve Jobs présente NextStep 3.0

Voici une vidéo de 1992 où Steve Jobs nous présente NextStep 3.0:


Remarquez par exemple que lorsque l'on déplace une fenêtre contenant une image, on ne voit pas juste les bords se déplacer, mais toute la fenêtre se déplace de manière très fluide. A notre époque c'est banal, mais cette vidéo date de fin 1992. A cette époque ni un PC ni un Macintosh ne savaient le faire. Les seules machines à pouvoir le faire étaient probablement des stations de travail Sun ou Silicon Graphics.

lundi 21 janvier 2008

Une commande Unix/Linux peu connue: who -b

Comme vous le savez probablement, la célèbre commande uptime vous permet de savoir depuis combien de temps une machine Unix/Linux est "up" c'est à dire "en service".

L'uptime d'une machine est généralement un bon indicateur de la stabilité de son système d'exploitation.

Cependant, il est peut être encore plus utile de savoir quand une machine a redémarré pour la dernière fois (date et heure précise). Ceci est particulièrement utile sur des serveurs au bureau. Connaître la date et heure exacte du dernier redémarrage est un bon indice pour déterminer la cause d'un redémarrage inopiné. Par exemple, qui était "de service" ce jour là à cette heure là ? Est-ce la nettoyeuse qui a débranché le serveur pour brancher son aspirateur ? Il suffit de taper:

who -b

Exemple sous Debian GNU/Linux:
[pbn@cobra] /home/pbn>who -b
system boot 2007-12-04 08:42
Exemple sous Solaris:
[pbn@fire] /export/home/pbn>who -b
. system boot Nov 8 10:55
Ceci fonctionne sur Red Hat Enterprise Linux, Debian GNU/Linux, Mac OS X, et Solaris, mais pas sous FreeBSD ni PC-BSD...

jeudi 17 janvier 2008

Les fat binaries sous Mac OS X: la commande lipo

Dans un post précédent je vous expliquais comment créer des "fat binaries" sous Mac OS X.

Je pars de mon petit programme hello.c. Il suffit en bref d'exécuter gcc avec certains paramètres:
[pierre@albert] /Users/pierre/Documents/source>gcc -arch i386 -arch ppc -arch ppc64 -o hello hello.c
La commande file nous indique bien qu'il y a trois exécutables dans ce fichier Mach-O:
[pierre@albert] /Users/pierre/Documents/source>file hello
hello: Mach-O universal binary with 3 architectures
hello (for architecture i386): Mach-O executable i386
hello (for architecture ppc7400): Mach-O executable ppc
hello (for architecture ppc64): Mach-O 64-bit executable ppc64
La commande otool -f nous est aussi utile, elle nous indique le "magic number" des "fat binaries":
[pierre@albert] 18:56 /Users/pierre/Documents/source>otool -f hello
Fat headers
fat_magic 0xcafebabe
nfat_arch 3
architecture 0
cputype 7
cpusubtype 3
capabilities 0x0
offset 4096
size 12588
align 2^12 (4096)
architecture 1
cputype 18
cpusubtype 10
capabilities 0x0
offset 20480
size 8508
align 2^12 (4096)
architecture 2
cputype 16777234
cpusubtype 0
capabilities 0x80
offset 32768
size 8552
align 2^12 (4096)

Voici maintenant le résultat de la commande lipo:
[pierre@albert] /Users/pierre/Documents/source>lipo -detailed_info hello
Fat header in: hello
fat_magic 0xcafebabe
nfat_arch 3
architecture i386
cputype CPU_TYPE_I386
cpusubtype CPU_SUBTYPE_I386_ALL
offset 4096
size 12588
align 2^12 (4096)
architecture ppc7400
cputype CPU_TYPE_POWERPC
cpusubtype CPU_SUBTYPE_POWERPC_7400
offset 20480
size 8508
align 2^12 (4096)
architecture ppc64
cputype CPU_TYPE_POWERPC64
cpusubtype CPU_SUBTYPE_POWERPC_ALL
offset 32768
size 8552
align 2^12 (4096)
Eh bien, c'est intéressant, je vois de manière détaillée que ce fichier hello contient trois exécutables, et j'obtiens l'offset de chacun.

... il est amusant de constater que le "magic number" pour les "fat binaries" est 0xcafebabe. C'est en fait le même "magic number" que celui du Java bytecode, c'est à dire des fichiers .class en Java. Souvenons-nous que le nom "Java" a été choisi car son créateur, James Gosling, est un grand consommateur de café, sans quoi Java se serait appelé Oak.

... au fait, pourquoi cette commande s'appelle-t-elle lipo ? Peut être une jeu de mot sur les "fat binaries" et la liposuccion ("liposuction" en anglais) ?

Vous pouvez aussi consulter ce document officiel Apple sur la structure des exécutables Mach-O.

mercredi 16 janvier 2008

Pourquoi le shell par défaut de Mac OS X est bash et non plus tcsh

Jusqu'à la version 10.2 (Jaguar) de Mac OS X, le shell par défaut était tcsh.

Depuis la version 10.3 (Panther) de Mac OS X, sortie le 24 octobre 2003, le shell par défaut est bash.

Pourquoi ?

De nombreuses explications contradictoires circulent.

Une des plus connues est qu'Apple aurait voulu faciliter le passage des utilisateurs Linux à Mac OS X. En effet, sur la plupart des distributions Linux, le shell par défaut est bash.

Par contre, dans FreeBSD et PC-BSD, le shell par défaut est tcsh.

La vérité est tout autre: la raison principale du passage de tcsh à bash est que bash supporte complètement l'Unicode. Le support Unicode intéresse énormément Apple puisque un de ses objectifs est de supporter le plus de langues possibles dans Mac OS X.

Je peux vous assurer de la véracité de cette information, c'est Jordan Hubbard lui-même qui l'écrit ici.

Jordan Hubbard était un des développeurs principaux de FreeBSD, jusqu'à ce qu'il soit engagé par Apple en juillet 2001 comme "Director of UNIX Technology". Si quelqu'un connaît bien la partie BSD de Mac OS X, c'est bien lui.

mardi 15 janvier 2008

Le MacBook Air est sorti !

Cela faisait un certain temps que la rumeur était dans l'air (si j'ose dire), maintenant il est là: le MacBook Air:

Site officiel:
http://www.apple.com/macbookair/

Première "prise en main" par macrumors.com, regardez les photos, c'est impressionnant:
http://www.macrumors.com/2008/01/15/first-look-at-the-macbook-air/

lundi 14 janvier 2008

Voyagons dans le temps: NextStep

Comme je vous l'ai déjà expliqué dans plusieurs articles précédents, Mac OS X descend en droite ligne du système d'exploitation NextStep créé par Steve Jobs.

Voici une capture d'écran:


Vous pouvez reconnaître des éléments que l'on retrouve dans Mac OS X aujourd'hui:
  • le Dock
  • la navigation en plusieurs colonnes dans le système de fichier (présent dans le Finder actuel)

samedi 12 janvier 2008

Voyagons dans le temps: Rhapsody Developer Release 2

Comme je vous l'ai expliqué dans un article précédent, Mac OS X descend de NextStep.

En bref, NextStep était un système d'exploitation très avancé pour son époque, créé par Steve Jobs lorsqu'il a été "mis dehors" d'Apple en 1985.

Fin 1996, Apple est dans de sérieuses difficultés financières et technologiques, notamment suite aux échecs successifs de trois projets de "système d'exploitation d'une nouvelle génération": Taligent, Copland et Gershwin. Jobs retourne alors chez Apple et reçoit "carte blanche". Il prend rapidement "le taureau par les cornes": il fait racheter par Apple sa propre société NextStep le 20 décembre 1996. Commence alors le développement d'un "système d'exploitation d'une nouvelle génération", mais un qui verra le jour ! Ce projet s'appelle Rhapsody. Il est présenté pour la première fois à la Worldwide Developer Conference début 1997 (Rhapsody Developer Release 1) . Ensuite en août 1997 sort la Rhapsody Developer Release 2. Regardez attentivement les quelques captures d'écran:

... ceci nous rappelle furieusement l'écran de login de Mac OS X.

Regardez un peu ceci:

... c'est sans aucun doute un système de type Unix !

Regardez celle-ci:


... eh oui, de nombreux éléments de Mac OS X viennent en droite ligne de NextStep et/ou de Rhapsody...

mercredi 9 janvier 2008

Comparons le header Mach-O sous powerpc et x86

Le format d'exécutable sous Mac OS X est le format Mach-O.

La commande otool -h permet d'analyser le header d'un fichier au format Mach-O.

Je lis à la page 12 de "Mac OS X ABI Mach-O File Format Reference" que le header du format Mach-O a toujours la structure suivante:
struct mach_header
{
uint32_t magic;
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
};

Voyons le résultat de otool -h sur un fichier Mach-O bien connu (/bin/ls), mais sur deux architectures différentes:

Mac OS X Leopard sur Intel (x86):
[pierre@albert] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 14 1304 0x00000085

Mac OS X Tiger sur PowerPC (powerpc):
[pierre@blueandwhite] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype filetype ncmds sizeofcmds flags
0xfeedface 18 0 2 11 1608 0x00000085
Regardez attentivement cputype: c'est lui qui nous indique sur quelle architecture nous sommes.

Voyez aussi la page man de la commande arch

En fait, le format Mach-O est directement hérité de NextStep, qui au long de son existence a été disponible pour plusieurs architectures: PowerPC, x86, PA-RISC et SPARC.

mardi 8 janvier 2008

"Magic number" dans les quatre premiers octets des fichiers au format Mach-O

Le format d'exécutable sous Mac OS X est le format Mach-O.

Ce format a un certain nombre d'avantages, notamment la possibilité d'avoir des "fat binaries", appelées "Universal Binaries" par Apple, d'ailleurs je vous en avais déjà parlé ici et ici.

La commande otool -h permet d'analyser le header d'un fichier au format Mach-O. Voyons le résultat sur un fichier Mach-O bien connu (/bin/ls), et un autre fichier Mach-O que j'ai compilé moi-même:
[pierre@albert] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 14 1304 0x00000085
[pierre@albert] /Users/pierre>otool -h Documents/source/hello
Documents/source/hello:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 11 936 0x00000085
Il est amusant de constater que le "magic number" dans le header est 0xfeedface.
En fait les quatre premiers octets de tout fichier au format Mach-O sont toujours 0xfeedface ou 0xcefaedfe si vous lisez un fichier petit-boutiste (little-endian) sur une machine grand-boutiste (big-endian), ou l'inverse...

Vous pouvez aussi consulter cette documentation officielle Apple sur la structure des exécutables Mach-O.

lundi 7 janvier 2008

Après avoir changé le nom d'une machine Mac OS X, l'ancien nom subsiste

Quelques jours après avoir mis en service mon iMac, je decide de changer le nom de la machine. Je lui avais d'abord donné comme nom imac, et je lui donne maintenant le nom albert.

Pour changer le nom, évidemment j'utilise l'interface graphique. Il faut aller dans "Préférences Système > Partage" (au passage, c'est un peu surprenant que le nom de la machine se trouve dans "Partage"), et je remplace imac par albert, regardez:

Apparemment le nom a changé. Cependant, quand j'ouvre un Terminal.app, mon prompt est:
[pierre@imac] /Users/pierre>
D'où vient ce "imac" ? C'est la variable d'environnement $HOSTNAME dans bash.

Vérifions le nom de la machine. Sous Unix deux commandes me donnent le nom de la machine:
hostname et uname -n

Allons-y:
[pierre@imac] /Users/pierre>hostname
imac
[pierre@imac] /Users/pierre>uname -n
imac
... eh bien ça alors, elle a encore l'ancien nom ?

Je suis perplexe, et je décide de le faire "à la Windows": rebooter.

Après le reboot, je vois à l'écran de login, en dessous de la pomme, que le nom de la machine est albert. Ensuite je me loggue, et je lance à nouveau hostname et uname -n:
[pierre@imac] /Users/pierre>hostname
imac
[pierre@imac] /Users/pierre>uname -n
imac
Eh bien ça alors ?

Je vais dans "Préférences Systèmes > Partage"
Et je vois:


Que se passe-t-il ?

... après quelques recherches, je me rends compte que ce nom "imac" persiste parceque mon serveur DNS contient toujours le nom "imac" pour l'adresse IP de cette machine.

Donc en bref, quel que soit le nom que vous donnez à une machine Mac OS X dans "Préférences Systèmes > Partage", elle va malgré tout contacter le serveur DNS que vous avez configuré, et elle va prendre comme hostnome le nom correspondant au reverse DNS de son adresse IP !

Voilà qui est étonnant !

Notez, c'est peut-être voulu...
"It's not a bug, it's a feature" comme disent certains...

vendredi 4 janvier 2008

Imprimer à partir de Mac OS X sur une imprimante IPP:problème résolu !

Dans un post précédent je vous expliquais que je n'arrivais pas à imprimer sur une imprimante IPP à partir de Mac OS X Léopard. Après m'être gratté la tête un certain temps, j'ai fini par trouver la solution.

Lorsque j'ajoute une imprimante dans Mac OS X dans Préférences Systèmes > Imprimantes et Fax et que je choisis la catégorie IP, j'ai l'écran suivant:


Comme souvent avec Mac OS X, (je ne dis pas cela pour "passer la pommade" :) ), l'écran de configuration est clair et relativement intuitif. Dans "Adresse" j'entre donc l'adresse et le numéro de port, c'est à dire 10.20.10.1:631, et dans "File d'attente" j'indique le nom de la file c'est à dire Claire. J'obtiens donc l'écran suivant:


... hélas, trois fois hélas, avec la configuration ci-dessus je n'imprimerai jamais rien sur mon imprimante Claire. Pourquoi ?
Eh bien, en fait, j'ai fini par découvrir qu'il faut dire à Mac OS X (c'est à dire au serveur CUPS de Mac OS X) d'imprimer non pas à l'adresse IPP suivante:
ipp://10.20.10.1:631/Claire
... mais bien à l'adresse IPP suivante:
ipp://10.20.10.1:631/printers/Claire

Or avec la configuration ci-dessus, je dis à Mac OS X d'imprimer à l'adresse IPP ipp://10.20.10.1:631/Claire. La solution est donc de dire à Mac OS X d'imprimer à l'adresse IPP ipp://10.20.10.1:631/printers/Claire. Pour cela il faut remplir la fenêtre de configuration comme ci-dessous:


Ce qui correspond à la configuration suivant dans CUPS sur ma machine Mac OS X:


Et voilà, problème résolu !

jeudi 3 janvier 2008

Mac OS X : Comment désactiver complètement Spotlight

Si comme moi vous utilisez Mac OS X Tiger sur un iBook G3 à 800 MHz avec 640 MB de RAM, vous pouvez améliorer les performances de votre machine en désactivant Spotlight. Voici comment faire:

Attention, tout ceci est prévu pour Mac OS X Tiger, et je ne saurais garantir qu'il fonctionne avec d'autres versions...


Attention vous allez travailler en ligne de commande avec l'utilisateur root. Soyez attentif...





Tout d'abord devenez root en tapant sudo su - puis votre mot de passe.
$ sudo su
Ensuite effectuez les commandes suivantes:

# chmod 0000 /Library/Spotlight
# chmod 0000 /System/Library/Spotlight
# chmod 0000 /System/Library/CoreServices/Search.bundle
# chmod 0000 /System/Library/PreferencePanes/Spotlight.prefPane
# chmod 0000 /System/Library/Services/Spotlight.service
# chmod 0000 /System/Library/Contextual Menu Items/SpotlightCM.plugin
# chmod 0000 /System/Library/StartupItems/Metadata
# chmod 0000 /usr/bin/mdimport
# chmod 0000 /usr/bin/mdcheckschema
# chmod 0000 /usr/bin/mdfind
# chmod 0000 /usr/bin/mdls
# chmod 0000 /usr/bin/mdutil
# chmod 0000 /usr/bin/md

Vous pouvez maintenant redémarrer votre machine
Après le redémarrage, faites à nouveau:
$ sudo su
et tapez votre mot de passe
Ensuite:
# rm -r /.Spotlight-V100
# rm -r /private/var/tmp/mds

Ce petit truc provient en fait d'une page sur Mac OS X Hints.

mardi 1 janvier 2008

Installer Big Brother client sur Mac OS X

Ah oui, tout d'abord, bonne année !

Aujourd'hui je vais vous expliquer comment installer Big Brother client sur une machine Mac OS X. Big Brother est un outil de monitoring freeware (mais qui existe aussi en version commerciale). Je l'utilise ou je l'ai utilisé sous Debian GNU/Linux, Red Hat, PC-BSD, FreeBSD, Solaris, AIX et Windows. Voyons comment l'installer sous Mac OS X:

Création d'un utilisateur bb
Tout d'abord je crée un utilisateur dont le login sera (par tradition) bb:
Dans "Préférences Systèmes" allez dans "Comptes"
(Pour créer un utilisateur vous devez avoir un compte d'administrateur)
Si le cadenas est fermé, je clique dessus, et je tape mon nom et mot de passe pour le débloquer.
Cliquez sur le "+"
Nom: Big Brother
Nom abrégé: bb
Pour le mot de passe, je tape quelque chose de difficile à trouver, par exemple 5dAkr42, de toutes façons je n'aurai jamais besoin de ce mot de passe (nous verrons plus loin pourquoi)
Je ne coche pas "Autoriser à administrer cet ordinateur"
Je clique "Créer le compte"

Rapatriement de Big Brother
Je vais chercher Big Brother à l'adresse suivante:
http://bb4.org/dnld/bb-1.9i.tar.gz
Je place ce fichier dans le répertoire /Users/bb

Je deviens l'utilisateur Big Brother. Vous me direz: "Oui mais, je ne connais pas son mot de passe !". Pas besoin, avec mon compte d'administateur il me suffit de faire:
[pierre@ibook] /Users/pierre>sudo su - bb
Password:
[bb@ibook] /Users/bb>

Décompression du fichier de Big Brother
En tant que l'utilisatateur bb:
Je décompresse le .tar.gz, j'obtiens trois fichiers:
[bb@ibook] /Users/bb>tar -zxvf bb-1.9i.tar.gz
BB.README.FIRST
BBSVR-bb1.9i-btf.tar
BBCLT-bbc1.9i-btf.tar

Il y a à ce moment trois fichiers que je peux effacer:
[bb@ibook] /Users/bb>rm bb-1.9i.tar.gz
[bb@ibook] /Users/bb>rm BBSVR-bb1.9i-btf.tar
[bb@ibook] /Users/bb>rm BB.README.FIRST
(Le premier je viens de le décompresser, le deuxième c'est la partie serveur dont je n'ai pas du tout besoin sur Mac OS X, et le troisième, passons...)

Il me reste le fichier BBCLT-bbc1.9i-btf.tar. Je le décompose:
[bb@ibook] /Users/bb>time tar -xvf BBCLT-bbc1.9i-btf.tar
bbc1.9i-btf/LICENSE
bbc1.9i-btf/README
bbc1.9i-btf/README.INSTALL
bbc1.9i-btf/README.CHANGES
bbc1.9i-btf/README.SECURITY
bbc1.9i-btf/README.SUPPORT
bbc1.9i-btf/runbb.sh.DIST
bbc1.9i-btf/bin/bb-combo.sh
bbc1.9i-btf/bin/bb-cpu.sh
bbc1.9i-btf/bin/bb-disk.sh
bbc1.9i-btf/bin/bb-local.sh
bbc1.9i-btf/bin/bb-msgs.sh
bbc1.9i-btf/bin/bb-ping.sh
bbc1.9i-btf/bin/bb-procs.sh
bbc1.9i-btf/etc/bb-bbexttab.DIST
bbc1.9i-btf/etc/bb-cputab.DIST
bbc1.9i-btf/etc/bb-dftab.DIST
bbc1.9i-btf/etc/bb-msgstab.DIST
bbc1.9i-btf/etc/bb-proctab.DIST
bbc1.9i-btf/etc/bbchkcfg.sh
bbc1.9i-btf/etc/bbchkcmds.sh
bbc1.9i-btf/etc/bbchkhosts.sh
bbc1.9i-btf/etc/bbdef.sh.DIST
bbc1.9i-btf/etc/bbdef-client.sh
bbc1.9i-btf/etc/bbinc.sh
bbc1.9i-btf/etc/bbinc-client.sh
bbc1.9i-btf/etc/bbsys.sh
bbc1.9i-btf/etc/bbwarnsetup.cfg
bbc1.9i-btf/etc/bb-hosts
bbc1.9i-btf/ext/ext-proto
bbc1.9i-btf/install/README
bbc1.9i-btf/install/README.SMS
bbc1.9i-btf/install/bbconfig
bbc1.9i-btf/install/bbmachine
bbc1.9i-btf/install/bbsys.aix
bbc1.9i-btf/install/bbsys.bsdi
bbc1.9i-btf/install/bbsys.bsdi4
bbc1.9i-btf/install/bbsys.caldera
bbc1.9i-btf/install/bbsys.darwin
bbc1.9i-btf/install/bbsys.debian
bbc1.9i-btf/install/bbsys.dgux
bbc1.9i-btf/install/bbsys.dynix
bbc1.9i-btf/install/bbsys.fedora
bbc1.9i-btf/install/bbsys.freebsd
bbc1.9i-btf/install/bbsys.hpux
bbc1.9i-btf/install/bbsys.hpux9
bbc1.9i-btf/install/bbsys.irix
bbc1.9i-btf/install/bbsys.linux
bbc1.9i-btf/install/bbsys.mandrake
bbc1.9i-btf/install/bbsys.netbsd
bbc1.9i-btf/install/bbsys.openbsd
bbc1.9i-btf/install/bbsys.osf
bbc1.9i-btf/install/bbsys.redhat
bbc1.9i-btf/install/bbsys.redhatES
bbc1.9i-btf/install/bbsys.sco
bbc1.9i-btf/install/bbsys.sco3
bbc1.9i-btf/install/bbsys.sinix
bbc1.9i-btf/install/bbsys.solaris
bbc1.9i-btf/install/bbsys.sunos
bbc1.9i-btf/install/bbsys.suse
bbc1.9i-btf/install/bbsys.ultrix
bbc1.9i-btf/install/bbsys.unixware
bbc1.9i-btf/install/bbsys.unixware7
bbc1.9i-btf/tmp/.helloworld
bbc1.9i-btf/src/README
bbc1.9i-btf/src/bb.c
bbc1.9i-btf/src/bb.h
bbc1.9i-btf/src/bbrun.c
bbc1.9i-btf/src/bbsend.c
bbc1.9i-btf/src/bbstat.c
bbc1.9i-btf/src/minimake/Makefile
bbc1.9i-btf/src/minimake/README
bbc1.9i-btf/src/minimake/bbmachine
bbc1.9i-btf/src/minimake/genbbdefs
bbc1.9i-btf/src/minimake/genmake
bbc1.9i-btf/src/minimake/getid
bbc1.9i-btf/src/minimake/client
bbc1.9i-btf/src/touchtime.c
bbc1.9i-btf/src/utils.c
bbc1.9i-btf/src/getipaddr.c
bbc1.9i-btf/src/Makefile

Je renomme le répertoire bbc1.9i-btf en bbclient:
[bb@ibook] /Users/bb>mv bbc1.9i-btf bbclient

Je me place dans le répertoire bbclient:
[bb@ibook] /Users/bb>cd bbclient
[bb@ibook] /Users/bb/bbclient>

Si vous êtes curieux et/ou si vous avez le temps, lisez le fichier README.INSTALL qui vous expliquera en détail l'installation. Mais bon comme j'explique tout ici vous n'avez pas vraiment besoin de RTFM :)

Compilation de Big Brother
Allons-y pour compiler le client Big Brother:
D'abord, configurer les sources pour Mac OS X (Darwin):
[bb@ibook] /Users/bb/bbclient/install>./bbconfig darwin
(Lisez et acceptez la licence)

Je répond à une première question:
Big Brother needs it's own user id. If your BB user doesn't exist, you'll have to create it then re-run bbconfig.
What will be the user ID for BB [bb]:
Je tape ENTER

---> BB will only run from user 'bb'
Making sure BBHOME is writable...
---> OK, /Users/bb/bbclient is fine...

Je répond à une deuxième question:
When you set up your machines, you should use Fully Qualified
Domain names, this means you use the whole name, like www.bb4.com,
instead of just 'www'. This is recommended.
Use FQDN (y/n): [y]
Je réponds n pour non

Ca y est, je peux compiler:

[bb@ibook] /Users/bb>cd /Users/bb/bbclient/src
[bb@ibook] /Users/bb/bbclient/src>make
Making darwin makefile
BBOS="darwin" CC="gcc" CFLAGS=" -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O" make -e bball
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o bb.o -c bb.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o bbsend.o -c bbsend.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o utils.o -c utils.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o ../bin.`./minimake/bbmachine OS`/bb bb.o bbsend.o utils.o
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o touchtime.o -c touchtime.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o ../bin.`./minimake/bbmachine OS`/touchtime touchtime.o
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o getipaddr.o -c getipaddr.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o ../bin.`./minimake/bbmachine OS`/getipaddr getipaddr.o utils.o
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o bbrun.o -c bbrun.c
gcc -DZOMBIE -Ddarwin -DGETTIMEOFDAY -DREGEXEC -O `./minimake/genbbdefs` -g -o ../bin.`./minimake/bbmachine OS`/bbrun bbrun.o utils.o
[bb@ibook] /Users/bb/bbclient/src>make install

(Ah oui, évidemment, à cette étape le script d'installation fait appel à gcc, il faut donc que vous ayez installé XCode)

La compilation est terminée, j'approche du but.

Création du fichier de configuration de Big Brother
Il me faut maintenant créer le fichier de configuration. Allons dans le répertoire adéquat:
[bb@ibook] /Users/bb>cd bbclient/etc
Je regarde le fichier bb-hosts livré par défaut:
[bb@ibook] /Users/bb/bbclient/etc>cat bb-hosts

Je renomme le fichier livré par défaut:
[bb@ibook] /Users/bb/bbclient/etc>mv bb-hosts bb-hosts.DIST

Je crée mon fichier bb-hosts et j'y écris simplement deux lignes:
10.42.10.1 venus # BBPAGER BBNET BBDISPLAY
10.42.10.28 ibook

Ici 10.42.10.28 ibook est l'adresse IP et le nom de ma machine client Mac OS X, et 10.42.10.1 venus l'adresse IP et le nom de ma machine serveur Big Brother. (Pour connaître l'adresse IP de votre machine, tapez ifconfig en0 ou allez dans Préférences Systèmes > Réseau). Evidemment cela ne fonctionnera correctement que si votre machine Mac OS X a une adresse IP fixe...

Sur mon serveur Big Brother, j'ajoute une ligne du genre:
10.42.10.28 ibook
(Ou si la machine Mac OS X n'est pas allumée en permanence:)
10.42.10.28 ibook #noping

Premier lancement du client
Je peux enfin lancer le client:
[bb@ibook] /Users/bb>cd /Users/bb/bbclient/
[bb@ibook] /Users/bb/bbclient>./runbb.sh start
Starting Big Brother
Starting Local tests (bb-local)...
Big Brother 1.9i started
[bb@ibook] /Users/bb/bbclient>

Ca y est, ca tourne !
Je regarde maintenant mon serveur Big Brother et j'y vois des boules vertes !

Si vous voyez des boules rouges, il peut y avoir plusieurs problèmes:

Premier problème possible:
La boule "msgs" est rouge, et quand je clique dessus je vois "/var/log/system.log is unreadable". Comme le message le dit, l'utilisateur bb ne peut pas ouvrir le fichier /var/log/system.log en lecture. Voyons les permissions sur ce fichier:
-rw-r----- 1 root admin 478K Jan 1 15:10 /var/log/system.log
Dès lors, pour que l'utilisateur bb puisse lire ce fichier, deux solutions:
a) Changer les permissions du fichier en . Mais alors, il est world-readable, ce qui peut être considéré comme un "problème de sécurité" par les Unix gurus.
b) Mettre l'utilisateur bb dans le groupe adm. A nouveau, ceci peut être considéré comme un "problème de sécurité" par les Unix gurus.

Deuxième problème possible:
La boule "disk" est rouge, et quand je clique dessus je vois "red Mon Dec 31 16:00:00 CET 2007 - Filesystem of /Users/bb/bbclient/tmp is FULL"
J'ai constaté que ce problème survient avec Léopard, mais pas avec Tiger. Il est dû à une nouvelle syntaxe de la commande sort sous Mac OS X Léopard. La solution à ce problème m'a été donnée par Martin Costabel (grand merci à lui). Il suffit d'éditer le fichier /Users/bb/bbclient/bin/bb-disk.sh . D'abord, je renomme l'original et je crée une copie:
[bb@ibook] /Users/bb>cd bbclient/bin
[bb@ibook] /Users/bb/bbclient/bin> mv bb-disk.sh bb-disk.sh.DIST
[bb@ibook] /Users/bb/bbclient/bin> cp bb-disk.sh.DIST bb-disk.sh
Ensuite j'édite bb-disk.sh: je remplace \"+${DFSORT}\" par \"-k$(($DFSORT+1))\" (Attention: Il faut le faire deux fois à deux endroits différents dans le fichier)

Pour que le client Big Brother démarre automatiquement
Avec ceci, il faut à chaque démarrage de la machine Mac OS X, aller démarrer le client Big Brother en effectuant des commandes du genre:
[pierre@ibook] /Users/pierre> sudo su - bb
[bb@ibook] /Users/bb> ./bbclient/runbb.sh start
... ce qui est assez pénible
Je vous conseille donc fortement de mettre le client Big Brother en "démarrage automatique". Pour cela, devenez l'utilisateur bb (par sudo su - bb par exemple), et ensuite:
[bb@ibook] /Users/bb>crontab -e

Dans le crontab de bb, une seule ligne à écrire:
@reboot /Users/bb/bbclient/runbb.sh start

Eventuellement, redémarrez pour vous assurer que le client Big Brother démarre bien tout seul

Ajustement cosmétique
Comme j'ai créé un utilisateur bb, il apparaît évidemment dans l'écran de connexion et dans la "permutation rapide d'utilisateur". Cela vous ennuie ? J'ai la solution:
[pierre@ibook] /Users/pierre> sudo defaults write /Library/Preferences/com.apple.loginwindow HiddenUsersList -array-add bb

Pour les "bêtes de Mac OS X", enfin je veux dire: les utilisateurs avancés
Il est possible de créer l'utilisateur bb, et de le mettre dans le bon groupe, tout ça en ligne de commande. Par exemple:
Créer l'utilisateur bb:
sudo dscl . -create /Users/bb
sudo dscl . -create /Users/bb UserShell /bin/bash
sudo dscl . -create /Users/bb RealName "Big Brother"
sudo dscl . -create /Users/bb UniqueID xxx
sudo dscl . -create /Users/bb PrimaryGroupID 20
sudo dscl . -create /Users/bb NFSHomeDirectory /Users/bb
sudo mkdir /Users/bb
sudo chgrp staff
/Users/bb
sudo chown bb /Users/bb

(où xxx est le UID, faites bien attention d'en choisir un qui n'existe pas déjà, pour cela faites sudo dscl . list /users UniqueID pour voir ceux qui sont déjà utilisés. Dans mon cas l'UniqueID est 503. Le PrimaryGroupID 20 correspond à staff, en tous cas sous Tiger et Léopard)

Ceci a l'avantage de pouvoir choisir avec précision l'UID et le GID. De plus, les répertoires "qui ne servent à rien" pour l'utilisateur bb: Library, Pictures, Desktop, Movies, Public, Documents, Music, Sites ne sont pas créés.

(N'oubliez pas de mettre un mot de passe en faisant sudo passwd bb)

... et voilà, on y est arrivé !