На PC с Debian поднят NFS. Сделан доступ к директории которая nobody, а вообще-то предназначена для пользователя на малинах. На малине монтирую: Код (Text): mount -t nfs <IP>:/home/public/bot_XXX/home/public_bot_XXX монтируется на малине нормально Код (Text): root@pi01:/home/bot_gray# mount /dev/mmcblk0p2 on / type ext4 (rw,noatime,data=ordered) devtmpfs on /dev type devtmpfs (rw,relatime,size=468148k,nr_inodes=117037,mode=755) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) proc on /proc type proc (rw,relatime) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd) nfsd on /proc/fs/nfsd type nfsd (rw,relatime) tmpfs on /run/user/1003 type tmpfs (rw,nosuid,nodev,relatime,size=94552k,mode=700,uid=1003,gid=1003) tmpfs on /run/user/109 type tmpfs (rw,nosuid,nodev,relatime,size=94552k,mode=700,uid=109,gid=114) 192.168.7.150:/home/public/bot_gray on /home/public_bot_gray type nfs4 (rw,relatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.7.101,local_lock=none,addr=192.168.7.150) и вот: Код (Text): root@pi01:/home# ls -al total 28 drwxr-xr-x 7 root root 4096 Nov 3 12:21 . drwxr-xr-x 22 root root 4096 Mar 3 2017 .. drwxr-xr-x 6 bot_gray bot_gray 4096 Nov 10 10:18 bot_gray drwxrwxrwx 22 www-data www-data 4096 Jun 18 16:38 httpd drwxr-xr-x 12 igor igor 4096 Sep 30 18:09 igor drwxr-xr-x 18 pi pi 4096 Nov 10 09:14 pi drwxrwxrwx 7 nobody nogroup 4096 Nov 10 08:59 public_bot_gray но вот беда: Код (Text): root@pi01:/home/public_bot_gray# ls -al total 31197480 drwxrwxrwx 7 nobody nogroup 4096 Nov 10 08:59 . drwxr-xr-x 7 root root 4096 Nov 3 12:21 .. drwxr-xr-x 2 pi pi 4096 Nov 10 10:30 pi01 drwxr-xr-x 5 pi pi 4096 Nov 3 16:33 pi02 drwxr-xr-x 2 pi pi 4096 Nov 3 16:10 pi03 drwxr-xr-x 2 pi pi 4096 Nov 10 08:59 pi04 drwxr-xr-x 2 pi pi 4096 Nov 10 08:59 pi05 -rw-r--r-- 1 nobody nogroup 31914983424 Nov 5 20:20 rpi.img откуда этот pi ? А у меня каждая из малин должна примонтировать в свою рабочую директорию свою директоию pi01...pi05. Вот никак не выходит. Как вообще убрать этот pi (пользователя)? Что другую сборку raspbian? Или как? Главное монтируются с другим пользователем вложенные директории в то время как на PC они от нужного пользователя. Что за свинство? И главное от рута нельзя сменить пользователя. Я конечно что-то не знаю и не умею, но вот это свинство. Когда примонтировано: Код (Text): drwxrwxrwx 7 nobody nogroup 4096 Nov 10 08:59 public_bot_gray а вложенные в этом примонтированном: Код (Text): drwxr-xr-x 2 pi pi 4096 Nov 10 10:30 pi01 drwxr-xr-x 5 pi pi 4096 Nov 3 16:33 pi02 drwxr-xr-x 2 pi pi 4096 Nov 3 16:10 pi03 drwxr-xr-x 2 pi pi 4096 Nov 10 08:59 pi04 drwxr-xr-x 2 pi pi 4096 Nov 10 08:59 pi05 В то время как на сервере Код (Text): drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 10 13:30 pi01 drwxr-xr-x 5 bot_gray bot_gray 4096 ноя 3 19:33 pi02 drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 3 19:10 pi03 drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 10 11:59 pi04 drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 10 11:59 pi05 мне надо так что бы были для нужного пользователя, потому как изменять содержимое директорий буду на этом PC. И соответсвенно каждая малина должна иметь своё для себя. Заранее Спасибо!
@Igor68, поищите как на NFS4 делается user (uid/gid) mapping. Гугл говорит что надо прописывать соответствия в /etc/idmapd.conf http://www.bog.pp.ru/work/NFS.html#idmap
Непременно посмотрю(хоть уже и наверное не сегодня) но... но взбесило то, что какой-то "pi" заявил право на уже смонтированный рессурс с правами выше root на вложенные директории. И chown от того же root не доступны, а вложенные директории/файлы от pi. Обязательно пересмотрю само монтирование хоть и через /etc/rc.local. Только вот устал уже на сегодня.
Вот пока не выходит. Понимаю так: некий нехороший человек (наверное что бы нубам жизнь облегчить сделал "автозапуск" от pi, потому как он уже вошел в систему в то время как я пока не подключилcя по ssh. И когда я через консоль от уже root монтирую nfs, то примонтированное уже от pi. Замктьте не от Васи, Пети и др. а от pi. И пользователя сменить уже нельзя) А в документации не смог найти как из под root примонтировать именно для какого-то пользователя. Как убить этого самого pi? Выходит подняты иксы и pi уже вошел в них. Ну и соответственно надо сначала выйти из pi типа logout. А потом убить этого pi с его автомонтированием и т.п. Кстати по гуглу всё время натыкаюсь на то что все желают монтировать от пользователя (не root) и везде только такие темы. А как примонтировать именно для кого-то из под root ни слова.
Как определил - монтируется от имени первого пользователя... ну и на ноуте примонтировался аналогично. Надо курить... но всё-таки лелею надежду на пример подобного монтирования (NFS). А курить буду. Жаль только чтобы что-то начать делать надо сделать ещё и многое другое.
а сели создать пользователя типа такого Код (Bash): sudo useradd -o -u 0 -g 0 -s /bin/bash newroot и из под него убить pi?
думаю pi убить и так можно. Проблема в том, что при включении уже загружены иксы от его имени, а вместе с ними и всё остальное. Пока запущены процессы от него убить его не можно (ну это я так думаю). Потому и жертвую одну SD карту с образом с целю нанесения увечий этому pi посредством издевательсва над файлами в директории /etc... ну и с перезапуском для проверки. А вообще цель: 1. поднять NFS на машине с debian и hdd (сделано). Есть некий public в котором директории pi01....p05 (для каждой малины своя) 2. примонтировать NFS public в /home/public с mount --bind для каждой малины свой путь к этому /mount/public/piXX. На всех малинах пользователь TTTT (к примеру) Надо чтобы все нужные директории на каждой малине монтировались от TTTT дабы реализовать RW в то же время на PC с debian надо оперативно изменять соответствующий проект(кодв), предварительно остановив его на соответствующей малине. Вот уткнулся на доступ при монтировании. Одним словом скрипт на каждой малине следит за версией некого кода и если в исходниках находится новая версия, то останавливается выполнение старой, происходит компиляция и запуск обновлённого кода. При этом физическое расположение файлов на PC с debian на hdd с доступом по NFS каждой из малин. Весь механизм ранее уже отработал (где-то на флудилке), а про общий доступ думал "Ладно потом, кода всё соберу..." А вообще звучит так (это не анекдот, а так просто... наверное устал): Возглас в цехе на предприятии: - Эй кому совсем делать нечего? тишина через повторный возглас - Ну мне делать нечего. - Отлично! Я послан к Вам в помощь.
Доброго времени суток! Вот курил, курил... мусор вынес, котов покормил... и вот на стороне сервера для каждой малины индивидуально в файле /etc/exports Код (Text): /mnt/sdXX/bot_gray/pi04 pi01(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi04 pi02(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi04 pi03(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi04 pi04(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi04 pi05(rw,sync,no_root_squash) а на малине запустил скрипт: Код (Text): #!/bin/bash # ##### СТАРТУЕМ ОТ ROOT И ДАЖЕ ИЗ /etc/rc.local ##### # имя/IP хоста предоставляющего NFS(задаётся) _nfshostname="debian1" #собственно наше имя пользователя оно же и группа(задаемтся) _nuser="bot_gray" # получаем имя нашего хоста(оно у нас зарегистрировано на роутере - вместо IP)(автоопределение) _myhost=$(cat /etc/hostname) # получаем UID и GID ползователя str=$(cat /etc/passwd | grep $_nuser | sed "s/:/ /g") _uid=$(echo $str | awk '{print($3)}') _gid=$(echo $str | awk '{print($4)}') # проверяем/создаём локальную точку монтрования if ! [ -d /home/$_nuser/$_myhost ]; then mkdir /home/$_nuser/$_myhost chown -R $_nuser:$_nuser /home/$_nuser/$_myhost fi mount -t nfs -O uid=$_uid,gid=$_gid,iocharset=utf-8 $_nfshostname:/mnt/sdXX/bot_gray/$_myhost /home/bot_gray/$_myhost chown -R $_nuser:$_nuser /home/$_nuser/$_myhost # далее запускаем рабочий скрипт в режиме "&" и (я применял малину №4 - по моей маркировке, а каждая из них именована в DHCP роутера и сам NFS сервер так же) вот результат: Код (Text): drwxr-xr-x 7 bot_gray bot_gray 4096 Nov 12 17:08 . drwxr-xr-x 7 root root 4096 Nov 3 12:34 .. -rw------- 1 bot_gray bot_gray 82 Nov 3 21:31 .bash_history -rw-r--r-- 1 bot_gray bot_gray 220 Nov 3 10:53 .bash_logout -rw-r--r-- 1 bot_gray bot_gray 3512 Nov 3 10:53 .bashrc drwx------ 3 bot_gray bot_gray 4096 Nov 3 12:42 .cache drwx------ 3 bot_gray bot_gray 4096 Nov 3 12:42 .config drwx------ 3 bot_gray bot_gray 4096 Nov 3 12:42 .local -rwxr-xr-- 1 root root 1164 Nov 12 17:31 myroot.sh drwxr-xr-x 3 bot_gray bot_gray 4096 Nov 12 16:52 pi04 -rw-r--r-- 1 bot_gray bot_gray 675 Nov 3 10:53 .profile -rw-r--r-- 1 bot_gray bot_gray 66 Nov 12 17:08 .selected_editor drwx------ 2 bot_gray bot_gray 4096 Nov 3 16:12 .ssh и сама директория Код (Text): root@pi04:/home/bot_gray/pi04# ls -al total 12 drwxr-xr-x 3 bot_gray bot_gray 4096 Nov 12 16:52 . drwxr-xr-x 7 bot_gray bot_gray 4096 Nov 12 17:08 .. drwxr-xr-x 2 bot_gray bot_gray 4096 Nov 12 17:08 123 Код (Text): root@pi04:/home/bot_gray/pi04/123# ls -al total 12 drwxr-xr-x 2 bot_gray bot_gray 4096 Nov 12 17:08 . drwxr-xr-x 3 bot_gray bot_gray 4096 Nov 12 16:52 .. -rw-r--r-- 1 bot_gray bot_gray 14 Nov 12 17:08 test.txt Ну и на самом PC с Debian Код (Text): bot_gray@debian1:/mnt/sdXX/bot_gray$ ls -al итого 31197480 drwxrwxrwx 7 bot_gray bot_gray 4096 ноя 10 11:59 . drwxr-xr-x 5 nobody nogroup 4096 ноя 12 18:52 .. drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 10 13:30 pi01 drwxr-xr-x 5 bot_gray bot_gray 4096 ноя 3 19:33 pi02 drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 3 19:10 pi03 drwxr-xr-x 3 bot_gray bot_gray 4096 ноя 12 19:52 pi04 drwxr-xr-x 2 bot_gray bot_gray 4096 ноя 10 11:59 pi05 -rw-r--r-- 1 nobody nogroup 31914983424 ноя 5 23:20 rpi.img Вот вроде и всё готово. А образ на малине №1 изуродовал. Теперь вроде готово всё для опытов Спасибо за подсказки.
Может я немножко не понял про хостнейм, идентификаторы пользователей и групп, но добывать информацию читая файлы, когда есть другие средства, как-то не кошерно Тот же хостнейм есть в окружении Код (Bash): root@raspberrypi:~# echo $HOSTNAME raspberrypi Или Код (Bash): root@raspberrypi:~# hostname raspberrypi Спойлер: man hostname Код (Text): root@raspberrypi:~# man hostname NAME hostname - show or set the system's host name А идентификаторы просто получить через id Спойлер: man id Код (Text): root@raspberrypi:~# man id NAME id - print real and effective user and group IDs DESCRIPTION Print user and group information for the specified USER, or (when USER omitted) for the current user. -g, --group print only the effective group ID -u, --user print only the effective user ID Посмотрим ид группы и ид пользователя для рута (должны быть нули) Код (Bash): root@raspberrypi:~# id -g 0 root@raspberrypi:~# id -u 0 по идентификатору пользователя не равным нулю в скрипте совсем просто определить что он выполняется не от рута Создадим 3-х пользователей с минимальными настройками Код (Bash): root@raspberrypi:~# useradd pi1 root@raspberrypi:~# useradd pi2 root@raspberrypi:~# useradd pi3 Посмотрим их идентификаторы Код (Bash): root@raspberrypi:~# su pi1 -c 'id -g' 1001 root@raspberrypi:~# su pi1 -c 'id -u' 1001 Теперь всю это фигню сохраним в скрипт /root/test.sh Код (Bash): #!/bin/bash printf "host: %s\n" $(hostname) >/root/test.txt users=(pi1 pi2 pi3) for index in ${!users[*]}; do _uid=$(su ${users[$index]} -c 'id -u') _gid=$(su ${users[$index]} -c 'id -g') printf "user: %s, uid:%s, gid:%s\n" ${users[$index]} $_uid $_gid >>/root/test.txt done Добавим его в /etc/rc.local перезагрузимся и посмотрим что он наделал Код (Bash): root@raspberrypi:~# cat /root/test.txt host: raspberrypi user: pi1, uid:1001, gid:1001 user: pi2, uid:1002, gid:1002 user: pi3, uid:1003, gid:1003
Кошерно!!!!! Спасибо за такое! Я не таков знаток как Вы и применил то, что на глаза попалось. Множество команд и не знаю, а если и знаю то не помню. Ищу их по начальным буквам с табуляцией. Но курю... всё-таки курю. Что касается hostname, то он на удалённой машине и локально его не узнать. Что касается pi01...pi05 то они на каждой машине свой... соответственно для малины с номером 1 будет pi01 и так до пяти. У каждой из них свой IP полученный от роутера. А что касается хоста debian1, то ему и вовсе ничего не надо кроме сервера NFS... ну ещё и как удалённая машина на которой будут редактироваться проекты для опыта. Для каждой малины свой. Каждая малина "почуяв" новую версию кода откомпилирует для себя своими средствами в пространстве NFS, остановит прежний код и запустит вновь скомпилированный. Ну понятное дело, что всё это по неким правилам.
Я как написано в #8 на малине запустил скрипт, в котором _myhost=$(cat /etc/hostname) не подозревая, что хостнейм-то удаленный, поэтому и написал что он есть в окружении. С идентификатором(ами) пользователей, когда они немножко не известны руту, кроме как посмотреть базе, иного выхода нет, но и не обязательно знать где эта база, можно воспользоваться утилитами. Cоздал ещё 3-х пользователей для реалистичности и посмотрел немножко. Код (Bash): root@raspberrypi:~# compgen -u|grep 'pi[0-9]' pi1 pi2 pi3 pi01 pi02 pi03 root@raspberrypi:~# getent passwd|awk -F: '{print $1}'|grep 'pi[0-9]' pi1 pi2 pi3 pi01 pi02 pi03 А для чего на малинах собирать? Других средств для сборки нет? Так-бы собрали пакеты на более мощных ресурсах, а малины через apt (почуяв свеженькое) получили и установили бы их.
так я и не спорю про окружению (если честно то просто не привык по недоумию своему). То что касается сборки на самом хосте, то он не навечно PC с Debian. Лелею надежду что это будет сам роутер (на флудилке была тема про dir620) будет выступать в роли NFS сервера. Хотя про полную схему пока не скажу. Что касается мощности для сборки, то не планирую на малинах собирать таких монстров как OpenCV и им подобных, да и дебиан с собой уже тащит GCC. Пространстао для сборки NFS. А для эксперимента (на флудилке про OpenCV + Arduino + ...) готового и свежего по apt нет и не будет, потому как эксперимент мой. А я только вот как-то начал готовится к нему. И малины закупал когда-то для него.
Я люблю Linux, он мне по душе, но я не говорю, что знаю его. Так же мне по душе GCC и так же не знаю достаточно. Пользуюсь Си, но так же не знаю многого. (Л.Н.Толстой пользовался Русским языком, но не думаю что он знал всё) Спасибо огромное за замечания, благодаря которым исправил скрипт!!! Осталось отточить NFS сервер.
И я не спорю и не доказываю ничего, вы создали топик, меня он заинтересовал, высказал своё мнение о решении, некоторые вещи по моему можно сделать проще, только и всего. Таким образом код в исходниках не собирая на ПК, доставляем в пространство с общим доступом, а малины сами его пусть собирают. Только не понятно, что делать, если очередной раз собрать не получится. apt - всего лишь механизм для получения пакетов, собранных или в исходных кодах. Можно поднять совой локальный репозиторий, на тех-же ресурсах что и nfs. На малинах добавить его в /etc/apt/sources.list и устанавливать через apt собранные на ПК пакеты (или исходники)
Вот и опечатка. В /etc/exports должно быть так(в моём случае): Код (Text): /mnt/sdXX/bot_gray/pi01 pi01(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi02 pi02(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi03 pi03(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi04 pi04(rw,sync,no_root_squash) /mnt/sdXX/bot_gray/pi05 pi05(rw,sync,no_root_squash)
А вот это очень интересно! Надо покурить механизм. (Потом может быть на MIPS присяду - надо пощупать как нибудь. Хорошо бы отладочную плату с ним надыбать и JTAG. Наверное JLink не подойдет - надо купить какой нибудь для всего, если бывает)
Кстати на ПК буду обязательно собирать и проверять. А потом в файле проекта буду ставить другие циферки номера версии. И... скрипт (от пользователя на малине) найдёт изменения, выполнит "сборку" и произведёт перезапуск. Этот скрипрт запускается из под root от имени пользователя после монтирования NFS... и он крутится на протяжении всей работы.
Вот и опять вопрос; В rc.local (стартует некий скрипт) Код (Text): /home/bot_gray/myroot.sh & и вот его содержимое: Код (Bash): #!/bin/bash # ##### СТАРТУЕМ ОТ ROOT И ДАЖЕ ИЗ /etc/rc.local ##### # имя/IP хоста предоставляющего NFS(задаётся) _nfshostname="debian1" #собственно наше имя пользователя оно же и группа(задаемтся) _nuser="bot_gray" _dirname="pi01" # получаем имя нашего хоста(оно у нас зарегистрировано на роутере - вместо IP)(автоопределение) _myhost=$(hostname) # while [ 1 ]; do ping -c 1 $_nfshostname 2>&1>/dev/null ret=$? if [ ${ret} -eq 0 ]; then break fi done # получаем UID и GID ползователя _uid=$(id -u $_nuser) _gid=$(id -g $_nuser) echo $_uid $_gid # проверяем/создаём локальную точку монтрования if ! [ -d /home/$_nuser/$_myhost ]; then mkdir /home/$_nuser/$_myhost chown -R $_nuser:$_nuser /home/$_nuser/$_myhost fi mount -t nfs -O uid=$_uid,gid=$_gid,iocharset=utf-8 $_nfshostname:/mnt/sdXX/bot_gray/$_myhost /home/bot_gray/$_myhost chown -R $_nuser:$_nuser /home/$_nuser/$_myhost chmod 777 /home/$_nuser/$_myhost # далее запускаем рабочий скрипт в режиме "&" su $_nuser -c /home/$_nuser/my.sh #while [ 1 ]; do # sleep 10 #done exit 0 Монтирование NFS без проблем, но su $_nuser -c /home/$_nuser/my.sh не стартует при включении. А он уже будучи не от root должен работать. Он... Код (Bash): #!/bin/bash # mydir=$(hostname) # function f_mylog() { if ! [ -d $mydir/log ]; then mkdir $mydir/log chmod 777 $mydir/log fi } # function f_myrun() { if ! [ -d $mydir/run ]; then mkdir $mydir/run chmod 777 $mydir/run fi } f_mylog f_myrun # echo $mydir echo "USER:$USER" cd $mydir ./mystart.sh restart #./mystart.sh stop exit 0 кстати должен запустить другой скрипт, который уже в примонтрованом NFS ресурсе. Но если быть в сесси root по ssh то всё нормально. Если эту проблему решить, то можно приступит к работе на задуманным проектом.
Прошу прощения. Скрипт-то запускается, а вот текущую директорию я не сменил. в rc.local сделал так: Код (Bash): _pwd=$PWD cd /home/bot_gray ./myroot.sh & cd $_pwd теперь при входе по ssh выглядит так: Код (Bash): bot_gray@pi01:~ $ ps -A -al | grep sh 4 S 0 784 1 0 80 0 - 1965 - ? 00:00:00 sshd 4 S 1002 1642 716 0 80 0 - 1601 - tty1 00:00:00 bash 0 S 1000 1796 1 0 80 0 - 1161 wait ? 00:00:01 mywork.sh 4 S 0 1900 784 0 80 0 - 2385 - ? 00:00:00 sshd 5 S 1000 1918 1900 0 80 0 - 2418 - ? 00:00:00 sshd 0 S 1000 1920 1918 0 80 0 - 1634 wait pts/0 00:00:00 bash 0 S 1000 1964 1962 0 80 0 - 1603 wait_w pts/1 00:00:00 bash 4 S 0 2267 2252 0 80 0 - 1316 - pts/0 00:00:00 bash 0 S 0 2274 2272 0 80 0 - 1317 - pts/2 00:00:00 bash 4 S 0 2819 784 1 80 0 - 2435 - ? 00:00:00 sshd 5 S 1000 2861 2819 0 80 0 - 2435 - ? 00:00:00 sshd 0 S 1000 2863 2861 3 80 0 - 1634 wait pts/3 00:00:00 bash ну и диск NFS: Код (Bash): bot_gray@pi01:~ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 15G 5.6G 8.4G 41% / devtmpfs 458M 0 458M 0% /dev tmpfs 462M 0 462M 0% /dev/shm tmpfs 462M 6.4M 456M 2% /run tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 462M 0 462M 0% /sys/fs/cgroup tmpfs 40M 0 40M 0% /var/tmp /dev/mmcblk0p1 63M 21M 42M 34% /boot debian1:/mnt/sdXX/bot_gray/pi01 294G 246G 34G 89% /home/bot_gray/pi01 tmpfs 93M 0 93M 0% /run/user/1002 tmpfs 93M 0 93M 0% /run/user/109 tmpfs 93M 0 93M 0% /run/user/1000 bot_gray@pi01:~ $ Всё в порядке и скрипт вертится и диск NFS на месте. Кстати mywork.sh размещён на NFS разделе, то есть на другой машине. Теперь движение вперёд! А я?... а что я?!... я сам дурак!