LINUX.ORG.RU

Сообщения MariaRTI

 

Подскажите, что ему надо?

Пытаюсь засунуть в Makefile проверенную работающую команду для упрощения вызова

all:

start:
    docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -v /tmp/$(mktemp -d):/run local/c7-systemd-app && docker attach docker_local/c7-systemd-app_1
.PHONY : start

stop:
    docker stop docker_local/c7-systemd-app_1
.PHONY : stop

вызываю make start получаю

Makefile:4: *** образец цели не содержит «%».  Останов.

Нужно просто выполнить команду.

 

MariaRTI
()

Помогите восстановить рабочий стол

Ubuntu 22.04.3 Desktop дефолтный

Последовательность действий кратко - поставил клиента ldap, настроил, перезагрузился потерял всяческий доступ. Загрузился в рекавери моде, поменял пароль рута и юзера на простой. Перезагрузился. Новые пароли принимаются, но после графического экрана логина, получаю черный экран. Однако, если войти в дополнительную консоль Ctrl+Alt+F4, дает войти под root. Зашел под root удалил apt purge все установленные пакеты связанные с ldap клиентом,

пакет libpam-ldap был удален раньше и заменен на libpam-ldapd

apt purge libnss-ldap libpam-ldapd ldap-utils nscd

перезагрузился. Вернул файл /etc/nsswitch.conf и файлы в каталоге /etc/pam.d в исходное состояние, но не гарантирую, что все. Но ситуация не поменялась. После ввода нового пароля получаю черный экран и пароль юзера, не понятно принимается или нет, вроде да, а так нет… :). Могу войти только в консольном режиме.

apt update

apt upgrade

надеялся, что обновлениями поправлю. Нет, не помогло.

 , ,

MariaRTI
()

Странное поведение в perl-скрипте в функции cwd()

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

xCAT + BMC(IPMI) = лыжи не едут

Буков много, поэтому прокрутите до конца, там суть вопроса

Перемещено hobbit из general

 

MariaRTI
()

xCAT + BMC(IPMI) = лыжи не едут

Поставил на сервер(Ubuntu 18.04.5 LTS) xCAT v.2.16.4. Встал без проблем, версии совместимы. Есть железо - плата с процессором Intel Xeon и с bmc(прошивка - openbmc).

Для связи с bmc cоздал узел

mkdef -t node groups=all,ipmi,x86_64 --template x86_64-template mgt=ipmi cons=ipmi bmc=192.168.0.220 bmcport=623 bmcusername=root bmcpassword=0penBmc ip=10.0.0.2 cn1

проверил, как создался

root@xcatmn:/home/worker# lsdef cn1
Object name: cn1
    arch=x86_64
    bmc=192.168.0.220
    bmcpassword=0penBmc
    bmcport=623
    bmcusername=root
    cons=ipmi
    getmac=ipmi
    groups=all,ipmi,x86_64
    ip=10.0.0.2
    mgt=ipmi
    netboot=xnba
    postbootscripts=otherpkgs
    postscripts=syslog,remoteshell,syncfiles
    serialport=0
    serialspeed=115200
    usercomment=the system X node definition

При помощи команды xcat rpower запрашиваю узел о состоянии питания

root@xcatmn:/home/worker# rpower cn1 status
cn1: [xcatmn]: Error: ERROR: Invalid authentication algorithm
cn1: [xcatmn]: Error: ERROR: Invalid authentication algorithm
cn1: [xcatmn]: Error: ERROR: Invalid authentication algorithm
cn1: [xcatmn]: Error: ERROR: Invalid authentication algorithm
cn1: [xcatmn]: Error: ERROR: Invalid authentication algorithm
cn1: [xcatmn]: Error: ERROR: timeout

Проверяю доступность узла при помощи утилиты ipmitool или ipmitool-xcat, без разницы, параметры одинаковые, выхлоп тоже.

root@xcatmn:/home/worker# ipmitool-xcat -H 192.168.0.220 -I lanplus -C 17 -U root -P 0penBmc mc info
Device ID                 : 35
Device Revision           : 0
Firmware Revision         : 0.00
IPMI Version              : 2.0
Manufacturer ID           : 343
Manufacturer Name         : Intel Corporation
Product ID                : 126 (0x007e)
Product Name              : Unknown (0x7E)
Device Available          : yes
Provides Device SDRs      : no
Additional Device Support :
    Sensor Device
    SDR Repository Device
    SEL Device
    FRU Inventory Device
    IPMB Event Receiver
    IPMB Event Generator
    Chassis Device
Aux Firmware Rev Info     : 
    0x00
    0x00
    0x00
    0x00

Т.е. BMC доступен и отвечает по IPMI если его правильно запростить. Однако, из всего пакета xcat работает только ipmitool-xcat, который, впрочем, ничем не отличается от стандартного ipmitool.

Очевидно, проблема в том, что xcat использует не v.2.0 ipmi-интерфейса, когда запросы идут через ноду. В то время как в ipmitool не используются настройки ноды, а вводятся аргументы непосредственно, с правильными параметрами интерфейса (-I lanplus -C 17). Как это повторить в настройках ноды, не понял. Перерыл всё, что можно найти.

Как получить пользу от xcat? Любые идеи…

 

MariaRTI
()

очередной велосипед Zabbix LLD - не едет

Упражняюсь с Zabbix LLD. Что-то затык в понимании, что дальше делать. Попробовал по примерам, только запутался. Что делаю по шагам…

  1. Написал скрипт sensors.sh, который возвращает JSON, вроде как правильный для LLD. У скрипта есть параметр - ip или dns хоста, его бы тоже надо задавать динамически, но если он не задан, то берется отладочный(1 хост известен). Итак, возвращается список сенсоров с запрошенного хоста.
{
  "data": [
    {
      "{#SENSOR}": "Core_1_CPU1",
      "{#VALUE}": 42
    },
    {
      "{#SENSOR}": "Core_2_CPU1",
      "{#VALUE}": 41
    },
    {
      "{#SENSOR}": "Core_3_CPU1",
      "{#VALUE}": 41
    },
    {
      "{#SENSOR}": "Core_4_CPU1",
      "{#VALUE}": 42
    },
    {
      "{#SENSOR}": "Core_5_CPU1",
      "{#VALUE}": 43
    },
    {
      "{#SENSOR}": "Core_6_CPU1",
      "{#VALUE}": 41
    },
    {
      "{#SENSOR}": "DIMM_A1_CPU1",
      "{#VALUE}": 34
    },
    {
      "{#SENSOR}": "DTS_CPU1",
      "{#VALUE}": 43.094
    },
    {
      "{#SENSOR}": "Die_CPU1",
      "{#VALUE}": 43.063
    }
  ]
}
  1. поместил скрипт в директорию /usr/lib/zabbix/externalscripts на сервере заббикса.

  2. Создал новую группу шаблонов и новый шаблон в группе

  3. В созданном шаблоне создал правило обнаружения

Имя = Get_Sensors
Тип = внешняя проверка
Ключ = sensors.sh
  1. Сохранил, перезашел в шаблон и в правило обнаружения и протестировал - кнопка «тест». В диалоговом окне получил тот-же JSON в виде текстовой строки.

  2. Создал узел, указал ему ip, связал его с шаблоном, но чуда не случилось. Всё активировано, узел доступен, скрипт с него данные забирает, но данные через LLD не поступают в Zabbix.

Всё. В шаблоне, кроме правила обнаружения, больше ничего нет. JSON в тесте читается, значит правильный. Интервал обновления задан. Ключи в формате макросов заданы, значит должны автоматически подхватываться. Пробовал и без них, потом парсить предобработкой JSONPath и макросы создавать, только еще более запутался и удалил , и предобработку и макросы. Парсить вроде бы нечего, макросы уже заданы.

Не понятно, надо ли создавать UserParameter, да и зачем, ведь это совсем другой механизм, отличный от LLD. Там опять скрипт запускать надо, а он уже итак работает в шаблоне.

Не понятно, надо ли создавать прототип элемента данных и что он из себя представляет… там опять требуется запускать скрипт, который вроде как уже и так отработал. И нельзя создать зависимый элемент от правила обнаружения, чтобы его результат распарсить или повторно использовать, без новых запросов, можно только от основного элемента - опять масло масленое. Зачем тогда правило обнаружения нужно…

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

Вопрос.

  1. Как дальше автоматизировать создание элементов данных с именами из {#SENSOR} и значениями из {#VALUE} ? Пусть значения будут типа float. Как и где ему это «сказать»?

  2. Как передать в скрипт ip или dns узла? В правиле обнаружения, правильно?

Ключ = sensors.sh[{$HOST.IP}]

{$HOST.IP} - такая встроенная переменная существует?

Что дальше делать, чтобы данные получить?

 , ,

MariaRTI
()

jq трансформация JSON. Кое что не получается

Перечитал и перепробовал много, но ничего не получилось. Задача элементарная. Есть JSON, нужно при помощи jq оставить в нем только нужные поля. Всё.

Например, дано

{data:[{k1:v1,k2:v2,k3:v3},{k1:v1,k2:v2,k3:v3},{k1:v1,k2:v2,k3:v3}]}

требуется получить ‘{data:[{k2:v2,k3:v3},{k2:v2,k3:v3},{k2:v2,k3:v3}]}’

т.е. оставить только поля k2 и k3 в полном виде, а не только значения.

При этом, нежелательно использовать фильтр del, т.к. удаляемых полей много больше, чем оставляемых и их имена длинные и неудобоваримые. Лениво их перечислять. В документации этот случай обходится стороной.

 

MariaRTI
()

Как правильно создать доверенный самоподписанный SSL-сертификат для Web-ресурса

Переадресую тему с Как исправить ошибку CORS?

Читать с конца, т.к. вначале обсуждается проблема с CORS, причина которой в проблеме с сертификатом.

Коротко повторю: По инструкции: https://coderoad.ru/34807073/%D0%9A%D0%B0%D0%BA-%D1%81%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D1%8B-cowboy-SSL

создал структуру подкаталогов в приложении, описанную в инструкции и все описанные сертификаты. В приложении (Erlang/OTP 23, https-сервер Cowboy), использую конечный сертификат из каталога end_cert, подключаю вот так

	  {cacertfile, PrivDir ++ "/ssl/end_cert/end.csr"},
	  {certfile, PrivDir ++ "/ssl/end_cert/end.crt"},
	  {keyfile, PrivDir ++ "/ssl/end_cert/end.key"}

полный код функции

%% API.
start(_Type, _Args) ->
	Dispatch = cowboy_router:compile([
		{'_', [
			{"/"            , cowboy_static, {priv_file, upserver, "index.html"}},
			{"/assets/[...]", cowboy_static, 
{priv_dir , upserver, "assets"}},
			{"/upload"      , upload_handler, []}
		]}
	]),
	PrivDir = code:priv_dir(upserver),
	{ok, _} = cowboy:start_tls(https, [
	     	  {port, 8888},
		  {cacertfile, PrivDir ++ "/ssl/end_cert/end.csr"},
		  {certfile, PrivDir ++ "/ssl/end_cert/end.crt"},
		  {keyfile, PrivDir ++ "/ssl/end_cert/end.key"}
		], #{env => #{dispatch => Dispatch}}),
	upserver_sup:start_link().

в каталоге …/priv/ssl/ созданы 3 подкаталога, по вышеупомянутой инструкции. Вот, все файлы

$ ls . -R
.:
end_cert  inter_ca  root_ca

./end_cert:
end.crt  end.csr  end.key

./inter_ca:
inter.crt  inter.csr  inter.key  inter.srl  v3x509extensions.txt

./root_ca:
180d30a1.0  rootca.key  rootca.pem  rootca.srl

При предварительной верификации сертификата, находясь в каталоге ssl

openssl s_client -servername upserver:8888 -connect upserver:8888 -CApath root_ca -verify 5

получаю ошибку

verify depth is 5
CONNECTED(00000003)
depth=0 C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com
   i:C = RU, ST = State, L = City, O = Company, OU = Department, CN = inter.upserver, emailAddress = support@firma.com
---
Server certificate
-----BEGIN CERTIFICATE-----
... удалено
opV7k19LRNPAKksKqg==
-----END CERTIFICATE-----
subject=C = RU, ST = State, L = City, O = Company, OU = Department, CN = upserver, emailAddress = support@firma.com

issuer=C = RU, ST = State, L = City, O = Company, OU = Department, CN = inter.upserver, emailAddress = support@firma.com

---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1481 bytes and written 385 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
read:errno=0

Проблемы следующие:

  1. Почему CONNECTED(00000003), должно быть CONNECTED(00000004) ?
  2. Почему везде depth=0, когда должно быть 2,1,0 ?
  3. Почему получаются только 2 уровня, а не три ?
  4. Почему на каждом уровне получаю ошибки ?
verify error:num=20:unable to get local issuer certificate
verify error:num=21:unable to verify the first certificate
No client certificate CA names sent

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

Смотрите также другие выхлопы в исходном посте.

Как всё это исправить?

 , , ,

MariaRTI
()

Как исправить ошибку CORS?

В локальной сети между машинами, а также на одной машине в режиме отладки, делаю POST запросы XMLHttpRequest для выгрузки файла на второй сервер.

Со страницы https://xxx (, где ключи и сертификат самоподписанные (уровня 1). Тестовый сервер Nginx, в продакшене будет другой, но там такие же ошибки.)

на сервер https://upserver:8888 (, где ключи и сертификаты самоподписанные (уровня 2, с использованием собственного центра сертификации, корневых, промежуточных и конечных сертификатов) На порту 8888 работает Cowboy (Erlang/OTP v.23). Код с заголовками показан ниже.) Пока, там нет авторизации, а кросс-доменные запросы разрешены для всех (*).

Оба домена прописаны в hosts. В продакшене будут прописаны в DNS. Разрешения CORS установлены на обоих серверах, код показан ниже.

При первом открытии index.html на обоих серверах в браузере Chrome получаю ошибку сертификата, но после разрешения ресурса, страница открывается и далее работает. Хотелось бы чтобы она открывалась без этой ошибки и необходимости разрешения.

При загрузке файла на второй сервер в логе браузера (вкладка console) получаю следующие ошибки

Access to XMLHttpRequest at 'https://upserver:8888/upload' from origin 'https://xxx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

upload.js:73 onreadystatechange Error 0 occurred when trying to upload your file.

upload.js:78 POST https://upserver:8888/upload net::ERR_FAILED
fileUpload @ upload.js:78
(anonymous) @ upload.js:103

upload.js:78 XHR failed loading: POST "https://upserver:8888/upload".
fileUpload @ upload.js:78
(anonymous) @ upload.js:103

Но файл успешно загружается на сервер. Не могу понять, что ему еще надо, и как исправить эту CORS ошибку?

Код заголовков на upserver:8888

options(Req, Opts) ->
    Req1 = cowboy_req:set_resp_header(<<"access-control-allow-methods">>, <<"HEAD, OPTIONS, GET, PUT, POST">>, Req),
    Req2 = cowboy_req:set_resp_header(<<"access-control-allow-headers">>, <<"Origin, X-Requested-With, Content-Type, 
    Accept, x-client-key, x-client-token, x-client-secret">>, Req1),
    Req3 = cowboy_req:set_resp_header(<<"access-control-allow-origin">>, <<$*>>, Req2),
    {ok, Req3, Opts}.

init(Req, Opts) ->
    case cowboy_req:method(Req) of
        <<"POST">> ->
	   {ok, Req1, Opts1} = options(Req, Opts),
           {ok, Headers, Req2} = cowboy_req:read_part(Req1),
    	   {ok, Data, Req3} = cowboy_req:read_part_body(Req2),
    	   {file, <<"upfile">>, Filename, ContentType} = cow_multipart:form_data(Headers),
    	   io:format("Received file ~p of content-type ~p as follow:~n~p~n~n", [Filename, ContentType, Data]),
    	   Filepath = filename:join([code:priv_dir("upserver"), "upload", Filename]),
    	   file:write_file(Filepath, Data),
    	   {ok, Req3, Opts1};
        _ ->
    	   io:format("Method=~p~n",[cowboy_req:method(Req)]),
	   options(Req, Opts)
    end.

Код запроса на клиенте

function fileUpload(blob){
    var filename="test.png";
    var file=new File([blob],filename,{type:"image/png"});
    var formData = new FormData();
    formData.append('upfile', file, filename);
    const xhr = new XMLHttpRequest();
    xhr.fileinfo = {'filename': filename};
    xhr.enctype = "multipart/form-data";
    xhr.overrideMimeType('multipart/form-data');

// эта функция работает без ошибок и сообщений
    xhr.open("POST", "https://upserver:8888/upload", true);

// Это не помогло, бесполезно, поэтому закоментировано
// xhr.setRequestHeader("Access-Control-Allow-Origin","https://upserver:8888");
// xhr.setRequestHeader("Access-Control-Request-Header","X-Requested-With");


// Это сообщение показано в логе, смотрите лог, Error = xhr.status = 0, вместо 200
    xhr.onreadystatechange = function() {
	if (xhr.status == 200) {
	    console.log("onreadystatechange Uploaded!");
	} else {
	    console.log("onreadystatechange Error " + xhr.status + " occurred when trying to upload your file.");
	}
    };

// здесь выдается сообщение об ошибке CORS
    xhr.send(formData);

// В результате, formData успешно передается и правильно сохраняется на сервере, несмотря на все эти ошибки!

}

На стороне первого сервера https://xxx в конфигурации сайта под Nginx прописана следующая конфигурация

server {
        listen 443 ssl;
        listen [::]:443 ssl;
configuration.
        root /var/www/https;
        index index.html index.htm index.nginx-debian.html;

        server_name xxx;
        ssl_certificate /etc/nginx/xxx-list.crt;
        ssl_certificate_key /etc/nginx/xxx.key;
location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' 'https://yyy:8888';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' 'https://upserver:8888';
#        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*';
#        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
     }
     try_files $uri $uri/ =404;
}
Видно, что кросс-доменные запросы разрешены для второго сервера upserver:8888

Вроде бы, везде всё настроено белее менее правильно, но ошибки мне очень не нравятся. Хотелось бы разобраться, что не так, и избавиться от ошибок.

 , , , ,

MariaRTI
()

Возможно ли ручное Gzip сжатие Web-контента - html, js, css?

Сделал морду и приложение для embeded linux сервера. Отлаживаюсь на писишке, под nginx. В целях минимизации данных и снижения нагрузки на целевой сервер решил сжать gzip-ом вручную, а не через опции httpd сервера. Однако, страницы не распаковываются - выводится код архива. Если без ручного сжатия, но со включенным встроенным сжатием, сайт работает. Возможно ли решить данную проблему?

 , , ,

MariaRTI
()

Как отследить горячие и холодные перезагрузки?

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

Какие варианты существуют?

MB Intel Xeon E5 / Ubuntu 16.04.3

Дополнительные условия - дисков нет, но есть флэшка, одна и та-же флэшка используется на разных компьютерах по очереди с периодом от 1h до 1d, BMC ip=0.0.0.0, система в обоих случаях заново загружается в память с PXE сервера с потерей всех предыдущих данных, холодные перезагрузки считаются нормой, горячие - критической проблемой.

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

Вероятно, в BMC должна быть такая информация, можно было бы соединить коротким патчкордом один из хост-интерфейсов с BMC, но IP-адрес BMC неопределённый, по умолчанию 0.0.0.0. Переустановить IP нет возможности по условиям задачи.

Локального способа получения информации из BMC я не знаю.

Возможно, нужную информацию можно вытянуть из БИОС ?

Может быть в операционной системе уже есть такой счетчик?

 

MariaRTI
()

Как запретить Ubuntu обновлять версии пакетов при операциях apt?

Беда короче. Как запретить убунте апгрейдить версии пакетов и загрузочных файлов при операциях apt, mkinitramfs ?

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

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

Какую траву курят разработчики Убунту!? Ни одной нормальной версии не смог подобрать (от 14.04.0 до 18.*).

Две условно годных есть 14.04.5-31 и 16.04.3-87

Но у первой хромая сеть, не работающая в pxe, а у второй и у всех прочих некорректные размеры файлов в initrd.

А также у всех остальных изменен способ упаковки initrd и как с ним теперь работать не ясно.

Стоит что-то мелкое изменить и система переходит с этих условно-годных версий на новые, но негодные.

 , ,

MariaRTI
()

Не инициализируются устройства при сетевой загрузке Ubuntu ... initrd.img

Сетевую загрузку пилил следующим диким способом. Извиняюсь за длинный текст, но так будет ближе к делу. Если нужна дополнительная информация, спрашивайте.

Если есть совсем другой способ, буду благодарен за подробную инструкцию. Однако, пробовал через debootstrap и chroot на i386 системе - не получилось.

В итоге запилил следующее.

0) Клиентская бездисковая машина - сервер на базе Intel Xeon E5

1) Установил минимальный Ubuntu 14.04.5 LTS Server amd64 с загрузочной флэшки и репозитория в интернете. Затем настроил свои скрипты и прикладной софт. Проверил - работает, идет мониторинг этой машины на удаленном zabbix-сервере.

2) Отредактировал /etc/initramfs-tools/initramfs.conf

BOOT=ram

3) Добавил скрипт ram, как рекомендовано здесь но с изменениями, подробно описанными здесь там поэтапно описаны мемуары моей борьбы, есть вопросы но нет ответов

4) На работающей системе создал initrd.img для сетевой загрузки

mkinitramfs -o /home/user1/initrd.img

5) Выключил клиентскую машину, отсоединил диск, примонтировал на рабочей машине, почистил ненужное и упаковал целиком, вместе с директорией boot.

find . -print0 | cpio --null -ov --format=newc | gzip -9 > /путь с архиву/rootfs.cpio.gz
6) Скопировал всё на третью машинуу в каталог /../../tftpboot - это PXE-сервер на базе старой писишки. Забегая вперёд, поскольку родное ядро категорически не хотело грузиться, заимствовал ядро linux из сетевой сборки netboot.tar.gz. Остальное не знаю как применить, не пригодилось.

Получилось следующее

/../../tftpboot/
pxelinux.cfg/
             default
initrd.img
linux
pxelinux.0
rootfs.cpio.gz

файл default настроен так

timeout 0
default default
label default
    kernel linux
    append initrd=initrd.img boot=ram rooturl=ftp://10.0.1.1/rootfs.cpio.gz
7) Настроил DHCP и TFTP на основе dnsmasq

8) Включаю целевую бездисковую машину,

стартует получение IP по DHCP, получен IP, загружены pxelinux.0 linux initrd.img стартовал скрипт ram но остановился на строке configure_networking, с ошибкой

ipconfig: no devices to confugure
/init: .: line 222: can't open 'run/net-*.conf'
Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000200
...

содержимое этого скрипта-ram с отладочным кодом и неудачными попытками

retry_nr=0

do_rammount()
{

log_begin_msg "configure_networking"

# Вешается внутри этой функции
    configure_networking

    E=$?
    #if [ $E ]; then
	log_begin_msg "ERROR=$E"
    #fi
log_end_msg

    /bin/sleep 30

log_begin_msg "mkdir -p /tmp/rootfs"
    mkdir -p /tmp/rootfs
log_end_msg

    cd /tmp/rootfs
      IP=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\1/'`
    FILE=`echo "${rooturl}"|sed -e 's/^[^0-9.]*\([0-9.]*\)\/\(.*\)$/\2/'`
#Это осталось от попыток качать образ tftp и ftp клиентами, которых не нашлось. Но до закачки всё равно пока не доходит из-за отсутствия устройств.

log_begin_msg "wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE"
    wget ftp://$IP:69/$FILE -O /tmp/rootfs/$FILE
log_end_msg

#log_begin_msg "echo get "$FILE"|ftp "$IP
#    echo "get $FILE"|ftp $IP
#log_end_msg

log_begin_msg "mkdir -p ${rootmnt}"
    mkdir -p ${rootmnt}
log_end_msg

log_begin_msg "mount -t tmpfs -o size=6G none ${rootmnt}"
    mount -t tmpfs -o size=6G none ${rootmnt}
log_end_msg

log_begin_msg "gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -idm -"
    cd ${rootmnt}
    gzip -dc /tmp/rootfs/rootfs.cpio.gz|cpio -im -
log_end_msg
}

# Это основная функция
mountroot(){

log_begin_msg "for x in $(cat /proc/cmdline); do"
    for x in $(cat /proc/cmdline); do
	case $x in
	rooturl=*)
		export rooturl=${x#rooturl=}
		;;
	esac
    done
log_end_msg

    /bin/sleep 10

# Это я добавил просто так, т.к. ничего не получалось
log_begin_msg "load_modules"
    load_modules
log_end_msg

    /bin/sleep 10

log_begin_msg "wait_for_udev 10"
    wait_for_udev 30
log_end_msg

    /bin/sleep 10

log_begin_msg "delay=${ROOTDELAY:-180}"
    delay=${ROOTDELAY:-180}
log_end_msg

    /bin/sleep 10

# Этот блок не решает проблему. Устройств как не было , так и не появляются
log_begin_msg "modprobe af_packet;ifdown*;modprobe e1000e;ifup*"
    modprobe af_packet
    ifdown eth3;ifdown eth2;ifdown eth1;ifdown eth0
    #rmmod e1000e; modprobe -r e1000e;
    modprobe e1000e
    ifup eth0; ifup eth1; ifup eth2; ifup eth3
    ls /sys/class/net
log_end_msg

    /bin/sleep 10

# Это тоже добавлено просто так, может поможет, не помогло
log_begin_msg "resolve_device /dev/eth0"
    resolve_device /dev/eth0
log_end_msg

    /bin/sleep 10

log_begin_msg "do_rammount"
    # Досюда доходит, но далее оно повиснет
    do_rammount
log_end_msg

# Досюда и до цикла не доходит

    /bin/sleep 1

log_begin_msg "while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do"
    while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
	/bin/sleep 3
	log_begin_msg "do_rammount"
	    do_rammount
	log_end_msg
	retry_nr=$(( ${retry_nr} + 1 ))
    done
log_end_msg
}

 , ,

MariaRTI
()

Как извлечь исходную картинку из PDF без конвертации?

Сейчас я извлекаю картинки из PDF таким способом.

convert -density 432 $PDF_FILE -colorspace GRAY -depth 8 -background white -flatten +matte -resize 50 -normalize $PDF_TIFF

Фотошоп показывает по умолчанию 300dpi, но позволяет установить любое разрешение и размеры, так-что не понятно исходные они или нет. Однако, эксперименты показали, что мои параметры 432dpi = 72 * 6, дают лучший результат чем 300dpi и 600dpi. Что заставляет искать другое решение.

Попытка

convert $PDF_FILE $PDF_TIFF

даёт отвратительный результат 72 dpi, хотя качество исходной картинки намного выше.

Существует ли способ извлекать картинки неизвестного размера и разрешения в исходном качестве и без каких либо изменений?

Перемещено leave из development

 ,

MariaRTI
()

Как автоматически повернуть скан и вырезать текстовый блок?

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

Нужно в командной строке найти блок текста (один на всю страницу) автоматически повернуть на 0 - 0.1 - 1.5 градуса и вырезать его. Угол поворота и обрезку программа должна определить сама, на основе анализа изображения.

Существует ли готовый инструмент для этого?

Самому писать некогда. Или придется?

 , ,

MariaRTI
()

Как заменить/пометить все строки, которые НЕ соответствуют маске?

Например sed 's/^\(сложная маска\)$/#\1/' Пометит знаком # все строки, которые удовлетворяют маске.

А как пометить строки, которые не удовлетворяют маске?

Это нужно, чтобы в тексте(листинге записей с переносами) объединить каждую неполную строку записи, известной структуры, с её продолжением на следующей строке, т.е. вытянуть каждую запись в строку. Перенесенная часть записи может занимать несколько строк. Между разными записями может быть 1 или 2 переноса. Т.е. одинарный либо двойной перенос, как критерий, не годится. Единственный критерий объединения, это начальная структура записи. Она либо обнаруживается, либо нет.

Либо без пометки сразу выполнить требуемое действие.

 

MariaRTI
()

Как заставить Tesseract распознавать текст посимвольно, без словаря и повысить качество?

Добрый день. Нужно распознать текст с качественно сканированной книги (Каталога латинских названий), без искажений, RGB, преимущественно черно белый. Все знаки - латиница, но часто попадаются из немецкого, французского и испанского. Несколько шрифтов. Часто попадаются слова наклонным шрифтом, знаки в числах всегда на разной высоте, т.е. 069 - хвостики будут выше и ниже строки, такой стиль. Орфография преимущественно латынь, но почти все слова могут, по определению, не иметь никакого смысла, т.е. могут быть произвольным набором букв только подчиняющихся(и то не обязательно) правилам латинского языка. Т.е. заранее построить словарь всего массива текста нельзя. Целью распознавания является построение этого словаря. Объем большой, порядка 10000 страниц. Tesseract ошибается в первом же слове. Качество распознавания очень плохое. Очевидно, что он распознает не буква в букву, а ищет слова или сочетания букв по словарю по максимальной вероятности в заданном языке. Вместо правильного маловероятного «Aaages» пишет более благозвучное и более вероятное «Anages», хотя символы видны достаточно четко. Хотя национальные символы он распознает правильно. Предполагаю, что если частично отключить ему «мозги», то он бы правильнее распознавал.

1. Посоветуйте, как заставить его распознавать текст буквально, а не гадать по вероятностям? Как повысить качество распознавания? Загрузить пример затрудняюсь. Для сравнения, online FineReader распознает почти всё правильно, но дорого для меня.

2. Не получается сделать вывод в PDF-текст, получается PDF-исходное-изображение

 

MariaRTI
()

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