Bagaimana cara memindahkan file swap memori virtual ke drive atau partisi yang berbeda?

33

catatan: Ini adalah pertanyaan yang saya tanyakan pada SuperUser beberapa waktu yang lalu. Saya memposting ulang di sini karena saya pikir itu milik di sini.

Secara default, Mac OS X menyimpan file swap di /private/var/vm/. Saya ingin menempatkan file swap di lokasi yang berbeda. Bagaimana itu bisa dilakukan?

e.James
sumber
Pertimbangan tambahan /private/var/vm/sleepimagedalam Super User: Haruskah saya menghubungkan dir / private / var / vm saya ke volume lain di OS X Lion? (2011-09-20) - ada jawaban yang merekomendasikan untuk tidak menggunakan volume terpisah yang sama untuk file swap eksternal dan sleepimage.
Graham Perrin
dynamicpagerwrapper ( sumber: dynamic_pager_wrapper ) - pembungkus kinerja untuk / sbin / dynamic_pager pada OSX
Graham Perrin

Jawaban:

23

catatan: disalin dari SuperUser:

Untuk versi OSX yang lebih lama, lihat utas ini di forums.macosxhints.com.

Kredit diberikan kepada dblu untuk menjelaskan penggunaan plutil, ZILjr untuk memperkenalkan wait4pathperintah, dan ekl untuk menyederhanakan semuanya dengan menghilangkan kebutuhan untuk skrip shell perantara.

Solusi lengkap:

1. Buka Terminal dan buat salinan cadangan dari dynamic_pager.plist default Apple:

$ cd /System/Library/LaunchDaemons
$ sudo cp com.apple.dynamic_pager.plist{,_bak}

2. Konversi plist dari biner ke XML biasa:

$ sudo plutil -convert xml1 com.apple.dynamic_pager.plist

3. Buka plist yang dikonversi dengan editor teks pilihan Anda. (Saya menggunakan pico, lihat jawaban dblu untuk contoh menggunakan vim):

$ sudo pico -w com.apple.dynamic_pager.plist

Seharusnya terlihat sebagai berikut:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs$
<plist version="1.0">
<dict>
    <key>EnableTransactions</key>
    <true/>
    <key>HopefullyExitsLast</key>
    <true/>
    <key>Label</key>
    <string>com.apple.dynamic_pager</string>
    <key>OnDemand</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/dynamic_pager</string>
        <string>-F</string>
        <string>/private/var/vm/swapfile</string>
    </array>
</dict>
</plist>

4. Ubah array ProgramArguments (baris 13 hingga 18) untuk menggunakan wait4pathperintah shell sebelum meluncurkan dynamic_pager. Lihat catatan # 1 untuk perincian tentang mengapa ini perlu. Dalam contoh berikut, partisi saya dipanggil Swap, dan saya memilih untuk meletakkan swapfiles di direktori tersembunyi di partisi itu, dipanggil .vm pastikan direktori yang Anda tentukan benar-benar ada . XML seharusnya terlihat sebagai berikut:

<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>/bin/wait4path /Volumes/Swap/ &amp;&amp;
/sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
</array>

5. Simpan plist, dan kembali ke terminal prompt. Menggunakan pico, perintahnya adalah:

<ctrl+o> to save the file
<enter>  to accept the same filename (com.apple.dynamic_pager.plist)
<ctrl+x> to exit

6. Konversi plist yang diubah kembali ke biner:

$ sudo plutil -convert binary1 com.apple.dynamic_pager.plist

7. Nyalakan kembali Mac Anda. Jika Anda mengalami masalah, beralih ke mode startup verbose dengan menahan Command-v segera setelah bunyi startup berbunyi. Ini akan memungkinkan Anda melihat semua pesan startup yang muncul selama startup. Jika Anda mengalami masalah yang bahkan lebih buruk (yaitu Anda tidak pernah melihat layar masuk), tahan Command-s sebagai gantinya. Ini akan mem-boot komputer dalam mode pengguna-tunggal (tanpa UI grafis, hanya prompt perintah) dan memungkinkan Anda untuk mengembalikan salinan cadangan com.apple.dynamic_pager.plist yang Anda buat pada langkah 1.

8. Setelah komputer melakukan boot, nyalakan Terminal dan verifikasi bahwa file swap sebenarnya telah dipindahkan:

$ cd /Volumes/Swap/.vm
$ ls -l

Anda harus melihat sesuatu seperti ini:

-rw-------  1 someUser  staff  67108864 18 Sep 12:02 swapfile0

9. Hapus swapfiles lama:

$ cd /private/var/vm
$ sudo rm swapfile*

10. Keuntungan!

Catatan 1

Memodifikasi argumen menjadi dynamic_pager di plist tanpa menggunakan wait4pathtidak selalu berhasil, dan ketika gagal, ia melakukannya dengan cara yang sangat hening. Masalahnya berasal dari kenyataan bahwa dynamic_pager diluncurkan sangat awal dalam proses startup. Jika partisi swap Anda belum dipasang ketika dynamic_pager pertama kali dimuat (menurut pengalaman saya, ini terjadi 99% dari waktu), maka sistem akan memalsukan jalannya. Ini akan membuat tautan simbolik di direktori / Volume Anda yang memiliki nama yang sama dengan partisi swap Anda, tetapi menunjuk kembali ke lokasi swapfile default (/ private / var / vm). Kemudian, ketika partisi swap Anda yang sebenarnya mount, itu akan diberi nama Swap 1(atau YourDriveName 1). Anda dapat melihat masalahnya dengan membuka Terminal dan daftar isi direktori / Volume Anda:

$ cd /Volumes
$ ls -l

Anda akan melihat sesuatu seperti ini:

drwxrwxrwx  11 yourUser  staff   442 16 Sep 12:13 Swap -> private/var/vm
drwxrwxrwx  14 yourUser  staff     5 16 Sep 12:13 Swap 1 
lrwxr-xr-x   1 root      admin     1 17 Sep 12:01 System -> /

Perhatikan bahwa kegagalan ini bisa sangat sulit dikenali. Jika Anda memeriksa swapfiles seperti yang saya tunjukkan di langkah 12, Anda masih akan melihatnya ! Tautan simbolis akan membuatnya seolah-olah swapfile Anda telah dipindahkan, meskipun mereka sebenarnya disimpan di lokasi default.

Catatan 2

Saya awalnya tidak bisa mendapatkan ini berfungsi di Snow Leopard karena com.apple.dynamic_pager.plist disimpan dalam format biner. Saya membuat salinan file asli dan membukanya dengan Editor Daftar Properti Apple (tersedia dengan Xcode) untuk membuat perubahan, tetapi proses ini menambahkan beberapa atribut tambahan ke file plist yang menyebabkan sistem mengabaikannya dan hanya menggunakan default . Seperti dblu tunjukkan, menggunakan plutiluntuk mengonversi file ke XML berfungsi seperti pesona.

Catatan 3

Anda dapat memeriksa aplikasi Konsol untuk melihat pesan apa saja yang dynamic_pager_init bergema ke layar. Jika Anda melihat baris berikut berulang-ulang, ada masalah dengan pengaturan. Saya mengalami pesan-pesan ini karena saya lupa membuat direktori '.vm' yang saya tentukan di dynamic_pager_init.

com.apple.launchd[1]  (com.apple.dynamic_pager[176]) Exited with exit code: 1
com.apple.launchd[1]  (com.apple.dynamic_pager) Throttling respawn: Will start in 10 seconds

Ketika semuanya berfungsi dengan baik, Anda mungkin melihat pesan di atas hanya beberapa kali, dan kemudian tidak ada lagi pesan "Throttling respawn". Ini berarti bahwa sistem memang harus menunggu untuk memuat partisi, tetapi pada akhirnya berhasil.

Kecualikan jalur dari Time Machine

Di OS X 10.7 dan yang lebih baru Anda dapat melakukan ini dengan tmutil . Contoh:

sudo tmutil addexclusion -p /Volumes/Swap/.vm

Untuk contoh itu, untuk meninjau hasilnya:

tmutil isexcluded /Volumes/Swap && tmutil isexcluded /Volumes/Swap/.vm

Jika volume yang digunakan untuk swap tidak perlu diindeks

Gunakan mdutil . Contoh, untuk mematikan kemudian menghapus toko:

sudo mdutil -i off /Volumes/Swap && sudo mdutil -E /Volumes/Swap

e.James
sumber
Lain kali tautkan pertanyaan / jawabannya, ada tombol "tautan" di sebelah setiap jawaban. ;)
Martin Marconcini
2
Ada tautan ke pertanyaan SuperUser di bagian paling atas dari pertanyaan ini. Saya tidak menautkan langsung ke jawaban "the" pada SuperUser karena telah dibangun dari beberapa jawaban lain. Namun, saya menambahkan tautan ke setiap jawaban parsial (menggunakan tombol "tautan" praktis) pada paragraf kedua dari jawaban ini. Berapa banyak tautan yang Anda inginkan? ;)
e.James
2
Saya suka itu ada di sini ... Saya referensi setiap saat ..
alex grey
Ini gagal untuk saya di bawah 10.10.3 - sepertinya tidak menggunakan daftar.
aramis
2
Di bawah El Capitan, berusaha menghapus pertukaran tidak diizinkan oleh Perlindungan Integritas Sistem yang baru. /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: Operasi tidak diizinkan saat Perlindungan Integritas Sistem dijalankan - Booting ke partisi pemulihan, lalu pilih Konfigurasi Keamanan dari menu Utilities. Anda dapat menghapus centang Terapkan Perlindungan Integritas Sistem, klik Terapkan Konfigurasi, dan mulai ulang.
Meetai.com
4

Saya tidak dapat membuat solusi boot sistem permanen, karena 10.10 tidak lagi menggunakan /etc/.rc saat boot, dan metode com.apple.dynamic_pager.plist telah gagal .... namun ...

sudo mkdir /Volumes/Swap/s
sudo chmod 755 /Volumes/Swap/s
sudo sysctl vm.swapfileprefix=/Volumes/Swap/s

tidak mengubah awalan yang disimpan seperti yang dilaporkan oleh

sysctl vm

selama durasi sesi, dan ia bertahan hidup kembali.

ini bisa dibungkus sebagai perintah unix ke dalam file teks:

$/bin/sh
sysctl vm.swapfileprefix=/Volumes/Swap/s

dan jalankan saat login.

aramis
sumber
-1

Solusi sederhana:

http://www.macupdate.com/app/mac/10771/swap-relocator

SwapRelocator 1.1.2 bekerja sangat baik di Maverick!

Gunakan (misalnya) Tinker Tool System untuk membiarkan volume terpasang sebelum masuk, yang memecahkan satu-satunya masalah yang saya temui.

(Terima kasih Filippo, saya akhirnya dapat memindahkan swap dari volume boot mirror ke volume cache bergaris (semua SSD))

BKE
sumber