Как стать автором
Поиск
Написать публикацию
Обновить

Улучшаем работу 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)

Итог:

  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.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.