Tôi có thể đặt / tmp và / var / log trong ramdisk trên OS X không?


20

Đối với các hệ thống Linux không quan trọng, tôi thường di chuyển những thứ như / tmp và / var / log sang tmpfs để lưu vào một số ghi đĩa. Tôi đã làm điều này trong một năm hoặc lâu hơn và nếu tôi cần nhật ký trong các lần khởi động lại, tôi chỉ cần nhận xét một dòng trong / etc / fstab và sau đó bắt đầu gỡ lỗi.

Trong mọi trường hợp, tôi muốn làm điều tương tự trên OS X. Tôi đã thấy các bài đăng về việc tạo một ramdisk cho OS X, nhưng tôi đang tìm một giải pháp lâu dài hơn, hoạt động trên mọi khởi động. Tôi luôn muốn / tmp và / var / log được gắn trong một ramdisk, với khả năng tắt nó với một chút chỉnh sửa dòng lệnh trong vi nếu tôi phải.


Điều này nghe có vẻ như tối ưu hóa sớm đối với tôi. Bạn có thực sự gặp phải nhiều tình huống trong đó bạn bị ràng buộc I / O vì vậy bạn cần lưu đĩa ghi bất cứ khi nào bạn có thể?
Spiff

Tôi sẽ công khai thừa nhận đây không phải là một sự tối ưu hóa lớn. Ban đầu tôi đã làm nó trên một hệ thống Linux, nơi tôi đang khởi động từ một thanh USB giá rẻ và đang cố gắng tránh ghi vào nó nhiều nhất có thể trong khi vẫn cung cấp không gian nhật ký và tmp mà nhiều quá trình muốn. Ý tưởng bị mắc kẹt và tôi cảm thấy những gì tôi đang từ bỏ (không thể xem nhật ký để theo dõi một vấn đề mà tôi nhận thấy SAU nó xảy ra trừ khi tôi có thể tái tạo) rất đáng để mày mò. Đối với một hệ thống "không tinker", tôi sẽ không làm điều này. Máy tính xách tay OS X của tôi rơi vào danh mục tinker.
kbyrd

6
Một lý do khác ^ D ^ D ^ D ... err ... hợp lý hóa: Macbook của tôi có ổ SSD và nếu tôi có thể ngăn việc ghi ngẫu nhiên cho những thứ mà tôi không quan tâm nhiều, toàn bộ hệ thống sẽ tốt hơn. Thế còn cái đó?
kbyrd

Câu trả lời:


6

Đây là một kịch bản để tạo ramdisks trên OS X. Xin lỗi, nó không trả lời câu hỏi của bạn. Bạn có thể sử dụng điều này để xây dựng một cái gì đó chạy khi khởi động và sau đó gắn kết / tmp và / 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}"  

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


Cảm ơn bạn rất nhiều, tập lệnh này rất hữu ích để tạo đĩa ram trên OS X
hanxue

6

EDIT: Tôi sẽ chấp nhận câu trả lời của riêng tôi, vì nó đã giải quyết một phần của vấn đề cho tôi. Nếu ai đó đăng một cái gì đó giống như - tìm kiếm trong Linux, tôi sẽ chấp nhận câu trả lời đó.

Trong nỗ lực thúc đẩy nhiều câu trả lời hơn, tôi sẽ bắt đầu trả lời câu hỏi của riêng mình với những gì tôi đã tìm ra.

Bước 1 là để ramdisk được gắn khi khởi động mỗi lần. Để làm điều này, tôi tạo một tập lệnh bash và sau đó là một mục launchd để gọi tập lệnh bash khi khởi động.

Viết một kịch bản bash như thế này:

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

Sau đó, hãy gọi nó khi khởi động bằng cách thêm nó vào launchd bằng cách tạo một tệp có tên /L Library / LaDDaemons / com.my.ramdisk.plist với nội dung sau:

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

Nơi tôi bị mắc kẹt là một cách để liên kết hoặc gắn kết các thư mục bên trong ramdisk tại / tmp, / var / log và / var / tmp. Cả ba thư mục này đều được liên kết tượng trưng trên hệ thống của tôi thành / private / tmp, / private / var / log và / private / var / tmp. Khi tôi thay đổi các liên kết tượng trưng để trỏ vào / Tập / ramdisk / ..., hệ thống sẽ không khởi động. Tôi hy vọng điều này là bởi vì tại thời điểm khởi động, một cái gì đó muốn / tmp và / var / log TRƯỚC KHI tập lệnh com.my.ramdisk của tôi gắn ramdisk. Tôi cần một cách để gắn ramdisk ngay sau khi root được gắn, trước khi mọi thứ khác chạy.

Lưu ý Nếu bạn gắn / var / log (kernel, daemon và các nhật ký không gian người dùng quan trọng khác) trong không gian tạm thời, bạn sẽ mất nội dung của nó trong lần khởi động lại tiếp theo. Điều này có thể ức chế khả năng chẩn đoán của bạn.


Điều lạ là bạn sẽ không thể làm được điều này, và thậm chí nếu bạn có thể, nó hoàn toàn không xứng đáng với thời gian bỏ ra. Tất cả các tài liệu công khai về chu kỳ khởi động đều có sẵn ở đây nếu bạn thực sự muốn thử: bit.ly/d1kAPd
Hasaan Chop

@NSD: Cảm ơn đã liên kết. Man, tôi thực sự muốn - gắn kết.
kbyrd

Bạn có thể có thể chuyển hướng đầu ra của logger mà không cần viết phần mở rộng kernel, nhưng tôi chưa bao giờ thực sự thử.
Hasaan Chop

2
Tôi nhận ra đây là một vấn đề cũ và dường như tôi không thể đăng một câu trả lời thích hợp, nhưng nó xuất hiện nổi bật trong các tìm kiếm. Để trả lời câu hỏi, bạn muốn sử dụng hdik -drivekey system-image=yes -nomount ram://262144để tạo đĩa ram 128mb, sau đó newfs_hfsđịnh dạng nó, sau đó sử dụng mount -o union,nobrowse,noatimeđể gắn kết âm lượng /tmp. Bằng cách này, các tệp hiện có trong /tmpkhông bị ảnh hưởng, nhưng các tệp mới đi vào đĩa ram của bạn.
Harastak

1
Nhận xét khác của tôi là bạn nên cảnh giác khi làm điều này; trong khi đó tmpfssẽ sử dụng trao đổi nếu cần thiết, một đĩa RAM sẽ không có, vì vậy bạn sẽ mất một đoạn RAM hoạt động, điều này có nghĩa là bạn sẽ muốn giữ nó nhỏ, tuy nhiên một số tác vụ /tmpcó thể cần nhiều bộ nhớ hơn và sẽ thất bại, vì vậy cẩn thận những gì bạn chạy trong trường hợp nó cần nhiều không gian hơn bạn phân bổ.
Harastak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.