LINUX.ORG.RU

Сообщения HighMan

 

Выбор языка программирования

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

Понимаю, что данная тема из разряда holywar, но так уж вышло.

Я более-менее знаю С, С++. Последний мне не нравится.

Поверхностно знаком с Python. Он не плох, только уж слишком тормознутый. Еще в минусы падает, сложная переносимость между устройствами, тут и разноверсица, и возможные сложности с использованием библиотек. Да. Многое решает venv, но это ужасно не удобно.

В общем, со всем можно было бы смириться, кроме тормознутости. До смешного. Сделал в питоне функцию, которая выполняет банальнейшее XOR шифрование, потом то же самое сделал на С и замерил скорость при работе с блоком данных в 100Мб.

Результат убил на повал. Сишный код оказался быстрее более чем в 1000 раз! Это как, вообще? Понятно, что функцию шифрования можно написать на С и подцепить ее в питоновском сприпте, но постепенно оказывается, что нужно что-то еще ускорить на С. И еще что-то. И еще… В результате от питона ни фига не остается.

Вроде, ну если знаешь С и С++, то пиши и радуйся жизни! Но, С++, как я написал выше, мне не нравится. А на чистом С работа со строками - издевательство.

Раз уж я знаю С, то что стоит изучить любой другой язык?

Вот я и решил копнуть Rust и Golang…

Что сказать… Посмотрев немного на Rust у меня остатки волос встали дыбом! Нагородили хрен знает что! У меня создалось впечатление, что Rust это просто набор костылей.

Возможно я не прав, даже скорее всего, но вот на него переползти с С для меня окажется или непосильной задачей, или ооочень сложной.

Golang? С ним вроде попроще. Но снова чувство костылинга. Плюс, зачем-то изголянее с объявлением переменных. Ну нафига тип переменной идет после ее названия? Типа, Golang не С? Впрочем, у Rust то же самое. Ну зачем???

Еще сильно поразило, что в Go и Rust нет нормальной перегрузки функции, типа int wise_func(char * str) и int wise_func(char * str, int len), Как в С++. Ну и функций с параметрами по умолчанию нет ни там, ни там. Алё! Разрабы! Вы ухи объелись?

Вроде, с помощью костылинга можно решить эти проблемы, но, блин, опять костыли!

В общем, поверхностный взгляд на Rust и Go, отбил всякое желание изучения.

Python мне дался очень легко, и можно было бы его простить за некоторые неудобства, но он таакой тормоз! К тому же, я практически все автоматизационные скрипты сначала написал на Python, а потом всех их переписал на BASH.

Да, BASH еще более тормознутый и разбирать свой же скрипт, через месяц после написания, то еще удовольствие, но хотя бы bash скрипты без проблем переносимые!

В общем, я в печали. Хочется некий язык общего назначения что бы он был быстрым и был лишен неудобств старичка С, но, по ходу, нет гармонии в мире IT.

 

HighMan
()

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

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

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

Коллеги придумали объединять порты в 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 размонтировать каталог из которого вызван скрипт?

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

# команды выполняются в терминале
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 непонятка с правами доступа

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

Пришлось влезть в 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 не подключается

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

Не понятная фигня с 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 восстановление упавшей ноды

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

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

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

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

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

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

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

 

HighMan
()

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

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

Мысль следующая: загрузка системы из 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

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

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

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

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

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

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

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

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

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

 ,

HighMan
()

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

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

В данном случае речь идет о минисистеме, типа 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

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

на текущий момент настроена кластерная связка на 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 и маршрутизация

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

Я пролопоушил какой-то момент при настройке 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

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

В 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 через шлюз

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

Есть основная сеть: 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 не получается

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

Не получается собрать 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 куча ошибок!

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

Сделал флешку с самосборной системой на базе 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
()

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

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

Допустим мне нужно вывести перед приглашением авторизации (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?

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

Прошу не пинать сильно. С 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 парсинг конфига и вопросы по «подстановкам»

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

Возникла задачка на из 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 несколько команд

Здравствуйте, коллеги! Нужно из главного скрипта войти в 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? Есть несколько вопросов...

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

Есть такой инструмент 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
()

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