Plan de la présentation
? Introduction
? Présentation de Linux
? Démarrage de Linux
? Administration du système
Introduction
? Rôle de l'administrateur système
? Choix d'un système d'exploitation Rôle de l’administrateur système
? Installation des systèmes d’exploitation
? Gestion des comptes utilisateurs
? Gérer les fichiers et les disques
? Organiser les sauvegardes
? Ajout / Suppression de périphériques
? Gestion du parc informatique
? Installation des nouveaux produits
? Veille à la sécurité du système
? On choisit un système d’exploitation principalement en fonction des logiciels que l’on compte utiliser, du type de personnes qui auront à effectuer le suivi du système (taches d’administration courantes), de l’environnement informatique existant.
? On choisit aussi le système en fonction du coût (humain et financier) des différentes solutions envisageables.
? Système Unix initialement crée par un étudiant finlandais Linus Torvalds puis aidé par de nombreux bénévoles
? Première version opérationnelle sortie fin 1991 (v 0.9.9)
? Distribué sous licence GPL (Gnu Public License)
? Version 1.0 sortie en 1994
?Noyau et modules
?Fichiers
? Ensemble logiciel assurant l’interface entre le matériel et les processus (systèmes ou utilisateurs)
? Chargé au démarrage du système, reste en mémoire
? Une fois initialisé, il détecte les périphériques et lance le premier processus (init)
? Il peut être monolithique ou à modules dynamiques
? Entièrement configurable par l’administrateur
? Abstraction du matériel
? Couche logique = API unifiée
? Pilotes pour la gestion des périphériques
? Gestion des processus
Naissance, suspension, suppression
? Gestion des communications interprocessus Signaux, tubes,
? Partage du temps machine entre les processus
? Gestion de la mémoire
Réservation, libération, échange (swap).
? Module = extension du noyau à charger dynamiquement
.o placé dans /lib/modules/version_de_noyau ? Pilotes matériels sont les modules les plus courants
? Commandes :
lsmod : liste les modules insmod : charge un module rmmod : retire un module
depmod : établit les dépendances inter-modules modprobe : charge ou retire modules et dépendances
? Fichiers :
: configuration de modprobe
: liste des dépendances
?Noyau et modules
?Fichiers
?Disques et autres média
? Sous UNIX, tout est représenté par un fichier données (bien sûr), mais aussi périphérique, mémoire
? Différents types de « fichiers »
Les plus courants : normal (-), répertoire (d)
Mais aussi : lien symbolique (l), périphérique (c), etc.
? Commande pour voir le détail des fichiers : ls -l
-rw-r--r-- 1 mquinson users 1055740 Jun 13 16:42 toto
Les droits d'accès aux fichiers sont limités
? On distingue trois classes d'utilisateurs par fichier :
Propriétaire ; Membres de son groupe ; Autres ? Pour chaque classe, trois droits d'accès de base :
Lecture (r) ; Écriture (w) ; Exécution (x)
Question : que veut dire exécution d'un répertoire?
? Changer les droits (des fichiers dont on est propriétaire) ? chmod o+x toto (donne le droit x aux autres – other)
[ugo][+-][rwx]
? chmod 755 toto (fixe les droits à rwxr-xr-x) r = 4 ; w = 2 ; x = 1
? Sticky bit (t – 1000)
Reste en mémoire après exécution (chargement rapide)
(Seul le super-utilisateur peut donner ce droit)
? Droits d'endossement (s)
S'exécutent sous l'identité du propriétaire
? setuid (user identity) : 4000
? setgid (group identity) : 2000
? Les fichiers sont rangés sous forme d'arbre
Racine unique ? différence avec windows (a:, c:, d:)
? Le standard FHS précise la place des fichiers
Filesystem Hierarchy Standard ; plus ou moins suivi
/etc : emplacement de la configuration
/home : fichiers des utilisateurs
/home/mquinson et /home/toto etc.
/dev : fichiers spéciaux des périphériques
/proc (ou /sys) : fichiers spéciaux interface avec le noyau
/usr : programmes classiques
/usr/bin : les exécutables eux-mêmes
/usr/lib : bibliothèques
/usr/sbin : exécutables réservés au super-utilisateur
/usr/share/doc et /usr/share/man : documentation
/bin et /sbin : programmes nécessaires au démarrage
/tmp : fichiers temporaires (effaçables)
/var : ce qui change au cours du temps (comme DB)
? Configuration du système en général
/etc/rc : scripts de démarrage
/etc/passwd : DB utilisateurs, mots de passe, etc.
/etc/fstab : configuration des montages disques
/etc/motd : mot du jour affiché au login
/etc/profile : configuration des shells
? Configuration de chacun des programmes réglages pour tout le système (non modifiable par les utilisateurs)
Un fichier ou un répertoire par programme.
/usr/bin : presque tous les programmes du système
/usr/sbin : les programmes réservés au super-utilisateur
/usr/share : ce qu'on peut partager entre architecture
/usr/share/doc : la documentation (format libre)
/usr/share/man : documentation au format man
/usr/lib : les bibliothèques et autre
/usr/include : les entêtes (.h du langage C)
/usr/local : fourre tout pour les installations manuelles /usr/local/bin, /usr/local/lib etc.
/bin et /sbin : programmes nécessaires au démarrage
/var/log : journaux du système
/var/spool : mails en attente de distribution, etc.
/var/lock : verrous
/var/local : pour les programmes de /usr/local
/var/run : informations sur le système (jusqu'au reboot)
/var/run/utmp : informations sur les utilisateurs présents /var/tmp : temporaires devant survivre aux reboots
Points d'interaction avec le noyau
/proc/123 : informations sur le processus numéro 123
/proc/self : idem pour le processus appelant
/proc/cpuinfo : informations sur le(s) processeur(s)
/proc/kcore : la mémoire physique (pour accès direct) /proc/stat : diverses infos sur le système
/proc/modules : listes des modules chargés actuellement /proc/loadavg : charge actuelle
/proc/net : interactions avec les modules réseau
? Points d'interaction avec les pilotes du noyau
(et donc avec le matériel)
? Ils sont crées avec MAKEDEV ou mknod :
mknod /dev/ttyS0 c 4 64 chown root.dialout /dev/ttyS0 chmod 0644 /dev/ttyS0 ls -l /dev/ttyS0
crw-rw---- 1 root dialout 4, 64 Oct 23 18:23 /dev/ttyS0
/dev/dsp : carte son
/dev/fd0 : premier lecteur de disquette /dev/psaux : port souris PS/2
/dev/null : écritures ignorées (poubelle)
/dev/zero : lecture donne que des zéros
/dev/random : lecture donne des données aléatoires
/mnt : point de montage des (autres) disques
/tmp : fichiers temporaires
/boot : fichiers nécessaire au démarreur
?Noyau et modules
?Fichiers
? Deux types de média :
? Accès direct par bloc (block device) : disques durs
? Ce qu'on peut faire avec les disques :
? Formater (préparation – marque pistes et secteurs)
? Partitionner (découper en disques durs logiques)
? Créer un système de fichiers (définir la représentation physique des données logiques)
? Monter les disques (attribuer une place dans l'arbre)
Formater :
Marquer les pistes et secteurs sur le support magnétique.
Outils : fdformat(8) et badblocks(8)
Partitionner :
Couper le disque physique en disques logiques (un disque, deux OS).
MBR : master boot record
- table des partitions
- chargeur de démarrage
Partitions primaires, étendues et logiques 4 partitions primaires par disque au plus. Partition étendue = une primaire contenant des « sous-partitions » (logiques)
Partitions et fichiers de périphérique
Ex : /dev/hda0 1er disque, 1ère partition
? Représentation physique des données sur disque
? Moyen d'accès aux données (logiciel)
Interface logique d'accès aux données Personne n'accède directement au disque
? Type de FS existants :
? Linux : ext2, ext3, reiserfs, nfs
? Dos/windows : vfat, ntfs, smbfs
? CD-ROM : iso9660
? Journalisation : FS valide à tout instant
=> ok même si on coupe le courant (ext3, reiserfs, ntfs).
? Outil de création de système de fichier : mkfs(8)
? Tous les systèmes de fichiers comportent au moins trois tables systèmes :
? Superbloc
liste des emplacements libres et occupés
? Table des inodes
informations sur chaque fichier (ls -l) + pointeur vers données
? Les répertoires chainage des fichiers depuis la racine
? Le reste du disque est utilisé pour les blocs de données
Attribut Description a En écriture, ajout seulement d Pas sauvegardé par la commande dump i Ne peut être modifié, détruit ou renommé (root only) s Lors de la destruction, les blocs sont remplis de zéros
S Les écritures sont effectuées immédiatement
? Montage = placement du contenu d'un disque dans l'arbre
? Commande : mount(8)
? Exemple : mount -t vfat /dev/fd0 /mnt/floppy
Place le contenu (répertoires et fichiers) de la disquette (/dev/fd0) sous le répertoire /mnt/floppy. Le système de fichier à utiliser est vfat (dos, très courant).
matériel, bios, chargeur, noyau, init et utilisateur
? Lorsque un ordinateur démarre, en premier lieu, le BIOS prend le contrôle de la machine : il vérifie l'intégrité de la machine, recense les périphériques et en teste certains.
? Une fois cette phase terminée, il faut démarrer le système d'exploitation. Pour cela, le BIOS va examiner (dans un ordre défini dans sa configuration (boot sequence)) les périphériques disponibles pour tenter de trouver un système d'exploitation. Celui-ci peut être stocké sur une disquette, disque dur, cdrom, réseau,
? Dans le cas le plus courant, le système d'exploitation se
trouve sur une partition du disque dur.
? Le bios va donc lire les 512 premiers octets du périphérique d'amorçage, les stocker en RAM puis l'exécuter. Ces 512 premiers octets s'appellent le Master Boot Record (MBR).
? Suivant l'installation, deux cas sont possibles : LILO est installé dans le MBR ou alors il est installé sur le 1er secteur (secteur de boot) de la partition Linux.
? Dans le premier cas, c'est LILO qui sera directement exécuté, sinon le MBR contiendra un programme qui ira charger en mémoire les 512 premiers secteurs (secteur de boot) de la partition active et qui les exécutera ensuite. Si la partition Linux est active, ce programme chargera donc LILO.
? Ensuite, si LILO est bien chargé, il affiche un prompt. En appuyant sur 'Tab', il affiche la liste de tous les noyaux qu'il peut booter. Si l'on appuie sur Entrée, il chargera le noyau par défaut sinon on peut lui entrer le nom du noyau a booter.
? Étant donné que Lilo a une taille extrêmement réduite, il lui est impossible d'accéder aux systèmes de fichiers via les pilotes de périphérique. C'est pourquoi LILO stocke dans le fichier /boot/map la position physique du ou des noyaux sur le disque dur afin d'accéder directement à ceux-ci secteur par secteur.
? Lorsqu’on charge le noyau, LILO affiche
«Loading Linux »
? Le noyau Linux (/boot/vmlinuz-???) est auto-extractible et est constitué d'une entête contenant le code nécessaire au décompactage et du noyau compressé.
? Durant la décompression en RAM, l'écran affiche «Uncompressing Linux».
? Le message «OK, booting the kernel» est ensuite affiché et la main est passée au noyau. Une longue liste de messages défile ensuite détaillant l'initialisation du noyau ainsi que la découverte et la configuration des périphériques.
? A ce stade, le noyau libère l'espace occupé par le code destiné à la détection et la configuration de périphérique. Le message «Freeing unused kernel memory : ..k freed» est alors affiché.
? La configuration d'init se trouve dans /etc/inittab. Ce fichier varie énormément d'une distribution à l'autre mais globalement, les actions effectuées sont à peu près les mêmes.
Sur une distribution compatible RedHat, il existe 7 runlevels :
0 - halt
1 - mode mono-utilisateur (dépannage)
2 - mode multi-utilisateurs sans les montages NFS
3 - mode multi-utilisateurs (texte)
4 - non utilisé
5 - mode multi-utilisateurs avec lancement de X11 (graphique)
6 - reboot
? A chaque runlevel correspond un répertoire /etc/rc.d/rcX.d ou X est le numéro du runlevel en question. Ces répertoires contiennent des liens symboliques de la forme
<lettre><nombre><nom>
? Ces liens pointent vers des scripts contenus dans /etc/init.d/ qui permettent de lancer ou d'arrêter des services.
? La lettre peut être S (start) ou K (kill) et le nombre varie entre 00 et 99. La lettre indique si le service doit être démarré ou arrêté et le nombre détermine l'ordre des actions.
? Exemple : /etc/rc0.d/K20ssh -> /etc/init.d/ssh
Lors de l'arrêt, lorsque toutes les actions <20 sont faites, init appelle :
/etc/init.d/ssh stop
? Lorsque toutes les initialisations sont faites, il faut permettre à l'utilisateur de se connecter. Ceci est configuré dans /etc/inittab :
1:2345:respawn:/sbin/mingetty tty1
? Chaque ligne indique les programmes qui doivent être lancés sur chacune des consoles virtuelles. Le rôle du programme mingetty est d'afficher une invite (d'après /etc/issue) : Debian GNU/Linux 3.1 papagos tty0
login :
? Lorsque l'utilisateur termine sa connexion, init relancera un nouveau processus mingetty sur la console virtuelle correspondante
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
? Fichier /etc/passwd est la base de données sur les utilisateurs. ? Exemple de ligne :
mquinson:DcoJmNQ:1003:1003:Martin Quinson,,,:/home/mquinson:/bin/bash
Suite de champs séparés par des ':'
? login de l'utilisateur
? mot de passe crypté. Il peut être remplacé par x et déporté dans /etc/shadow pour le cacher (seul root peut lire) et améliorer la sécurité.
? uid : numéro d'utilisateur utilisé dans les inodes, entre autres. l'uid du super-utilisateur est 0
? gid : numéro de groupe principal.
? commentaire : en général nom et prénom
? répertoire personnel
? commande de connexion : shell à lancer lors de la connexion
? Fichier /etc/group est la base de données sur les groupes nomme les groupes et défini les autres groupes de l'utilisateur
? Exemple de ligne : audio:DcoJmNQ:29:plateau,mquinson
Suite de champs séparés par des ':'
? Nom du groupe
? Mot de passe crypté : demandé aux utilisateurs n'étant pas dans le groupe voulant s'y connecter avec newgrp(1) ou sg(1)
? Liste des utilisateurs du groupe (connexion sans mot de passe) ? /etc/passwd et /etc/group sont lisibles par tous les utilisateurs ) attaque des mots de passe en force brute sur autre machine ) les mots de passe placés dans /etc/shadow (lisible que par root)
mquinson:$1$wf1guEva$6hednbGEedlNqCuqKVwQN1:12663:0:99999:7:::
? login
? mot de passe crypté
? date dernière modification de mot de passe (jours depuis 1/1/70)
? jours avant avertissement de fin de validité du mdp
? jours entre avertissement et désactivation
? date de désactivation
? champs réservés
La commande passwd :
? Rôle pour l'utilisateur : créer ou modifier son mot de passe ? Rôles pour l'administrateur : modifier le mot de passe d'un utilisateur passwd nom_utilisateur supprimer le mot de passe passwd -d nom_utilisateur verrouiller le compte d'un utilisateur passwd -l nom_utilisateur déverrouiller le compte d'un utilisateur passwd -u nom_utilisateur
Autres commandes de gestion des utilisateurs et groupes :
useradd, usermod, userdel ; groupadd, groupmod, groupdel ; finger ; passwd ; chfn, chsh ; su, sudo, sg, newgrp ; id, groups
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
? Changer les droits d'un fichier
chmod [-R] mode_octal fichier chmod [-R] [ugoa][+-=][rwxXstugo] fichier
? Changer le propriétaire d'un fichier chown [-R] proprietaire fichier
? Changer le groupe d'un fichier
chgrp [-R] groupe fichier
? Changer les attributs d'un fichier (ext2/ext3) chattr [-R] [+-attributs] fichier
? Visualiser les attributs
lsattr fichier
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
? Rappel : un processus se compose de 2 grandes parties
? un programme en cours d'exécution
? un environnement (variables, ) fournit par l'OS
? PID : numéro de processus
? PPID : PID du père, du processus l'ayant lancé
? UID : numéro d'utilisateur
? GID : numéro de groupe
? temps CPU utilisé et priorité
? répertoire courant
? table des fichiers ouverts
ps(1) : affiche des informations sur les processus en cours. Principales options :
u Affiche le nom du propriétaire a Affiche les processus des autres utilisateurs x Affiche les processus sans terminaux e Affiche les informations sur tous les processus
f Affiche des informations complémentaires
-u utilisateur Affiche les processus de cet utilisateur top(1) : affichage interactif d'informations similaires lsof(8) : liste les fichiers ouverts pour chaque processus kill(1) : envoie un signal à un ou plusieurs processus
kill -signal PID Les signaux les plus courants sont :
HUP (1) demande au démon de relire ses fichiers de configuration
KILL (9) tue un processus
TERM (15) demande à un démon de se terminer
kill -KILL -1 : façon rapide et dangereuse de se délogger killall(1) : envoie un signal à tous les processus de ce nom
killall netscape
Les programmes sont exécutés par le processeur à tour de rôle. Le partage n'est pas équitable, mais tient compte des priorités de chacun.
Valeur numérique de chaque processus : son nice (sa « gentillesse »).
0 : normal ; 20 : priorité minimale ; -20 : priorité maximale.
Processus critiques à -10 (X, noyau). Les autres doivent être au dessus.
nice(1) : lance un programme à une autre priorité nice [-n valeur] [commande [arguments ]]
Valeur = incrément du nice du père. Seul root peut utiliser valeur négative. renice(1) : modifie la valeur après le lancement
renice priorité [[-p] pid ] [[-g] pgrp ] [[-u] user ]
?Gestion des utilisateurs
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
Fichier /etc/fstab : liste des systèmes de fichier à monter automatiquement.
Chaque ligne de ce fichier correspond à un montage.
Les différents champs d’une ligne sont :
Périphérique Point de montage Type Options Dump fsck
/dev/hda5 / ext3 defaults,errors=remount-ro 0 1
/dev/fd0 /floppy vfat defaults,user,noauto,showexec,umask=022 0 0 /dev/sda /mnt/usb auto noauto,users,sync,codepage=850 0 0 sysfs /sys sysfs defaults 0 0 /dev/cdrom /mnt/cdrom iso9660 defaults,ro,user,noexec,noauto 0 0 :/e3/mquinson /mnt/nfs/mquinson nfs noauto,user,nosuid,rw,soft,nolock,nosuid,noroot 0 0
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
? Nommage des interfaces :
eth0 : première carte ethernet, eth1 : deuxième lo : boucle locale; ppp0 : modem ; irlan0 : infrarouge
? Pour savoir si les pilotes nécessaires sont chargés : ifconfig eth0
Si message « Périphérique non trouvé », il faut alors charger le pilote manuellement.
Obtenir la liste : ls /lib/modules/$(uname -r)/net
Charger le module : modprobe pilote
ifconfig(8) : affiche (et modifie) la configuration réseau actuelle
/sbin/ifconfig
/sbin/ifconfig eth0 192.168.0.3 netmask 255.255.255.0 route(8) : affiche (et modifie) la table de routage
/sbin/route -n
Table de routage IP du noyau
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth1
/sbin/route add default gw 192.168.0.1
Le fichier /etc/sysconfig/network contient les variables :
NETWORKING : initialisée à "yes" pour valider l'utilisation du réseau FORWARD_IPV4 : initialisée à "no" pour empêcher le transfert automatique des paquets
HOSTNAME : contient le nom pleinement qualifié (avec le domaine) de la machine
GATEWAY : adresse IP de la passerelle
DOMAINNAME : le domaine de la machine
Ce fichier est utilisé dans les scripts d'initialisation pour positionner les variables d'environnement.
Pour chaque interface, un script /etc/network-scripts/ifcfg-nomInterface Il contient les variables suivantes :
DEVICE : nom du périphérique
ONBOOT : initialisée à "yes" pour valider l'interface au démarrage
BROADCAST : contient l'adresse IP de diffusion
NETWORK : contient l'adresse IP du réseau
NETMASK : contient le masque du réseau
IPADDR : contient l'adresse IP de l'interface
BOOTPROTO : peut prendre la valeur STATIC ou DHCP (pour une configuration en tant que client DHCP)
Initialisation et prise en compte des changements :
/etc/init.d/network restart
Pour chaque interface, un morceau de /etc/network/interfaces
auto lo | |
iface lo inet loopback | iface eth2 inet static |
iface eth0 inet dhcp | address 129.88.103.44 |
iface eth1 inet dhcp | netmask 255.255.0.0 |
wireless_essid IMAG-visiteurs | network 129.88.0.0 |
wireless_ssid IMAG-visiteurs | broadcast 129.88.103.255 |
wireless_key s:devinez | gateway 129.88.103.1 |
Initialisation :
/etc/init.d/network restart
Prise en compte des changements :
ifdown interface ; ifup interface
à la slackware (et BSD)
/etc/rc.d/rc.inet1 qui utilise
résolution de noms
Contenu de :
search
nameserver 192.168.0.1
Ce contenu peut soit être indiqué manuellement soit fixé automatiquement par dhcp
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
Deux types de tâches automatiques :
? retardées (delayed) ? répétitives
at(1) : programme une exécution retardée
at 10am Jul 31 ; at 1am tomorrow ; at now ; at 4pm
(ouvre un éditeur interactif)
atq, atrm : liste les exécutions prévues, en annule une
crontab(1) : programme une tâche répétitive
Une table par utilisateur (édition: crontab -e) dans /var/spool/cron
Le démon crond se charge d'appliquer ces configurations.
PATH=/usr/bin:/bin:/home/mquinson/SCRIPTS
# Minutes Heures Jours du mois Mois Jours de la semaine Commande
2 0,4,8,12,16,20 * * * p=`pidof sauvegarde`; [ -n "$p" ] || sauvegarde
49 10 * * 1 linux-counter-machine-update -m
# Le caractère * permet d'indiquer le plus grand intervalle possible.
Certaines distributions comportent les répertoires :
/etc/cron.hourly /etc/cron.daily /etc/cron.monthly /etc/crontab est alors configuré pour exécuter les scripts se trouvant dans ces répertoires respectivement toutes les heures, tous les jours et tous les mois.
?Gestion des utilisateurs
?Gestion des fichiers
?Gestion des processus
?Configuration des montages
?Configuration du réseau
?Automatisation de tâches
?Sauvegarde
cpio(1) : copie de fichiers
Exemple 1 : sauvegarde sur disquette
cpio -o > /dev/fd0
/etc/passwd
/etc/group
Ctrl-D
Exemples :
tar cfz /etc tar xfj .bz2
Possibilité d'archives incrémentales
dump(8) et restore(8) : sauvegarde de partitions ext2/ext3 (possibilité de sauvegardes complètes ou incrémentales)
dump possède essentiellement 2 paramètres : u mémorise la sauvegarde dans /etc/dumpdates après succès le niveau de sauvegarde (0 à 9):
0 copie complète
N copie les changements depuis la dernière de niveau inférieur
Exemple :
dump 0uf /dev/rft0 /home restore –x /home/dupond/ .login
? Notions sur Unix
? Noyau et modules
? Fichiers et systèmes de fichiers
? Disques (formater, partitionner, créer un FS, monter)
? Démarrage de Linux
matériel, bios, chargeur, noyau, init, services et utilisateur
? Administration système
? Gestion des utilisateurs, fichiers et processus
? Configuration des montages disques et du réseau
? Automatisation de tâches
? Sauvegarde
? Linux est un UNIX complet et moderne
Solution viable dans un contexte professionnel
? Ce n'est pas la seule solution
Windows, mais aussi Solaris, AIX, QNX,
Finalement, le meilleur système d'exploitation, c'est celui que l'on connaît le mieux
Des questions?