ฉันจะย้ายไฟล์สลับหน่วยความจำเสมือนไปยังไดรฟ์หรือพาร์ติชั่นอื่นได้อย่างไร?


33

หมายเหตุ:นี่เป็นคำถามที่ฉันถามใน SuperUser เมื่อไม่นานมานี้ ฉันโพสต์ใหม่ที่นี่เพราะฉันคิดว่ามันเป็นของที่นี่

ตามค่าเริ่มต้น Mac OS X จะเก็บไฟล์สลับ/private/var/vm/ไว้ ฉันต้องการวางไฟล์ swap ในตำแหน่งอื่น จะทำอย่างไร?


การพิจารณาเพิ่มเติม/private/var/vm/sleepimageในผู้ใช้ขั้นสูง: ฉันควรเชื่อมโยง / ส่วนตัว / var / vm dir ของฉันกับโวลุ่มอื่นใน OS X Lion หรือไม่ (2011-09-20) - มีคำตอบที่แนะนำว่าไม่ควรใช้วอลลุ่มแยกเดียวกันสำหรับไฟล์ swap ภายนอกและ sleepimage
Graham Perrin

dynamicpagerwrapper (ที่มา: dynamic_pager_wrapper ) - wrapper ประสิทธิภาพสำหรับ / sbin / dynamic_pager บน OSX
Graham Perrin

คำตอบ:


22

หมายเหตุ:คัดลอกมาจาก SuperUser:

สำหรับ OSX เวอร์ชันเก่าดูที่กระทู้นี้ใน forums.macosxhints.com

เครดิตไปที่dbluสำหรับการอธิบายการใช้งานplutil, ZILjrสำหรับการแนะนำwait4pathคำสั่งและEKLเพื่อลดความซับซ้อนสิ่งทั้งหมดโดยไม่จำเป็นต้องใช้สคริปต์เชลล์กลาง

โซลูชั่นที่สมบูรณ์:

1. เปิด Terminal และสร้างสำเนาสำรองของ dynamic_pager.plist ที่เป็นค่าเริ่มต้นของ Apple:

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

2. แปลง Plist จากไบนารีเป็น XML ธรรมดา:

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

3. เปิด Plist ที่แปลงด้วยตัวแก้ไขข้อความที่คุณเลือก (ฉันใช้picoดูคำตอบของ dblu สำหรับตัวอย่างโดยใช้vim):

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

ควรมีลักษณะดังนี้:

<?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. แก้ไขอาร์เรย์ ProgramArguments (บรรทัดที่ 13 ถึง 18) เพื่อใช้wait4pathคำสั่ง shell ก่อนที่จะเรียกใช้ dynamic_pager ดูหมายเหตุ # 1 สำหรับรายละเอียดเกี่ยวกับสาเหตุที่จำเป็น ในตัวอย่างต่อไปนี้พาร์ทิชันของฉันเรียกว่าSwapและฉันเลือกที่จะใส่ swapfiles ในไดเรกทอรีที่ซ่อนอยู่ในพาร์ติชันที่เรียกว่าจะต้องแน่ใจว่าไดเรกทอรีที่คุณระบุมีอยู่จริง.vm XML ควรมีลักษณะดังนี้:

<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. บันทึก Plist และกลับไปที่หน้าจอพร้อมรับ ใช้picoคำสั่งจะเป็น:

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

6. แปลง Plist ที่แก้ไขแล้วกลับไปเป็นไบนารี:

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

7.รีสตาร์ท Mac ของคุณ หากคุณประสบปัญหาให้เปลี่ยนเป็นโหมดเริ่มต้นอย่างละเอียดโดยกด Command-v ค้างไว้หลังจากเริ่มการทำงาน นี่จะช่วยให้คุณเห็นข้อความเริ่มต้นทั้งหมดที่ปรากฏขึ้นในระหว่างการเริ่มต้น หากคุณพบปัญหาที่เลวร้ายยิ่งกว่า (เช่นคุณไม่เคยเห็นหน้าจอเข้าสู่ระบบ) ให้กด Command-s ค้างไว้แทน สิ่งนี้จะทำการบูตคอมพิวเตอร์ในโหมดผู้ใช้คนเดียว (ไม่มีกราฟิก UI เพียงแค่พร้อมรับคำสั่ง) และให้คุณกู้คืนสำเนาสำรองของ com.apple.dynamic_pager.plist ที่คุณทำไว้ในขั้นตอนที่ 1

8.เมื่อคอมพิวเตอร์บู๊ตแล้วให้เปิด Terminal ขึ้นมาและตรวจสอบว่ามีการย้ายไฟล์ swap จริง:

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

คุณควรเห็นสิ่งนี้:

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

9.ลบ swapfiles เก่า:

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

10.กำไร!

หมายเหตุ 1

การแก้ไขข้อโต้แย้งเป็น dynamic_pager ในการวางแผนโดยไม่ใช้wait4pathไม่ได้ผลเสมอไปและเมื่อมันล้มเหลวมันจะทำอย่างเงียบ ๆ ปัญหาเกิดขึ้นจากการที่ dynamic_pager เปิดตัวเร็วมากในกระบวนการเริ่มต้น หากพาร์ทิชัน swap ของคุณยังไม่ได้เมานท์เมื่อโหลด dynamic_pager เป็นครั้งแรก (จากประสบการณ์ของฉันสิ่งนี้เกิดขึ้น 99% ของเวลา) จากนั้นระบบจะทำการปลอมผ่าน มันจะสร้างลิงก์สัญลักษณ์ในไดเรกทอรี / Volumes ของคุณซึ่งมีชื่อเดียวกันกับพาร์ทิชัน swap ของคุณ แต่จะกลับไปที่ตำแหน่ง swapfile เริ่มต้น (/ private / var / vm) จากนั้นเมื่อ swap พาร์ติชันที่แท้จริงของคุณติดตั้งมันจะได้รับชื่อSwap 1(หรือYourDriveName 1) คุณสามารถเห็นปัญหาได้ด้วยการเปิด Terminal และแสดงรายการเนื้อหาของไดเรกทอรี / Volumes ของคุณ:

$ cd /Volumes
$ ls -l

คุณจะเห็นสิ่งนี้:

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

โปรดทราบว่าความล้มเหลวนี้อาจเป็นจุดที่ยากมาก หากคุณต้องตรวจสอบ swapfiles ตามที่ฉันแสดงในขั้นตอนที่ 12 คุณจะยังคงเห็นพวกเขา ! ลิงก์สัญลักษณ์จะทำให้ดูเหมือนกับว่า swapfiles ของคุณถูกย้ายแล้วแม้ว่าจะถูกเก็บไว้ในตำแหน่งเริ่มต้นจริง ๆ ก็ตาม

โน้ต 2

เดิมทีฉันไม่สามารถทำงานใน Snow Leopard ได้เพราะ com.apple.dynamic_pager.plist ถูกเก็บไว้ในรูปแบบไบนารี ฉันทำสำเนาของไฟล์ต้นฉบับและเปิดด้วยตัวแก้ไขรายการทรัพย์สินของแอปเปิ้ล (พร้อมใช้งานกับ Xcode) เพื่อทำการเปลี่ยนแปลง แต่กระบวนการนี้ได้เพิ่มคุณสมบัติเพิ่มเติมบางอย่างลงในไฟล์ plist ซึ่งทำให้ระบบไม่สนใจและใช้ค่าเริ่มต้น . ดังที่ dblu ชี้ให้เห็นการใช้plutilเพื่อแปลงไฟล์เป็น XML ธรรมดาทำงานได้อย่างมีเสน่ห์

หมายเหตุ 3

คุณสามารถตรวจสอบแอปพลิเคชันคอนโซลเพื่อดูข้อความใด ๆ ที่ dynamic_pager_init echos ไปที่หน้าจอ หากคุณเห็นบรรทัดต่อไปนี้ซ้ำแล้วซ้ำอีกแสดงว่ามีปัญหากับการตั้งค่า ฉันพบข้อความเหล่านี้เพราะฉันลืมสร้างไดเรกทอรี '.vm' ที่ฉันระบุใน 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

เมื่อทุกอย่างทำงานอย่างถูกต้องคุณอาจเห็นข้อความด้านบนสองสามครั้งเท่านั้นและไม่มีข้อความ "Throttling respawn" อีกต่อไป ซึ่งหมายความว่าระบบไม่ต้องรอให้พาร์ติชันโหลด แต่ท้ายที่สุดก็ประสบความสำเร็จ

ยกเว้นเส้นทางจาก Time Machine

ใน OS X 10.7 และต่อมาคุณสามารถทำเช่นนี้กับtmutil ตัวอย่าง:

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

ตัวอย่างเช่นหากต้องการตรวจสอบผลลัพธ์:

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

หากปริมาณที่ใช้สำหรับการแลกเปลี่ยนไม่จำเป็นต้องทำดัชนี

ใช้mdutil ตัวอย่างการปิดแล้วลบร้านค้า:

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


ครั้งต่อไปเพียงเชื่อมโยงคำถาม / คำตอบมีปุ่ม "ลิงก์" ถัดจากคำตอบแต่ละข้อ ;)
Martin Marconcini

2
มีลิงก์ไปยังคำถาม SuperUser ที่ด้านบนสุดของคำถามนี้ ฉันไม่ได้เชื่อมโยงโดยตรงกับคำตอบ "" ใน SuperUser เพราะมันถูกสร้างขึ้นจากส่วนหนึ่งของคำตอบอื่น ๆ อย่างไรก็ตามฉันเพิ่มลิงก์ไปยังแต่ละคำตอบบางส่วน (โดยใช้ปุ่ม "ลิงก์" ที่มีประโยชน์) ในย่อหน้าที่สองของคำตอบนี้ คุณต้องการลิงค์อีกจำนวนเท่าใด ;)
e.James

2
ฉันชอบมันอยู่ที่นี่…ฉันอ้างอิงตลอดเวลา ..
alex grey

สิ่งนี้ล้มเหลวสำหรับฉันภายใต้ 10.10.3 - ดูเหมือนว่าจะไม่ใช้ Plist
มิส

2
ภายใต้ El Capitan การพยายามล้าง swap ไม่ได้รับอนุญาตจาก System Integrity Protection ใหม่ /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist: การดำเนินการไม่ได้รับอนุญาตขณะที่ System Integrity Protection มีส่วนร่วมในการบูตระบบเข้าสู่พาร์ติชั่นการกู้คืนแล้วเลือก Security Configuration จากเมนู Utilities คุณสามารถยกเลิกการเลือก Enforce System Integrity Protection คลิก Apply Configuration และรีสตาร์ท
Meetai.com

4

ฉันไม่สามารถสร้างโซลูชันการบูตระบบแบบถาวรได้ตั้งแต่ 10.10 ไม่ใช้ /etc/.rc ตอนบูตอีกต่อไปและวิธีการ com.apple.dynamic_pager.plist ล้มเหลว .... อย่างไรก็ตาม ...

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

จะเปลี่ยนคำนำหน้าที่จัดเก็บตามที่รายงานโดย

sysctl vm

สำหรับช่วงเวลาของเซสชั่นและมันยังคงมีชีวิตรีบูต

สิ่งนี้สามารถห่อเป็นคำสั่ง unix ลงในไฟล์ข้อความ:

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

และทำงานที่เข้าสู่ระบบ


-1

วิธีแก้ปัญหาง่าย ๆ :

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

SwapRelocator 1.1.2 ใช้งานได้ดีบน Maverick!

ใช้ (ตัวอย่าง) Tinker Tool System เพื่อให้วอลุ่มเมาต์ก่อนลงชื่อเข้าใช้ซึ่งแก้ปัญหาเดียวที่ฉันพบ

(ขอบคุณ Filippo ฉันสามารถย้ายการแลกเปลี่ยนจากปริมาณการบูตที่มิร์เรอร์ไปยังไดรฟ์แคชแบบสไทรพ์ (SSD ทั้งหมด))

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.