
Я работаю над проектом, для которого требуются два Raspberry Pi для обмена данными.
Я решил, что мне будет удобнее всего использовать базу данных MySQL, так как у меня был небольшой опыт в этом. Я установил Apache, MariaDB и все необходимые инструменты для базы данных MySQL; создал копию SD-карты; и я использую одни и те же инструменты и программы на обоих Raspberry Pi, что означает, что на обеих машинах Raspberry PI я могу получить доступ к отдельным базам данных MySQL с помощью http://localhost/phpmyadmin
.
Теперь я хочу, чтобы на моем основном Raspberry Pi была база данных, http://localhost/phpmyadmin
и я хочу получить доступ к этой базе данных на моем вторичном Pi. Поскольку я знаю IP-адрес моего основного Raspberry Pi, вторичный Raspberry Pi должен иметь возможность получить доступ к этой базе данных, подключившись к PHPMyAdmin из браузера следующим образом:
http://192.168.61.170/phpmyadmin
(192.168.61.170 — это IP моего основного Raspberry PI, к которому я хочу получить доступ на моем вторичном PI-компьютере). Однако я получаю ошибку «Сайт не может быть доступен».
Немного почитав, я понял, что мне, возможно, нужно изменить bind_address
конфигурацию MySQL. Я сделал это на своем основном Raspberry PI и изменил ее на 0.0.0.0
.
Я подтвердил это командой:
sudo netstat -tlnpu | grep mysql
введите описание изображения здесь
Однако я все еще не могу попасть на страницу PHPMyAdmin, когда захожу на мой вторичный Raspberry Pi с IP-адресом. Я также где-то читал ветку, в которой упоминается какая-то проблема с брандмауэром, блокирующим порт 3306.
Я выполнил эту команду:
firewall-cmd --get-active-zones
И похоже, что у меня даже не установлен брандмауэр, потому что в выводе написано:
firewall-cmd: command not found
Так что в моем случае проблем с брандмауэром быть не должно.
Может ли кто-нибудь посоветовать мне другие методы отладки/решения этой проблемы, чтобы иметь возможность подключиться к MySQL на моем вторичном Pi?
Имейте в виду, что оба устройства Raspberry PI подключены к одному и тому же WiFi.
Вторичный Raspberry PI:
решение1
Хочу отметить, что здесь нет ничего специфического для Raspberry Pi. У вас просто есть два компьютера, на одном из которых размещен сервер базы данных, к которому другой хочет подключиться. Следующее полностью относится к MySQL, а также к его клонам, т. е. Percona, MariaDB (тот, который вы, вероятно, используете).
Шаги для решения:
I. Проверьте, доступен ли он по TCP/IP:
2nd-RPi$ telnet 192.168.61.170 3306
(насколько я понимаю, это адрес компьютера, на котором размещена база данных). Успешное подключение означает, что служба MySQL прослушивает, брандмауэр вообще ничего не блокирует.
Если не удаётся подключиться, проверьте на 1-м RPi:
- если он прослушивает,
ss -lnpt
(илиnetstat -lnpt
) должен отображать mysqld прослушивает порт TCP3306
по адресу0.0.0.0
или::
или*
или локальный внешний адрес, к которому вы подключаетесь, например192.168.61.170
.
LISTEN 0 70 *:3306 *:* users:(("mysqld",pid=505,fd=32))
- если брандмауэр разрешает соединение. Это довольно длинная тема в целом, я часто рекомендую выпустить
iptables-save
и прочитать весь ее вывод, это полная конфигурация брандмауэра. Я считаю, что конфигурация брандмауэра не является основной темой для этого ответа, поэтому если это проблема, лучше изучить другие вопросы — эта тема очень хорошо освещена.
II. Теперь у вас должен быть пользователь MySQL, которому разрешен доступ с других хостов.
В MySQL пользователи имеют не только имя и пароль; у них также есть хост, с которого разрешено подключение. Когда вы добавляете пользователя, например, с помощью GRANT
команды, вы также настраиваете это:
`GRANT ALL PRIVILEGES ON `mydatabase`.* TO 'username'@'hostname' IDENTIFIED BY 'password';
Имя хоста может быть знаком процента %
, который является подстановочным знаком в MySQL, т.е. он должен разрешать соединение с «любого хоста».
Чтобы проверить, может ли ваш пользователь подключаться с других хостов, подключитесь к MySQL с того места, где он работает, и проверьте таблицу mysql.user
:
SELECT `Host`, `User`, `Password` FROM `mysql`.`user`;
(это обратные кавычки, в данном случае они не являются строго необходимыми, но если имя таблицы, поля или базы данных содержит специальные символы или конфликтует с некоторыми ключевыми словами, они понадобятся, поэтому их использование — хорошая привычка)
Он отобразит всех ваших пользователей. Пароли необратимо перемешаны, это нормально. Если нет записи пользователя, которому разрешен доступ с другого хоста, вы можете создать ее, вы можете создать ее с помощью команды, которую я показал выше (используйте %
вместо имени хоста).
Дополнительную и расширенную документацию можно найти в справочном руководстве MySQL, разделКонтроль доступа и управление учетными записями.
решение2
Размещаю это как ответ, так как пока не могу комментировать. Я предполагаю, что вы используете домашнюю сеть и можете позволить себе временно отключить свои Raspberry.
No route to host
означает, что ваш Raspberry не может найти другой. Я вижу, что это происходит чаще всего, когда A) целевой хост недоступен/не подключен или B) коммутатор или маршрутизатор блокирует трафик. Это может быть функцией безопасности вашего WIFI, которая не позволяет разным рабочим станциям связываться друг с другом. Если вы подключаете свои рабочие станции через Ethernet, та же защита может быть не настроена.
Быстрый и очень грязный способ проверить, блокирует ли ваш WIFI соединение:
- Попробовать пинговать с одного raspberry на другой и наоборот
- Чтобы попытаться подключить оба Raspberry через Ethernet, установите два статических IP-адреса в одном диапазоне для Raspberry и попробуйте выполнить ping, а затем попробуйте использовать Telnet (обратите внимание, что это только для тестирования, так как вы не сможете использовать WIFI одновременно).
Если что-то из этого работает, проблема, вероятно, в вашем WIFI. Если нет, вы можете попробовать использовать tcpdump, чтобы увидеть, покидают ли пакеты ваш клиентский Raspberry и/или достигают вашего BDD-сервера:
Базовый пример команды tcpdump в вашем случае — это tcpdump -i <connected_interface> host <other_raspberry_ip>
, с connected_interface
именем вашего сетевого интерфейса (запустите ifconfig
или , ip a
чтобы увидеть ваши интерфейсы). Вы можете запустить эту команду на обоих raspberry, затем использовать ping или telnet и посмотреть на их вывод. Вы должны увидеть, что пакеты появляются на обоих raspberry.
Если брандмауэр что-то блокирует, это должно быть видно в /var/log/messages.
решение3
Я могу подтвердить, что это как-то связано с настройками сети. Я подключился к другой сети, и она, кажется, работает нормально!
Сеть, которую я обычно использую, не допускает соединения между двумя отдельными устройствами. Пинг друг друга приводит к ошибке Destination host unreachable.
Полагаю, мне нужно будет зайти в настройки маршрутизатора и что-то там изменить?