Я действительно не понимаю, как работают все эти привилегии в Linux.
Для запуска сервера MySQL mysqld
программа должна записать свои файлы .pid
в каталог /var/run/mysqld/
. Но мы знаем из FHS (Стандарт иерархии файловой системы) , что:
Файлы в этом каталоге должны быть очищены (удалены или усечены соответствующим образом) в начале процесса загрузки.
blockquote>Таким образом,
mysqld
должен создавать каталог/mysqld
в каталоге/var/run/
каждый раз ] MySQL сервер запущен.Владельцем и группой
/var
являетсяroot
, а/var
:drwxr-xr-x 13 root root 4096 may 20 23:41 var.
И мы также знаем из FHS (Стандарт иерархии файловой системы), что:
[ 1129] / var / run должен быть недоступен для записи непривилегированным пользователям (root или пользователям, работающим с демонами); это большая проблема безопасности, если любой пользователь может писать в этот каталог.blockquote>
Таким образом,
mysqld
не может писать в каталог. Действительно, когда я запускаюmysqld
для запуска сервера MySQL, я всегда получаю сообщение об ошибке:user@user-desktop:~$ sudo mysqld --console 130720 23:43:02 [ERROR] Can't start server : Bind on unix socket: Permission denied 130720 23:43:02 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ? 130720 23:43:02 [ERROR] Aborting
Вопрос: как
mysqld
может записывать файлы.pid
в/var/run/mysqld/
, если стандарт запрещает открывать это каталог для записи? Это явное противоречие, не так ли?Мой вопрос: как разрешить
mysqld
создавать и записывать свои файлы в/var/run/mysqld/
, не изменяя разрешения для каталога/var/run
? Пока я вижу единственный путь:user@user-desktop:$ sudo chmod a+w /var
Но это запрещено Стандартом.
/ var / run должен быть недоступен для записи непривилегированным пользователям означает, что учетные записи root и sudo (поскольку это привилегированные пользователи) могут писать в него.
Сценарий запуска для MySQL запускается от имени пользователя root, а затем ему разрешается создавать файл или каталог в /var/run
. И этот файл создается с разрешением, установленным в конфигурации. Это должно быть /etc/my.cnf
, и у него будет что-то вроде этого :
[mysqld]
user = mysql
socket = /var/lib/mysql/mysql.sock
У вас должно быть что-то, связанное с mysql в /etc/init.d
. После установки MySQL Server я получаю this:
Вы уверены, что не установили MySQL Client?
(Версия сервера: 5.7.28-0ubuntu0.18.04.4 (Ubuntu) в WSL2)
Apparmor содержит системные двоичные файлы, управляющие разрешениями для других файлов. Перед первым успешным подключением к серверу mysqld я добавил эту строку в "Разрешить доступ к файлу pid, socket, socket lock", я удалил его после и мог еще подключаюсь второй раз.
~$ sudo nano /etc/apparmor.d/usr.sbin.mysqld
/run/mysqld/*, rwx
~$ sudo service apparmor reload
До этого у меня были другие ошибки ... мне пришлось изменить владельца и права доступа к папке / mysqld-files /, которая была автоматически создана при установке. Затем добавьте эту опцию в конфигурационный файл, для которого по умолчанию установлено значение null, что означает, что сервер отключает операции импорта и экспорта. :
~$ sudo chown <username> /var/lib/mysql-files/ && chmod 750 /var/lib/mysql-files/
~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
secure_file_priv = /var/lib/mysql-files
Также мне пришлось добавить это, потому что ошибка сообщила мне:
explicit_defaults_for_timestamp = ON
В WSL вы этого не сделаете. нужно инициализировать mysql. Происходит при установке (содержимое инициализации в / var / lib / mysql /). Таким образом, мы можем войти в систему напрямую. «ОШИБКА 1698 (28000): доступ запрещен для пользователя 'root' @ 'localhost'», если я не напишу sudo в начале команды входа в систему:
~$ sudo service mysql start
~$ sudo mysql -u root -p
Enter Password: [just ENTER]
Затем, наконец, исправление «Нет каталога, вход в систему с HOME = /»:
~$ sudo service mysql stop
~$ sudo usermod -d /var/lib/mysql/ mysql
пс Всегда делайте копию перед редактированием файла конфигурации и меняйте стандартный порт 3306, и выполните поиск в руководстве .