Улучшаем работу Google Chrome в MacOS перемещаем кэш на ramdisk
В статье описано как можно перенести кэш Google Chrome на ramdisk.
К сожалению данный метод:
увеличивает количество запускаемых программ в Dock (2 значка), что не удобно и можно случайно закрыть
увеличивает электропотребление - сессия скрипта, которая запущена имеет значение энерговоздейтсвия от 100 до 114. Что уже критично для мобильного использования.
С целью исправления этих недостатков было реализовано создание ramdisk и монтирование его к папки c кэшем Google Chrome ("~/Library/Caches/Google/Chrome/Default/Cache").
Для начала необходимо создать скрипт на создание ramdisk и монтирование к нему папки с кэшем Google Chrome. На моем примере: ~/create_ramdisk.sh
#!/bin/bash
CURRENT_USER=$(logname)
echo "Текущий пользователь: $CURRENT_USER"
# Размер RAM-диска в секторах (1 ГБ = 2097152 секторов) #819200 = 400Mb
SIZE=819200 # 8192 = DEBUG HFS+
# Имя RAM-диска
DISK_NAME="MyRAMDisk_$CURRENT_USER"
# Папка для первоначального монтирования
MOUNT_POINT="/Volumes/$DISK_NAME"
# Новая папка для монтирования
#Пример папки для кэша Google Chrome: "/Users/username/Library/Caches/Google/Chrome/Default/Cache"
NEW_MOUNT_POINT="$HOME/Library/Caches/Google/Chrome/Default/Cache"
# Проверяем, не смонтирован ли диск в целевой папке
if mount | grep -q "$NEW_MOUNT_POINT"; then
echo "Ошибка: $NEW_MOUNT_POINT уже создан и смонтирован!"
exit 1
fi
# Проверяем и создаем целевую папку
if [ -d "$NEW_MOUNT_POINT" ]; then
if [ "$(ls -A "$NEW_MOUNT_POINT")" ]; then
echo "Обнаружено содержимое в: $NEW_MOUNT_POINT - существует и не пуста."
# Удаляем все содержимое включая скрытые файлы (кроме . и ..)
rm -rf ${NEW_MOUNT_POINT:?}/* ${NEW_MOUNT_POINT:?}/.* 2>/dev/null
# Дополнительная проверка, что папка пуста
if [ "$(ls -A "$NEW_MOUNT_POINT" 2>/dev/null)" ]; then
echo "Ошибка: Не удалось полностью очистить директорию"
exit 1
fi
echo "Директория успешно очищена"
fi
else
mkdir -p "$NEW_MOUNT_POINT" || {
echo "Не удалось создать директорию $NEW_MOUNT_POINT"
exit 1
}
fi
# Создание RAM-диска
echo "Создание RAM-диска..."
DISK_DEVICE=$(hdiutil attach -nomount ram://$SIZE)
# Проверка, что устройство создано
if [ -z "$DISK_DEVICE" ]; then
echo "Ошибка: не удалось создать RAM-диск."
exit 1
fi
echo "RAM-диск создан на устройстве: $DISK_DEVICE"
# Очистка и монтирование RAM-диска в HFS+ в Volumes # Или в APFS
echo "Очистка и монтирование RAM-диска в HFS+..."
diskutil erasevolume HFS+ $DISK_NAME $DISK_DEVICE
# Проверка, что RAM-диск смонтирован
if ! mount | grep -q "$MOUNT_POINT"; then
echo "Ошибка: не удалось смонтировать RAM-диск."
exit 1
fi
echo "RAM-диск успешно смонтирован в $MOUNT_POINT."
# Создаем нужные дирректории на диске
mkdir $MOUNT_POINT/GoogleCache
# Отмонтирование RAM-диска
echo "Отмонтирование RAM-диска..."
umount $DISK_DEVICE
# Проверка, что RAM-диск отмонтирован
if mount | grep -q "$MOUNT_POINT"; then
echo "Ошибка: не удалось отмонтировать RAM-диск."
exit 1
fi
echo "RAM-диск успешно отмонтирован."
# Монтирование RAM-диска в новую папку
echo "Монтирование RAM-диска в $NEW_MOUNT_POINT..."
sudo mount -t hfs -o noowners,noatime,nobrowse $DISK_DEVICE $NEW_MOUNT_POINT
# Проверка, что RAM-диск смонтирован в новую папку
if ! mount | grep -q "$NEW_MOUNT_POINT"; then
echo "Ошибка: не удалось смонтировать RAM-диск в $NEW_MOUNT_POINT."
exit 1
fi
echo "RAM-диск успешно смонтирован в $NEW_MOUNT_POINT."
## задаем целевые гранты на диск (drwx------ # В числовом формате: 700 )
echo "задаем целевые гранты на $NEW_MOUNT_POINT (drwx------ # В числовом формате: 700 )"
# chmod -R 700 $NEW_MOUNT_POINT
echo "Готово!"
скрипт делает несколько проверок:
создан ли уже диск (н-р, если несколько раз его запустить)
пустая ли папка ~/Library/Caches/Google/Chrome/Default/Cache
если нет, то проводится очистка
создает и монтирует ramdisk
делаем файл исполнительным (через терминал):
chmod +x ~/create_ramdisk.sh
затем делаем plist для launchctl. В моем примере это файл: ~/Library/LaunchAgents/com.user.ramdisk.plist
<?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.user.ramdisk</string>
<key>RunAtLoad</key>
<true/> <!-- Запуск при входе в систему -->
<key>KeepAlive</key>
<false/> <!-- Не перезапускать при завершении -->
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-c</string>
<string>/Users/denbond/create_ramdisk.sh </string>
</array>
</dict>
</plist>
после чего задание загружаем в launchctl agent (через терминал):
launchctl load ~/Library/LaunchAgents/com.user.ramdisk.plist
Перегружаемся.
Проверяем через терминал, что ramdisk создан и примонтирован
mount |grep Cache
вывод должен быть приблизительно следующим образом:
/dev/disk4 on /Users/username/Library/Caches/Google/Chrome/Default/Cache (hfs, local, noowners, noatime, nobrowse)
Итог:
создан ramdisk на 400Гб
диск примонтирован к папке кэша Google Chrome
нет повышенного энергопотребления в данной реализации
по (субьективным) ощущениям Google Chrome работает шустрее
Замечание:
для создания ramdisk используется файловая система HFS+. Причина: при использовании diskutil erasevolume HFS+ не меняется созданный раздел в /dev. Если нужно использование ФС APFS (например: чтобы создать несколько томов на ramdrive) , то скрипт нужно дорабатывать с учетом этого момента (при: diskutil erasevolume APFS создается новый диск в /dev/).
у меня по каким-то причинам задание LaunchAgents запускается под root, если у вас будут проблемы и запуск будет идти под username, то в sudoers нужно добавить исключение на монтирование томов под username.