Search
Write a publication
Pull to refresh

Улучшаем работу Google Chrome в MacOS перемещаем кэш на ramdisk

Level of difficultyEasy

В статье описано как можно перенести кэш 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)

Итог:

  1. создан ramdisk на 400Гб

  2. диск примонтирован к папке кэша Google Chrome

  3. нет повышенного энергопотребления в данной реализации

  4. по (субьективным) ощущениям Google Chrome работает шустрее

Замечание:

  1. для создания ramdisk используется файловая система HFS+. Причина: при использовании diskutil erasevolume HFS+ не меняется созданный раздел в /dev. Если нужно использование ФС APFS (например: чтобы создать несколько томов на ramdrive) , то скрипт нужно дорабатывать с учетом этого момента (при: diskutil erasevolume APFS создается новый диск в /dev/).

  2. у меня по каким-то причинам задание LaunchAgents запускается под root, если у вас будут проблемы и запуск будет идти под username, то в sudoers нужно добавить исключение на монтирование томов под username.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.