it-swarm.asia

Memindahkan swapfiles ke partisi khusus di Snow Leopard

Saya telah dapat memindahkan swapfile memori virtual Apple ke partisi khusus pada hard drive saya sampai sekarang. Teknik yang saya gunakan dijelaskan dalam tas di forums.macosxhints.com.

Namun, dengan pratinjau pengembang Snow Leopard, metode ini tidak lagi berfungsi. Adakah yang tahu bagaimana hal itu bisa dilakukan dengan OS baru?

Pembaruan: Saya telah menandai jawaban dbl diterima meskipun itu tidak bekerja karena dia memberikan instruksi yang sangat baik, detail dan karena sarannya untuk menggunakan plutil akhirnya menunjuk saya ke arah yang benar. Solusi yang lengkap dan berfungsi diposting di sini dalam pertanyaan karena saya tidak memiliki reputasi yang cukup untuk mengedit jawaban yang diterima.

Pembaruan # 2: Mengubah prosedur untuk menggambarkan teknik ekl , yang sangat menyederhanakan semuanya dengan menghilangkan kebutuhan perantara. Script shell:

Solusi lengkap:

1. Buka Terminal dan buat salinan cadangan 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 papan 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. Memodifikasi array ProgramArguments (baris 13 hingga 18) untuk menggunakan perintah wait4path Shell (seperti yang disarankan oleh ZILjr ) sebelum meluncurkan dynamic_pager. Lihat catatan # 1 untuk perincian tentang mengapa ini perlu. Dalam contoh berikut, partisi saya disebut 'Tukar', dan saya memilih untuk meletakkan swapfiles di direktori tersembunyi di partisi itu, yang disebut '.vm' pastikan direktori yang Anda tentukan sebenarnya 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. Mulai ulang Mac Anda. Jika Anda mengalami masalah, beralih ke mode startup verbose dengan menekan 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 (mis. Anda tidak pernah melihat layar masuk), tahan Command-s sebagai gantinya. Ini akan mem-boot komputer dalam mode pengguna-tunggal (tanpa antarmuka grafis, hanya perintah Prompt) 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. Untung!

Catatan 1

Memodifikasi argumen menjadi dynamic_pager pada plist tanpa menggunakan wait4path tidak 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 simbolis 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 pada 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 yang dblu tunjukkan, menggunakan plutil untuk 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.

31
e.James

NOTE: Lihat (juga) jawaban yang diperbaiki/diperbaiki dalam pertanyaan itu sendiri.


Solusi berikut berhasil untuk saya:

Buka terminal dan backup com.Apple.dynamic_pager.plist yang akan Anda ubah dalam sedetik:

$ cd /System/Library/LaunchDaemons[.____.[$ Sudo cp com.Apple.dynamic_pager.plist {, _ bak}

konversi binary plist ke xml:

$ Sudo plutil -convert xml1 com.Apple.dynamic_pager.plist

dan buka dengan editor teks favorit Anda

$ Sudo vim com.Apple.dynamic_pager.plist

akan terlihat seperti ini:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
 3 <plist version="1.0">
 4 <dict>
 5     <key>EnableTransactions</key>
 6     <true/>
 7     <key>HopefullyExitsLast</key>
 8     <true/>
 9     <key>Label</key>
10     <string>com.Apple.dynamic_pager</string>
11     <key>OnDemand</key>
12     <false/>
13     <key>ProgramArguments</key>
14     <array>
15         <string>/sbin/dynamic_pager</string>
16         <string>-F</string>
17         <string>/private/var/vm/swapfile</string>
18     </array>
19 </dict>
20 </plist>

Pada baris 17, ubah/private/var/vm/swapfile (mis./Volume/partisi2/swapfile), simpan dan tutup editor Anda (": x" akan melakukan keduanya dalam vim).

ubah file plist kembali menjadi biner:

$ Sudo plutil -convert binary1 com.Apple.dynamic_pager.plist

Setelah me-reboot Mac Anda, Anda harus menemukan swapfiles di direktori yang Anda tentukan.

Jika Anda mengalami masalah, Anda dapat memulihkan cadangan yang Anda buat di langkah pertama dengan:

$ cd /System/Library/LaunchDaemons[.____.[$ Sudo cp com.Apple.dynamic_pager.plist {_bak,}
10
dblu

hanya sebuah pertanyaan: mengapa tidak hanya mengedit file .plist menambahkan wait4path, alih-alih menggunakan dynamic_pager_init perantara?

sesuatu seperti ini:

EDIT: seperti yang dijelaskan dalam komentar oleh e.James dan komentar saya berikut, blok XML yang langsung berikut tidak baik, baik karena ada kesalahan (hilang &&) dan karena hanya argumen pertama array ProgramArguments diuraikan sebagai program untuk menjalankan!

tetapi .. (gulir ke bawah)

 ...
13     <key>ProgramArguments</key>
14     <array>
15         <string>/bin/wait4path</string>
16         <string>/Volumes/Swap/</string>
17         <string>/sbin/dynamic_pager</string>
18         <string>-F</string>
19         <string>/Volumes/Swap/.vm/swapfile</string>
20     </array>
 ...

akhir blok xml yang salah


blok XML ini seharusnya berfungsi sebagai gantinya:

   ...
    13     <key>ProgramArguments</key>
    14     <array>
    15         <string>/bin/bash</string>
    16         <string>-c</string>
    17         <string>/bin/wait4path /Volumes/Swap/ &amp;&amp; /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile</string>
    18     </array>
     ...

harap diingat bahwa saya masih tidak punya cukup waktu untuk mencoba pengaturan ini dengan aman, tetapi saya mencoba menjalankan berbagai perintah Shell lainnya yang diluncurkan dengan cara yang sama, dan semuanya akan berfungsi seperti yang diharapkan

Bagaimana itu bekerja:

base: mengeksekusi wait4path /path && command berarti command dijalankan hanya jika wait4path berakhir dan keluar tanpa kesalahan, dan ini terjadi hanya ketika /path adalah jalur yang tersedia, jadi kita dapat dengan aman memberitahu dynamic_pager untuk menggunakan volume itu untuk swapfile

1) seperti yang tertulis dalam halaman manual launchd.plist, tombol-tombol Program dan ProgramArguments dipetakan ke panggilan execvp, yang berarti bahwa segala sesuatu kecuali string pertama dalam array diperlakukan sebagai argumen untuk string pertama dalam array , program yang akan dijalankan;

2) seperti yang ditulis dalam manpage bash, ada opsi bash -c <string> untuk menjalankan string yang dilewatkan sebagai perintah

1 + 2 = 3) apa yang terjadi dengan menggunakan baris perintah ini dalam launchd plist ??

/bin/bash -c "wait4path /Volumes/Swap/ && /sbin/dynamic_pager -F /Volumes/Swap/.vm/swapfile"

/bin/bash adalah program yang akan dijalankan, -c adalah argumen pertama dan string yang dikutip ganda adalah argumen kedua

Saya kira itu harus bekerja persis seperti solusi Anda, tanpa skrip perantara: launchd akan memulai layanan, yang akan menunggu jalur yang diberikan dan kemudian meluncurkan dynamic_pager ..

Harap dicatat bahwa:
* string yang ingin Anda jalankan harus dikutip dua kali lipat jika Anda menjalankan bash -c di Terminal, tapi itu tidak ganda dikutip dalam file plist! (saya kira karena sudah dinyatakan sebagai string dengan tag yang tepat)
* dua & dalam string harus diubah menjadi &amp; dalam file plist

PS: seperti biasa, lanjutkan dengan risiko Anda sendiri, saya tidak bertanggung jawab atas masalah yang mungkin Anda alami dengan menggunakan pengaturan ini!

terima kasih telah berbagi pekerjaan Anda dengan kami

3
ekl

Saya telah mengadopsi gagasan ini dan mengambilnya sedikit lebih jauh dengan menyikapi strategi pertumbuhan dan reklamasi.

Detail di http://www.crypticide.com/dropsafe/article/3848 ; Saya akan memposting tautan ke halaman proyek GoogleCode "dynamicpagerwrapper", tetapi blog memberi tahu saya bahwa saya tidak memiliki poin reputasi yang cukup ...

3
Alec Muffett

Saya tahu sudah lama sejak artikel ini ditulis tetapi saya pikir saya akan menambahkan item kecil saya sendiri di sini untuk mereka yang ingin melakukan ini juga ...

Saya telah menggunakan trik di atas untuk memindahkan file swap saya ke drive internal lain (drive boot saya adalah SSD dengan chip MLC, sehingga memindahkan vm off dapat menghemat harapan hidup). Lagi pula, setelah membuat volume baru saya memiliki volume Swap di Finder yang saya tidak akan pernah digunakan dalam Finder itu sendiri, jadi saya memutuskan untuk membuat volume tidak terlihat oleh Finder. Anda memerlukan Toolkit Pengembang Apple diinstal. Kemudian ketik:

/Developer/Tools/SetFile -a V /Volumes/Swap/

... dan ganti/Volume/Swap dengan apa pun yang Anda sebut volume Anda. Mulai ulang Finder dan presto, tidak ada lagi Swap volume di Finder!

2
Michael Spurlock

Anda dapat menggunakan wait4path untuk menunggu volume mount; jika tidak, launchd akan memulai ulang skrip dynamic_pager_init Anda berulang-ulang sampai berhasil ...

1
ZILjr

Ini kemungkinan besar jawaban yang tidak diinginkan (karena saya tidak bisa berkomentar setelah Diago), tetapi mengapa Anda benar-benar bersikeras ini akan memberikan keuntungan kinerja kecil? Saya telah melalui diskusi di forum Apple dan kesimpulannya adalah ini bukan ide yang bagus sama sekali. Dan saya sangat menentang meninggalkannya. Bisakah Anda menemukan data yang membuktikan bahwa setidaknya untuk diri Anda sendiri, atau hanya "perasaan"?

Dari setiap kali saya menggunakan swap bahkan di linux, kembali 10 tahun yang lalu, dan saat ini di ubuntu, saya tidak pernah bisa melihat peningkatan kinerja. Alasan saya ingin itu adalah untuk mencegah masalah dengan ruang kosong di OSX dan, di linux, untuk bisa hibernasi. Itu semua swap bagi saya.

Tetapi saya tidak pernah benar-benar melakukan penelitian yang lebih dalam baik pada saya sendiri atau dalam jalinan.

1
cregox

Ini bukan jawaban, tapi mungkin suplemen lanjutan yang sangat berguna. Apple menyediakan editor plist gratis di sini PlistEdit Pro . Ini memungkinkan Anda untuk mengedit file-file ini dengan aman. Sepertinya Anda bisa mengubah argumen dengan nilai /private/var/vm/swapfile menjadi sesuatu seperti /Volume/OtherDrive/vm/myswapfilename untuk memindahkan file swap ke tempat lain ...

Lagi Saya belum menguji ini ...

1
Jesse

Mungkin kita bisa menggunakan Xupport untuk melakukan pekerjaan kotor itu untuk kita :) http://www.applicorn.com/

Pengoptimal Memori Virtual:

Mengubah lokasi swap file Dalam Mac OS X informasi memori virtual disimpan dalam apa yang disebut "Swapfiles". Karena file swap adalah file sistem yang paling interaktif, masuk akal untuk meletakkannya di partisi yang terpisah. Disarankan untuk menyimpan file swap pada partisi pertama hard disk internal tercepat Anda. Ukuran partisi minimum yang disarankan harus sekitar 3 atau 4 kali lager daripada ukuran memori bawaan fisik (mis. Memori fisik 1 GB = partisi swap 4 GB). Rekomendasi dan instruksi untuk kinerja sistem yang optimal:

1. Partisi ulang hard disk Anda dengan volume swap sebagai partisi PERTAMA (menggunakan DVD Instalasi Mac OS X). PERINGATAN: REPITISITASI A HARD DISK AKAN MENINGKATKAN SEMUA DATA YANG ADA!

2. Kembalikan data sistem Anda atau instal sistem baru pada partisi sistem.

3. Boot dari partisi sistem.

4. Jika Anda ingin volume swap Anda tidak terlihat oleh Finder: • Buka Xupport dan pilih "Pengaturan" • Aktifkan "Tampilkan file dan folder tersembunyi" dan mulai ulang Finder • Ubah nama volume swap dari "swap" menjadi ".swap" (Titik membuatnya tidak terlihat oleh Finder) • Nonaktifkan "Tampilkan file dan folder tersembunyi" dan restart Finder lagi

5. Pilih partisi swap baru di bawah "Tukar Volume Penyimpanan". Kemudian, tekan tombol "Set" untuk menerapkan pengaturan lokasi file swap baru (Restart diperlukan).

BTW, itu bekerja untuk saya. Snow Leopard 10.6.2 @ Macbook Pro 2.4GHz, Ram 4GB, HD 500GB

1
UooU