LINUX.ORG.RU

Сообщения HighMan

 

Bond или есть более удачные решения?

Форум — Admin

С Наступающим Новым Годом, коллеги!

Собственно, поставлена задача обеспечить надежную (избыточную) связь между несколькими машинами в локальной сети.

Коллеги придумали объединять порты в bond (Active Backup) и вроде даже заработало!

Каждая машина обладает двумя сетевыми интерфейсами. От enp1s0 шнур в первый маршрутизатор, от enp4s0 во второй.

В конкретном случае 2 маршрутизатора Nateks NRI-3030. По 8му порту они соединены кабелем напрямую.

На машинах установлен Altlinux 10.

Ели оторват кабель от любого интерфейса, то передача данных не прерывается.

Вроде, все замечательно, но нет…

Например mii-tool уверяет, что бонд работает аж на 10 Мбитс в полудуплексе. На деле же порты на маршрутизаторе настроены на 1 Gbits и платы на машинах тоже гигабитные.

Так и должнор быть?

Кроме того, с внедрением бонда сразу выползли непонятные и неповторямые проблемки с сетью.

Например на одной машине не удалось настроить ssh авторизацию по ключу! Вот, вааще, ни как! Ключи в него можешь обпрописываться, все равно он будет требовать пароль. sshd_config приводить не буду. В нем почти все дефолтное, только разрешена авторизация для root. К тому же, openssh-server переустанавливал и конфиг в него копировал с другой машины, где авторизация по ключу проходила нормально. Вотще! Не смотря на то, что ключ запомнен, требует пароль - хоть тресни. Ни каких ашыпок нет. Просто ключ не подтягивает, падла.

И что самое противное, такая беда случилась лишь на одной машине. На остальных все в порядке.

Были и еще мелкие заглюки с сетью, но сейчас уже не вспомню. В предпоследний раз я с этими бондами сталкивался летом.

В общем, мне эта бондиниада совсем не понравилась.

Может уважаемые коллеги предложат иной способ обоспечить избыточную надежность?

 , ,

HighMan
()

Как из bash script размонтировать каталог из которого вызван скрипт?

Форум — Development

Представим себе следующую ситуацию:

# команды выполняются в терминале
mount /dev/sdb1 /mnt
cd /mnt
cat /usr/bin/supermegascript
#!/usr/bin/env bash
cd /tmp # пытаемся освободить /mnt
umount /mnt # получаем ашыпку target is busy

supermegascript
umount: /mnt: target is busy.

А как сделать, что бы скрипт полностью сменил каталог запуска на «нейтральный» и освободил /mnt?

 , ,

HighMan
()

shm_open непонятка с правами доступа

Форум — Development

Доброго времени, коллеги!

Пришлось влезть в IPC и натолкнулся на непонятный момент.

Допустим я создаю новый shared object с правами 0666:

const char * shared_name = "myshared";
mode = O_CREAT;
fd = shm_open(shared_name, O_RDWR | mode, 0666);

Объект создался, появился файл /dev/shm/myshared, вот только права доступа к файлу 0644!

Другим процессом, от того же пользователя, открываю этот объект и все нормально.

Однако, если я выполняю создающую программу от root, то я не могу открыть этот объект на чтение/запись от имени пользователя!

Как сделать, что бы объект, созданный от root, был доступен на чтение/запись для непривилегированного пользователя?

 ,

HighMan
()

Под Linux OpenVPN не подключается

Форум — Admin

Здравствуйте, коллеги!

Не понятная фигня с OpenVPN (PФ->РФ).

Мне знакомый подогнал конфиг клиента для подключения к его рабочей сети. Свой конфиг! Испытанный и работающий на венде.

Но у меня под Linux (Fedora) подключится не получается.

Вот небольшая выжимка из лога при подключения из консоли:

#...
2024-10-28 22:51:52 TUN/TAP device tap0 opened
2024-10-28 22:51:52 WARNING: OpenVPN was configured to add an IPv4 route. However, no IPv4 has been configured for tap0, therefore the route installation may fail or may not work as expected.
2024-10-28 22:51:52 net_route_v4_add: 192.168.0.0/24 via 192.168.50.1 dev [NULL] table 0 metric -1
2024-10-28 22:51:52 sitnl_send: rtnl: generic error (-101): Network is unreachable
2024-10-28 22:51:52 ERROR: Linux route add command failed
2024-10-28 22:51:52 net_route_v4_add: 192.168.51.0/24 via 192.168.50.1 dev [NULL] table 0 metric -1
2024-10-28 22:51:52 sitnl_send: rtnl: generic error (-101): Network is unreachable
2024-10-28 22:51:52 ERROR: Linux route add command failed
#...

Сам клиент конфиг незамысловатый:

grep -v '^\s*$\|^\s*#\|^\s*;' client.ovpn
client
auth-user-pass
auth-nocache
dev tap
proto tcp
remote xxx.xxx.xxx.xxx 26370
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-auth ta.key 1
cipher AES-128-CBC
auth SHA512
comp-lzo
verb 3

Как я понимаю, OpenVPN сервер живет в Microtik. Доступа к настройкам этого Микротика нет.

Под виндой все подключается нормально (со слов знакомого). А вот под Linux плдключится не получается. См. log выше.

Как эту беду победить?

Мне раньше приходилось подключатся к микротикам и ни когда проблем не возникало. А сейчас очень нужно подключится, но почему-то не могу.

 ,

HighMan
()

etcd восстановление упавшей ноды

Форум — Admin

Добрый день, коллеги.

Есть, точнее был кластер etcd из 3х нод. На одной из нод был удален каталог /var/lib/etcd. Пусть это будет нода 3.

Не спрашивайте как так получилось. Долгая история.

Как вернуть данный сервер с etcd в существующий кластер etcd?

Я удалил данного мембера из кластера, так что кластер etcd состоит всего из двух нод.

Как я понимаю: нужно как-то поднять etcd на ноде 3, включить ее в существующий кластер etcdctl member add …

Но как поднять etcd на на этой 3й ноде? etcd не желает запускаться.

 

HighMan
()

dracut initramfs монтирование ovelayfs в /

Форум — Admin

Здравствуйте, коллеги!

Мысль следующая: загрузка системы из squashfs образа с сохранением изменений на указанный раздел диска (overlay).

Задачу эту я решил используя свой /init скрипт, но как-то это кривовато получилось.

Поиски натолкнули меня на dracut, он есть в Altlinux, и он подобное умеет. Вроде бы…

Первым делом решил пересобрать initramfs:

dracut --add-drivers "overlay squashfs ata-generic" --force

Создается /boot/initramfs-6.1.85-un-def-alt0.c10f.1.img и в нем действительно присутствуют модули ядра overlay и squashfs.

Это здорово!

Осталось понять, все ли я правильно сделал для генерации initrd и придумать строку опций для загрузки из груб.

Вот тут я в растерянности.

Знатоки dracut, помогите правильно сгенерировать initramfs и подскажите с параметрами загрузки.

Была тема: Как задать свой путь к squashfs.img из папки LiveOS там как раз описаны параметры запуска, но к сожалению я мало что понял.

Допустим, есть раздел /dev/sda1 (fat32 4G) на нем лежат /vmlinuz, /iniramfs, /root.squashfs

второй раздел /dev/sda2 (ext4) он и должен быть слоем для записи.

 ,

HighMan
()

GPIO events

Форум — Development

Добрый день, коллеги!

Скажу честно, с GPIO столкнулся впервые.

Смотрел 2 способа работы: через /sys и через libgpiod. Через файлы мне понравилось куда как больше.

Чего удалось достичь: инициализировать линии, мыргать светодиодом и даже получать информацию о том в каком состоянии линия.

Остались непонятки: как выяснить какие линии являются IN и какие OUT? Выяснить не методом ручного контроля, а автоматически.

Еще, по ТЗ, требуется постоянный опрос с частотой до 10 раз в секунду, что здорово нагружает процессор.

Начал рыть и нашел некие намеки, что можно как-то сделать через event, т.е. не заниматься постоянным опросом, а использовать нечто, реагируещее на изменение состояния линии.

Нашел пример на python, там, как я понял, при возникновении изменения состояния линии, вызывается функция, которая выполняется в новом потоке.

Подскажите как «присесть» на event при работе через /sys?

 ,

HighMan
()

initrd отвязать squashfs от носителя (USB Flash)

Форум — Admin

Здравствуйте, коллеги!

В данном случае речь идет о минисистеме, типа rescue на флешке. В squashfs собран образ, который в упакованном виде весит около 300 Мб.

Я полностью подменил /init в initrd и там все прекрасно собирается в overlay где rw слоем может выступать ОЗУ или раздел диска.

Все работает, но есть не приятный момент: если при загруженной с флешки системе эту флешку выдрать, то… Спасает лишь hard reset.

Ну и иногда случаются артефакты с самой флешкой. Т.е. флешку не дергали, тем не менее изредка начинается какая-то непонятная фигня, типа не все нормально считалось и вообще появляются какие-то фантомные неисправности диска. Именно фантомные, т.к. все проверялось и ни каких ашыпок нет.

Вот и появилась мысль чекать в initrd размер squashfs файла и если его размер ниже некоего разумного значения, например до 500 Мб, то сначала загнать его в ОЗУ и лишь потом собирать overlay.

Вроде все просто, но просто было на бумаге. Почему-то в initrd вылетают ашыпки input-output в процессе записи образа в tmpfs.

mount -t tmpfs tmpfs /tmp
mkdir /tmp/mnt
mount /dev/sdc1 /tmp/mnt # монтирование раздела, 
                         #на котором лежит squashfs файл.
mkdir /tmp/sfs
cp /tmp/mnt/sys.squashfs /tmp/sfs # вот тут и происходит ошибка
umount /tmp/mnt

Я привел максимально упрощенный отрывок кода без проверок и прочего. Но предположим, что sys.squashfs действительно лежит на /dev/sdc1, он смонтировался, а размер ОЗУ 4Gb и более.

Тем не менее, именно в процессе банального копирования очень часто происходит ошибка с руганью на input-output.

Что я делаю не так?

Может, вообще идея с записью образа в ОЗУ, нежнеспособная?

 

HighMan
()

haproxy не видит patroni

Форум — Admin

Здравствуйте, коллеги!

на текущий момент настроена кластерная связка на 3 ноды: etcd, postgresql12-server, patroni и весь этот зоопарк нормально работает.

За основу был взят мануал https://itdraft.ru/2023/08/14/nastrojka-otkazoustojchivogo-klastera-postgresql-v-linux/

pgbouncer мне пока не нужен.

Установил haproxy, адаптировал конфиг под Altlinux и не выходит каменный цветок.

systemctl status haproxy
...
Jun 27 15:27:10 host-101 haproxy[9409]: [NOTICE]   (9409) : New worker (9411) forked
Jun 27 15:27:10 host-101 haproxy[9409]: [NOTICE]   (9409) : Loading success.
Jun 27 15:27:10 host-101 systemd[1]: Started HAProxy Load Balancer.
Jun 27 15:27:10 host-101 haproxy[9411]: [WARNING]  (9411) : Server postgres_master/host-101 is DOWN, reason: Layer7 wrong status, code: 503, info: "Service Unavailable", check duration: 4ms>
Jun 27 15:27:10 host-101 haproxy[9411]: [ALERT]    (9411) : sendmsg()/writev() failed in logger #1: No such file or directory (errno=2)
Jun 27 15:27:10 host-101 haproxy[9411]: [WARNING]  (9411) : Server postgres_replicas/host-102 is DOWN, reason: Layer7 wrong status, code: 503, info: "Service Unavailable", check duration: 1>
Jun 27 15:27:10 host-101 haproxy[9411]: [WARNING]  (9411) : Server postgres_replicas_sync/host-101 is DOWN, reason: Layer7 wrong status, code: 503, info: "Service Unavailable", check durati>
Jun 27 15:27:10 host-101 haproxy[9411]: [WARNING]  (9411) : Server postgres_replicas_sync/host-102 is DOWN, reason: Layer7 wrong status, code: 503, info: "Service Unavailable", check durati>
Jun 27 15:27:10 host-101 haproxy[9411]: [ALERT]    (9411) : proxy 'postgres_replicas_sync' has no server available!
Jun 27 15:27:10 host-101 haproxy[9411]: [WARNING]  (9411) : Server postgres_replicas_async/host-102 is DOWN, reason: Layer7 wrong status, code: 503, info: "Service Unavailable", check dura

вот отрывок из

cat /etc/haproxy/haproxy.cfg 
global
    maxconn 100000
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /var/lib/haproxy/stats mode 660 level admin expose-fd listeners
    pidfile /run/haproxy.pid
    stats timeout 30s
    user _haproxy
    group _haproxy
    daemon

defaults
    mode               tcp
    log                global
    retries            2
    timeout queue      5s
    timeout connect    5s
    timeout client     60m
    timeout server     60m
    timeout check      15s

listen stats
    mode http
    bind 192.168.12.101:7000
    stats enable
    stats uri /

listen postgres_master
    bind *:5000
    maxconn 10000
    option tcplog
    option httpchk OPTIONS /master HTTP/1.1
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 4 on-marked-down shutdown-sessions
    server host-101 192.168.12.101:5432 check port 8008
    server host-102 192.168.12.102:5432 check port 8008
    

listen postgres_replicas
    bind *:5001
    maxconn 10000
    option tcplog
    option httpchk OPTIONS /replica HTTP/1.1
    balance roundrobin
    http-check expect status 200
    default-server inter 3s fastinter 1s fall 3 rise 2 on-marked-down shutdown-sessions
    server host-101 192.168.12.101:5432 check port 8008
    server host-102 192.168.12.102:5432 check port 8008

8008 порт отдает patroni и он нормально работает

patronictl -c /etc/patroni/patroni.yml list pg_cluster
+ Cluster: pg_cluster ------+---------+---------+----+-----------+
| Member   | Host           | Role    | State   | TL | Lag in MB |
+----------+----------------+---------+---------+----+-----------+
| host-101 | 192.168.12.101 | Replica | running |  3 |         0 |
| host-102 | 192.168.12.102 | Leader  | running |  3 |           |
+----------+----------------+---------+---------+----+-----------+

Я полагаю, что haproxy что-то не то спрашивает у patroni и они друг друга не понимают.

Как, вообще, через telenet поопрашивать patroni?

И что тут может быть не так?

 ,

HighMan
()

ocserv и маршрутизация

Форум — Admin

Доброго времени, коллеги!

Я пролопоушил какой-то момент при настройке ocserv. При старте данного сервиса не создается интерфейс, он появляется лишь после подключения первого клиента. И не добавляется автоматически маршрут до vpn сети (пусть будет 192.168.19.0/24).

В связи с этим я получил блокировку сервера, т.к. снова ступил и запустил

nmap -v -sn 192.168.19.0/24

Трафик попер по default маршруту и, в том числе, nmapнул внешнюю сеть. За что и получил блокировку.

Возможно я что-то не правильно настроил в конфиге?

Можно как-то сделать, что бы при старте сервера появлялся виртуальный VPN интерфейс (например vpns0) и автоматически прописывался маршрут до VPN сети, типа:

ip route add 192.168.19.0/24 via 192.168.19.1 dev vpns0

Заранее благодарен!

 

HighMan
()

ansible несколько действий под одним name

Форум — Development

Здравствуйте, коллеги!

В ansible я новичок, потому могу задавать иногда глупые вопросы.

Можно ли как-то прописать несколько разных действий под одним name. Например:

- name: Configure patroni
  ansible.builtin.file:
    path: /etc/patroni
    state: directory
    mode: '0700'
  template:
    src: patroni.yml.j2
    dest: /etc/patroni/patroni.yml

Этот код не работает, но я думаю понятно, что хочу сделать. Создать директорию для хранения конфига и поместить туда шаблон.

Вот так работает:

- name: Create directory
  ansible.builtin.file:
    path: /etc/patroni
    state: directory
    mode: '0700'

- name: Set config
  template:
    src: patroni.yml.j2
    dest: /etc/patroni/patroni.yml

Но зачем мне выводить инфу по всем действиям, которые я делаю?

 

HighMan
()

broadcast через шлюз

Форум — Admin

Здравствуйте, коллеги!

Есть основная сеть: 192.168.0.0/24, в ней есть некий комп с адресом 192.168.0.250 (Linux), выполняющий роль шлюза для сети 192.168.12.0/24. В этой подсети он имеет второй ip 192.168.12.1.

Роутинги настроены. Из 192.168.0.0/24 прекрасно пингуются адреса 192.168.12.0/24 и обратно.

А еще я сделал небольшую програмку, которая рассылает broadcat на определенный порт и выводит список откликнувшихся. Разумеется, откликаются те машины, на которых висит програмка, слушающая этот порт и посылающая UDP ответ вопрошающему.

Все прекрасно работает если броадкастер и ответчик находятся в одной сети, например 192.168.0.0/24, но броадкасты не доходят из главной сети в подсеть 192.168.12.0/24.

Можно как-то настроить, что бы 192.168.0.250 пропускал броадкасты из 192.168.0.0/24 в 192.168.12.0/24?

 

HighMan
()

overlay в fstab не получается

Форум — Admin

Здравствуйте, коллеги!

Не получается собрать overlay в fstab. При загрузке системы выдает ошибку монтирования.

# dmesg
...
[   11.171791] systemd[1]: Mounting /srv/overlay...
[   11.180677] systemd[1]: Mounting /tmp...
[   11.180883] overlayfs: failed to resolve '/srv/layer/upper': -2
...
# ls /srv -la
total 24
drwxr-xr-x  7 root root 4096 Jun  5 13:20 .
drwxr-xr-x 24 root root 4096 Jun  4 12:57 ..
drwxr-xr-x  6 root root 4096 Jun  4 17:36 layer
drwxr-xr-x 24 root root  364 Jun  4 12:57 lower
drwxr-xr-x  2 root root 4096 Jun  4 16:24 mnt
drwxr-xr-x  1 root root 4096 Apr 17 13:24 overlay
drwxr-xr-x  2 root root 4096 Jun  5 13:11 upper

# mount -t overlay overlay -o lowerdir=/srv/lower,upperdir=/srv/layer/upper,workdir=/srv/layer/workdir /srv/overlay/

# mount | grep overlay
overlay on /srv/overlay type overlay (rw,relatime,lowerdir=/srv/lower,upperdir=/srv/layer/upper,workdir=/srv/layer/workdir)

# cat /etc/fstab | grep overlay
overlay	/srv/overlay	overlay	nofail,lowerdir=/srv/lower,upperdir=/srv/layer/upper,workdir=/srv/layer/workdir	0	0

# lsmod | grep overlay
overlay               147456  0

Почему-то не монтируется через fstab, но при этом прекрасно монтируется через mount.

Где я накосячил?

 ,

HighMan
()

i915 drm куча ошибок!

Форум — Admin

Здравствуйте, коллеги!

Сделал флешку с самосборной системой на базе alt 10. Все нормально. Свои задачи выполняет, но…

Привезли новые компы и пытался их загрузить со своей флешки. Море ошибок.

[   88.572174] i915 0000:00:02.0: [drm] *ERROR* AUX B/DDI B/PHY B: did not complete or timeout within 10ms (status 0xad40023f)
[   88.574302] i915 0000:00:02.0: [drm] *ERROR* AUX B/DDI B/PHY B: not done (status 0xad40023f)

Я ее и так и эдак. Со словами и без слов…

Победить эту ошибку получилось лишь отключив в BIOS Intel IGFX.

Но тот же установленный Alt 10 работает нормально и подобных ошибок не выдает.

Перелопатил /etc/modprobe.d, /etc/modules-load.d, /etc/default…

В установленном alt 10 нет ни чего, что бы относись к i915. Там, вообще, почти ни чего нет.

Почему же у меня не работает?

Подскажите, плз, куда копать???

 ,

HighMan
()

Как вывести некое сообщение до приглашения авторизации?

Форум — Admin

Здравствуйте, коллеги!

Допустим мне нужно вывести перед приглашением авторизации (multi-user.target) результаты выполнения некой программы. Например «ip addr». Как это сделать?

Я пытался оформить этот вызов как сервис:

# cat /lib/systemd/system/get-addr.service 
[Unit]
Description=ip list utils
After=network.target

[Service]
ExecStart=/sbin/ip addr

[Install]
WantedBy=multi-user.target

# systemctl enable get-addr.service
# reboot

Мой «сервис» выполняется, но ни чего не отображает перед приглашением авторизации.

Понять, что мой «сервис» выполнился можно:

# systemctl status get-addr.service 
* get-addr.service - ip list utils
     Loaded: loaded (/lib/systemd/system/get-addr.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Mon 2024-06-03 16:20:36 UTC; 4s ago
    Process: 1467 ExecStart=/bin/echo This my serveice! >&2 (code=exited, status=0/SUCCESS)
   Main PID: 1467 (code=exited, status=0/SUCCESS)
        CPU: 4ms

Jun 03 16:20:36 bsElna111111 systemd[1]: Started ip list utils.
# и дальше построчный вывод "ip a"

Как сделать, что бы результат выводился на экран?

 ,

HighMan
()

Как подключиться к ARM через COM?

Форум — Admin

Здравствуйте, коллеги.

Прошу не пинать сильно. С ARM я сталкивался, но давно и как-то не глубоко. На данный момент из памяти почти все стерлось.

Что мы имеем:

Architecture:           aarch64
  CPU op-mode(s):       32-bit, 64-bit
  Byte Order:           Little Endian
CPU(s):                 8
  On-line CPU(s) list:  0-7
Vendor ID:              ARM
  Model name:           Cortex-A55
 ...

Железка рабочая. На ней установлен Debian 12

uname -a
Linux Debian 5.10.160 #4 SMP Fri Feb 9 09:21:31 MSK 2024 aarch64 GNU/Linux

Debian - это, конечно, очень хорошо! Но нам на нем нужен Alt.

Систему можно загрузить с «харда» или карты памяти.

Полазил в интернете и даже кое что нашел! https://www.adior.ru/index.php/desktop/162-alt-linux-arm

Сделал по инструкции. Залил alt-workstation-10.0-aarch64.img.xz по инструкции на карту памяти, попытался загрузиться и… И ни чего! Просто черный экран.

Меня, вообще, arm выбешивает, что при загрузке, вообще ни чего не говорит! При загрузке предустановленного Debian, сначала черный экран, помигивает курсор, потом сразу приглашение в систему.

Сам процесс загрузки сокрыт.

Полазив в интернет я нашел инфу, что больше информации можно получить подключившись к RS232.

Я когда-то, ка писал выше, с этим сталкивался, но все успешно забыл.

Давайте представим что есть шнур с CP2102/CP2109 UART Bridge Controller на одном конце 9 pin на другом USB.

Подключаем COM к ARM, usb к внешнему компу с Linux.

В Linux устанавливаю Putty. Допрос с пристрастим dmesg выдает:

 [ 1696.053358] usb 1-1.4.3.1: new full-speed USB device number 13 using ehci-pci
[ 1696.165585] usb 1-1.4.3.1: New USB device found, idVendor=10c4, idProduct=ea60, bcdDevice= 1.00
[ 1696.165623] usb 1-1.4.3.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1696.165644] usb 1-1.4.3.1: Product: CP2104 USB to UART Bridge Controller
[ 1696.165659] usb 1-1.4.3.1: Manufacturer: Silicon Labs
[ 1696.165673] usb 1-1.4.3.1: SerialNumber: 034BC90C
[ 1696.167806] cp210x 1-1.4.3.1:1.0: cp210x converter detected
[ 1696.170454] usb 1-1.4.3.1: cp210x converter now attached to ttyUSB0

О! Крупица информации: cp210x converter now attached to ttyUSB0

Далее запускаю Putty, выбираю serial, вписываю /dev/ttyUSB0 и… Скорость по умолчанию 9600. Оставляю как есть или забиваю 115200 -результат един. Открывается окно в котором лишь курсор, который ни на что не реагирует.

Ни чего не вводится и не выводится.

Что я делаю не верно? Что я забыл?

Давайте будем считать (надеятся), что шнурок живой.

PS. Еще я видел, что у Alt linux есть iso образы для arm64. Например alt-server-10.0-aarch64.iso
https://download.basealt.ru/pub/distributions/ALTLinux/p10/images/server/aarch64/

Как его можно установить???

 ,

HighMan
()

bash парсинг конфига и вопросы по «подстановкам»

Форум — Admin

Здравствуйте, коллеги.

Возникла задачка на из bash скрипта распарсить конфигурационный файл и, соответственно, проинициализировать свои переменные на основе данных конфига.

Формат конфига простой ка мычание: ключ = значение. Т.е. разделителем служит знак =. Что слева от него - ключ, справа - значение.

Понимаю, что на python это сделать как 2 пальца об асфальт, но, в силу ряда причин, приходится башить.

Тем не менее, на вооружение, я взял пистоновский подход:

declare -A conf

default_conf(){
 conf['user']=user
 conf['passwd']=''
 # ...
}

Т.е. инициализирую dictionary значениями по умолчанию, которые, в дальнейшем, будут проиницилизированы повторно, но уже данными из конфига.

Наверное мне проще задать вопрос на примере

load_conf(){
 # $1 - conf file
 [ -f $1 ] || return 1
 local l lines var param
 # Загружаем конфигурационный файл без коментариев (# ...) и
 # пустых строк
 IFS=$'\n'
 lines=($(awk -F# '{print $1}' | grep -v '^\s*$'))
 for l in ${lines[@]}; do
  var=${l%%=*}   
  param=${l#*=}
  # ...
 done
}

Вот, кстати, тут и возник вопрос по «подстановкам». Инициализацию var и param я подглядел, но до конца не понял.

Если не сложно, то ткните носом где о подобном можно почитать

Дальше, по идее, нужно проверять $var на наличие такого ключа в conf, но я не знаю как это сделать.

В интернете советуют проверять наличие ключа в словаре следующим образом:

[ -n "${conf[$var]}" ] && ${conf[$var]}=$param

но это как-то не верно, на мой взгляд. Ведь в словаре может быть ключ с пустым значением, как, например, в функции default_conf инициализируется conf[‘passwwd’]='', т.е. инициализируется пустым значением по умолчанию. Тут прилетает из конфига passwd = 12345 и скрипт отбросит этот пароль, т.к. в словаре пароль инициализирован пустым значением.

Можно, конечно, пойти от обратного и сразу инициализировать словарь значениями из файла, а потом уже проверять ключи на наличие, но так в словарь могут залететь непредусмотренные ключи с дурацкими значениями, типа:

 var='hernya'
 param='polnaya'
 conf[$var]=$param

Большой беды не будет, но, как-то не правильно, засерать словарь всякой глупостью, которую может придумать конечный юзверь.

UPD awk можно выбросить и загрузку сделать грепом:

grep -v '\s*#.*$\|^\s*$' $1

 

HighMan
()

Из скрипта выполнить в chroot несколько команд

Форум — Admin

Здравствуйте, коллеги! Нужно из главного скрипта войти в chroot и там выполнить несколько комманд. Я соорудил:

chroot ${WORK_DIR}/chroot <<EOF
echo $ROOT_PASSWD | passwd root --stdin
[ -d /srv/mnt ] || mkdir /srv/mnt
EOF

Вроде устанавливается пароль для root и создается /srv/mnt, вот только… на экране отображается все, что находится между <<EOF EOF, а это как-то не красиво. Как избавиться от этого никчемушного вывода?

 ,

HighMan
()

Есть сведущие в make-initrd? Есть несколько вопросов...

Форум — Admin

Здравствуйте, коллеги!

Есть такой инструмент https://github.com/osboot/make-initrd/

Он вшит в Altlinux, но, так же, может использоваться в других системах.

Если вы им когда-то пользовались, то подскажите, пожалуйста, по следующим вопросам:

  1. Как добавить нужные мне модули ядра? (например squashfs)

  2. Как добавить некоторые утилиты? (например fdisk)

  3. Можно ли оперируя свойствами загрузки ядра (/proc/cmdline) заставить initrd загружать систему из squashfs образа, накладывать на него overlay (rw layer) используя какой-то раздел?

Я добился нужного результата нагородив не хилый набор скриптов, которые разбирают имеющийся initrd из altlinux, напихивают в него нужные модули ядра (копирование из базовой системы), перегенерируют modules.dep, дальше подменяют в initrd /init своим скриптом.

Но, насколько понимаю, я занимаюсь изобретением велосипеда и большую часть можно сделать используя этот make-initrd.

Вроде, все прозрачно. Весь набор скриптов make-initrd это make и bash скрипты, но…

make я знаю из рук вон плохо. Можно сказать, что не знаю.

bash скрипты уже ближе, но написаны они не в моем стиле и разбирать их сСущее наказание. Потому оказалось проще написать самому скрипты, которые выполняют нужные действия.

 , ,

HighMan
()

пустой вывод arp -a

Форум — Admin

Здравствуйте, коллеги!

Есть некая странная машина Linux, которая регулярно вываливается из сети.

Живет себе поживает. Откликается на пинги, ssh подключения, т.е. все как должно быть. Потом, внезапно, ssh соединение с этой машиной виснет, на пинги она перестает отвечать.

Если посмотреть на этой машине, то интерфейс UP, но ни кого не пингует и, вообще, ни какой сетевой активности.

Оживить сеть можно лишь systemctl restart networking.

И самое интересное, что в периоды зависания сети arp -a выдает пустоту! При этом на другой машине висит ssh соединение с ней.

Смотрел логи и dmesg, но не нашел ни чего криминального.

Что это может быть?

 , ,

HighMan
()

RSS подписка на новые темы