Bisakah saya memasukkan / tmp dan / var / log di ramdisk di OS X?

20

Untuk sistem Linux yang tidak kritis, saya sering memindahkan hal-hal seperti / tmp dan / var / log ke tmpfs untuk menghemat beberapa penulisan disk. Saya telah melakukan ini selama satu tahun atau lebih dan jika saya memerlukan log di reboot, saya hanya berkomentar di baris / etc / fstab dan kemudian mulai debugging.

Bagaimanapun, saya ingin melakukan hal yang sama pada OS X. Saya telah melihat posting tentang cara membuat ramdisk untuk OS X, tapi saya mencari solusi yang lebih permanen yang bekerja pada setiap boot. Saya selalu ingin / tmp dan / var / log dipasang di ramdisk, dengan kemampuan untuk mematikannya dengan sedikit pengeditan baris perintah di vi jika saya harus.

kbyrd
sumber
Ini kedengarannya seperti optimasi dini bagi saya. Apakah Anda benar-benar mengalami banyak situasi di mana Anda disk I / O-terikat sehingga Anda perlu menyimpan disk menulis kapan saja Anda bisa?
Spiff
Saya akan mengakui secara terbuka bahwa ini bukan optimasi yang besar. Saya awalnya melakukannya pada sistem Linux di mana saya melakukan booting dari USB stick murah dan berusaha menghindari menulis sebanyak mungkin sambil tetap menyediakan ruang log dan tmp yang diinginkan banyak proses. Idenya macet dan saya merasakan apa yang saya menyerah (tidak dapat melihat log untuk melacak masalah yang saya perhatikan SETELAH itu terjadi kecuali saya dapat mereproduksi) layak untuk bermain-main. Untuk sistem "non-tinker", saya tidak akan melakukan ini. Laptop OS X saya termasuk dalam kategori menggerumit.
kbyrd
6
Pembenaran lain ^ D ^ D ^ D ... err ... rasionalisasi: Macbook saya memiliki SSD dan jika saya dapat mencegah penulisan acak untuk hal-hal yang tidak terlalu saya pedulikan, keseluruhan sistem lebih baik. Bagaimana tentang itu?
kbyrd

Jawaban:

6

Berikut ini adalah skrip untuk membuat ramdisks pada OS X. Maaf, itu tidak menjawab pertanyaan Anda. Anda bisa menggunakan ini untuk membangun sesuatu yang berjalan saat boot dan kemudian mount / tmp dan / 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}"  

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

xer0x
sumber
Terima kasih banyak, skrip ini sangat berguna untuk membuat ram ram pada OS X
hanxue
6

EDIT: Saya hanya akan menerima jawaban saya sendiri, karena itu memecahkan satu bagian dari masalah bagi saya. Jika seseorang memposting sesuatu yang lebih mirip --bind di Linux, saya akan menerima jawaban itu.

Dalam upaya memacu lebih banyak jawaban, saya akan mulai menjawab pertanyaan saya sendiri dengan apa yang saya temukan.

Langkah 1 adalah memasang ramdisk saat boot setiap kali. Untuk melakukan ini, saya membuat skrip bash dan kemudian entri launchd untuk memanggil skrip bash saat boot.

Tulis skrip bash seperti ini:

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

Kemudian minta dipanggil saat boot dengan menambahkannya ke launchd dengan membuat file bernama /Library/LaunchDaemons/com.my.ramdisk.plist dengan konten berikut:

<?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>

Di mana saya terjebak adalah cara untuk symlink atau me-mount direktori di dalam ramdisk di / tmp, / var / log, dan / var / tmp. Ketiga direktori ini semuanya terhubung pada sistem saya ke / private / tmp, / private / var / log dan / private / var / tmp. Ketika saya mengubah symlink untuk menunjuk ke / Volume / ramdisk / ..., sistem tidak mau boot. Saya berharap ini karena pada saat boot, sesuatu ingin / tmp dan / var / log SEBELUM skrip com.my.ramdisk saya me-mount ramdisk. Saya perlu cara untuk memasang ramdisk setelah root di-mount, sebelum hal lain berjalan.

Catatan Jika Anda me-mount / var / log (kernel, daemon, dan log ruang pengguna kritis lainnya) di ruang sementara, Anda akan kehilangan kontennya di reboot berikutnya. Ini mungkin menghambat kemampuan Anda untuk mendiagnosis.

kbyrd
sumber
Kemungkinannya bagus bahwa Anda tidak akan bisa melakukan ini, dan bahkan jika Anda bisa, itu sama sekali tidak sebanding dengan waktu yang dihabiskan. Semua dokumentasi publik tentang siklus boot tersedia di sini jika Anda benar-benar ingin mencoba: bit.ly/d1kAPd
Hasaan Chop
@NSD: Terima kasih atas tautannya. Man, aku benar-benar ingin - mengikat pemasangan.
kbyrd
Anda mungkin bisa mengarahkan output logger tanpa menulis ekstensi kernel, tetapi saya belum pernah mencobanya.
Hasaan Chop
2
Saya menyadari ini adalah masalah lama, dan sepertinya saya tidak dapat memposting jawaban yang tepat, tetapi muncul dengan jelas dalam pencarian. Untuk menjawab pertanyaan, Anda ingin menggunakan hdik -drivekey system-image=yes -nomount ram://262144untuk membuat ram-disk 128MB, kemudian newfs_hfsmemformatnya, lalu gunakan mount -o union,nobrowse,noatimeuntuk memasang volume lebih /tmp. Dengan cara ini, file yang ada di dalam /tmptidak tersentuh, tetapi file baru masuk ke ram disk Anda.
Haravikk
1
Satu-satunya komentar saya yang lain adalah bahwa Anda harus berhati-hati dalam melakukan ini; sedangkan tmpfsakan menggunakan swap jika perlu, disk RAM tidak akan, jadi Anda akan kehilangan sepotong RAM aktif, ini berarti Anda ingin tetap kecil, namun beberapa tugas di /tmpmungkin memerlukan lebih banyak memori dan akan gagal, jadi hati-hati apa yang Anda jalankan jika perlu lebih banyak ruang daripada yang Anda alokasikan.
Haravikk