Puis-je mettre / tmp et / var / log dans un ramdisk sur OS X?

20

Pour les systèmes Linux non critiques, je déplace souvent des choses comme / tmp et / var / log vers tmpfs pour économiser sur certaines écritures sur disque. Je fais cela depuis un an environ et si jamais j'ai besoin des journaux lors des redémarrages, je commente simplement une ligne dans / etc / fstab, puis je commence le débogage.

Dans tous les cas, je voudrais faire la même chose sur OS X. J'ai vu des articles sur la création d'un disque virtuel pour OS X, mais je cherche une solution plus permanente qui fonctionne à chaque démarrage. Je veux toujours que / tmp et / var / log soient montés sur un disque virtuel, avec la possibilité de désactiver cela avec un peu d'édition en ligne de commande dans vi si je le dois.

kbyrd
la source
Cela me semble être une optimisation prématurée. Êtes-vous vraiment confronté à de nombreuses situations où vous êtes lié aux E / S du disque, vous devez donc enregistrer les écritures sur le disque chaque fois que vous le pouvez?
Spiff
J'admets ouvertement que ce n'est probablement pas une énorme optimisation. Je l'ai fait à l'origine sur un système Linux où je démarrais à partir d'une clé USB bon marché et essayais d'éviter d'écrire autant que possible tout en fournissant l'espace de journalisation et tmp que de nombreux processus souhaitent. L'idée est restée et j'ai senti ce que j'abandonnais (je ne peux pas voir les journaux pour tracer un problème que j'ai remarqué APRÈS qu'il se soit produit à moins que je puisse reproduire) valait ce bricolage. Pour un système "non bricoleur", je ne ferais pas ça. Mon ordinateur portable OS X tombe dans la catégorie bricoleur.
2010 à 14h26
6
Un autre justificatif ^ D ^ D ^ D ... euh ... rationalisation: mon macbook a un SSD et si je peux empêcher les écritures aléatoires pour des choses qui ne m'intéressent pas beaucoup, tout le système est mieux. Et ça?
kbyrd

Réponses:

6

Voici un script pour créer des disques virtuels sur OS X. Désolé, il ne répond pas à votre question. Vous pouvez l'utiliser pour créer quelque chose qui s'exécute au démarrage, puis monte / tmp et / var / log.

#!/bin/bash  
ramfs_size_mb=1024  
mount_point=~/volatile  

ramfs_size_sectors=$((${ramfs_size_mb}*1024*1024/512))  
ramdisk_dev=`hdid -nomount ram://${ramfs_size_sectors}`  
newfs_hfs -v 'Volatile' ${ramdisk_dev}  
mkdir -p ${mount_point}  
mount -o noatime -t hfs ${ramdisk_dev} ${mount_point}  

echo "remove with:"  
echo "umount ${mount_point}"  
echo "diskutil eject ${ramdisk_dev}"  

De @salvatore http://pastie.textmate.org/pastes/1417478/text?key=igcxuzqqvlmlbavxooj2uw

xer0x
la source
Merci beaucoup, ce script est très utile pour créer des disques RAM sur OS X
hanxue
6

EDIT: Je vais juste accepter ma propre réponse, car elle a résolu une partie du problème pour moi. Si quelqu'un publie quelque chose de plus comme --bind sous Linux, j'accepterai cette réponse.

Afin d'encourager plus de réponses, je vais commencer à répondre à ma propre question avec ce que j'ai découvert.

L'étape 1 consiste à obtenir un disque virtuel monté au démarrage à chaque fois. Pour ce faire, je crée un script bash puis une entrée launchd pour appeler le script bash au démarrage.

Écrivez un script bash comme ceci:

RD=ramdisk
if [ ! -e "/Volumes/$RD" ];  then
    diskutil erasevolume HFS+ "$RD" `hdiutil attach -nomount`
fi

mkdir -p /Volumes/$RD/private/tmp
mkdir -p /Volumes/$RD/private/var/log
mkdir -p /Volumes/$RD/private/var/tmp

Ensuite, faites-le appeler au démarrage en l'ajoutant à launchd en créant un fichier appelé /Library/LaunchDaemons/com.my.ramdisk.plist avec le contenu suivant:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.my.ramdisk</string>
    <key>ProgramArguments</key>
    <array>
            <string>/usr/local/sbin/ramdisk.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Où je suis bloqué est un moyen de créer un lien symbolique ou de monter des répertoires dans le ramdisk dans / tmp, / var / log et / var / tmp. Ces trois répertoires sont tous liés par des liens symboliques sur mon système vers / private / tmp, / private / var / log et / private / var / tmp. Lorsque j'ai changé les liens symboliques pour pointer vers / Volumes / ramdisk / ..., le système ne démarre pas. Je pense que c'est parce qu'au démarrage, quelque chose veut / tmp et / var / log AVANT que le script my com.my.ramdisk monte le ramdisk. J'ai besoin d'un moyen de monter le ramdisk juste après le montage de root, avant toute autre chose.

Remarque Si vous montez / var / log (noyau, démon et autres journaux critiques de l'espace utilisateur) dans un espace temporaire, vous perdrez son contenu au prochain redémarrage. Cela pourrait nuire à votre capacité de diagnostic.

kbyrd
la source
Il y a de fortes chances que vous ne puissiez pas faire cela, et même si vous le pouvez, cela ne vaudra absolument pas le temps passé. Toute la documentation publique sur le cycle de démarrage est disponible ici si vous êtes vraiment déterminé à essayer: bit.ly/d1kAPd
Hasaan Chop
@NSD: Merci pour le lien. Mec, je veux vraiment un montage contraignant.
kbyrd
Vous pourriez probablement rediriger la sortie de l'enregistreur sans écrire une extension de noyau, mais je n'ai jamais essayé.
Hasaan Chop
2
Je me rends compte que c'est un vieux problème, et je n'arrive pas à poster une bonne réponse, mais il revient en bonne place dans les recherches. Pour répondre à la question, vous souhaitez utiliser hdik -drivekey system-image=yes -nomount ram://262144pour créer un disque RAM de 128 Mo, puis newfs_hfsle formater, puis utiliser mount -o union,nobrowse,noatimepour monter le volume /tmp. De cette façon, les fichiers existants dans /tmpsont intacts, mais les nouveaux fichiers vont sur votre disque RAM.
Haravikk
1
Mon seul autre commentaire est que vous devriez vous méfier de faire cela; alors que tmpfsle swap sera utilisé si nécessaire, un disque RAM ne le fera pas, donc vous perdrez un morceau de RAM active, cela signifie que vous voudrez le garder petit, mais certaines tâches /tmppeuvent nécessiter plus de mémoire et échoueront, alors soyez faites attention à ce que vous exécutez au cas où il aurait besoin de plus d'espace que vous n'en allouez.
Haravikk