AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-178625

Shan-Desai's questions

Martin Hope
Shan-Desai
Asked: 2022-09-17 01:03:53 +0800 CST

syslinux bootloader incapaz de encontrar o initrd.img para uma imagem inicializável personalizada feita via Docker Containers

  • 0

Descrição

Como um projeto paralelo, estou tentando usar o Hashicorp Packer junto com o Docker para criar imagens de disco inicializáveis ​​a partir de contêineres do Docker.

Hashicorp Packer geralmente assume a responsabilidade de trazer os containers docker para cima e executar tarefas dentro deles e então criar tarballs do sistema de arquivos ou usar containers para criar arquivos de imagem etc.

Como funciona

  1. Eu uso um ubuntu:focalcontêiner docker

  2. use este contêiner docker e instale um Kernel / Systemd nele:

     apt-get update && apt-get install -y --no-install-recommends linux-image-virtual systemd-sysv
    
  3. Crie um tarball do contêiner que agora contém o kernel, initrd e sistema da etapa 2

  4. descompacte o tarball na máquina host para poder usá-lo ao criar um arquivo de imagem

  5. Ative outro ubuntucontêiner com privilégios e monte o diretório de trabalho nele para criar o arquivo de imagem inicializável.

Neste ponto, estou contando com um script bash abaixo para criar uma imagem para mim:

set -e
echo "[Install APT dependencies]"
DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y extlinux fdisk qemu-utils

echo "[Create disk image of 1GB]"
dd if=/dev/zero of=/os/${DISTR}.img bs=$(expr 1024 \* 1024 \* 1024) count=1

blue "[Make partition]"
sfdisk /os/${DISTR}.img < /os/config/partition.txt

echo "\n[Format partition with ext4]"
losetup -D
LOOPDEVICE=$(losetup -f)
echo -e "\n[Using ${LOOPDEVICE} loop device]"
losetup -o $(expr 512 \* 2048) ${LOOPDEVICE} /os/${DISTR}.img
mkfs.ext4 ${LOOPDEVICE}

echo "[Copy ${DISTR} directory structure to partition]"
mkdir -p /os/mnt
mount -t auto ${LOOPDEVICE} /os/mnt/
cp -R /os/${DISTR}.dir/. /os/mnt/


echo "[Setup extlinux]"
extlinux --install /os/mnt/boot/
cp /os/config/syslinux.cfg /os/mnt/boot/syslinux.cfg

echo "[Unmount]"
umount /os/mnt
losetup -D

echo_blue "[Write syslinux MBR]"
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/os/${DISTR}.img bs=440 count=1 conv=notrunc

O DISTRno script acima é ubuntue o ubuntu.diré o tarball descompactado que é montado no contêiner para poder copiá-lo para a partição montada.

Progresso

Atualmente tenho tido sucesso na criação de tais imagens para ubuntu. O repositório criado pode ser encontrado aqui

No entanto, ao tentar inicializar a imagem usando qemu-system-x86_64:

sudo qemu-system-x86_64 -drive file=ubuntu.img,index=0,media=disk,format=raw 

Estou tendo o erro a seguir: Erro de inicialização 1

O respectivo syslinux.cfgpara o bootloader é:

DEFAULT linux
  SAY Now booting the kernel from SYSLINUX...
 LABEL linux
  KERNEL /boot/vmlinuz
  INITRD /boot/initrd.img-5.4.0-125-generic
  APPEND ro root=/dev/sda1

Alterações adicionais

Eu tentei atualizar o syslinux.cfgpara

DEFAULT linux
  SAY Now booting the kernel from SYSLINUX...
 LABEL linux
  KERNEL /boot/vmlinuz
  APPEND ro root=/dev/sda1 initrd=/boot/initrd.img

no entanto recebo o mesmo erro, embora /boot/initrd.imgnão seja encontrado é a mensagem de erro.

O que estou faltando no momento para tornar o initrd.imgdetectável para o bootloader.

Eu tentei usar cp -dR /os/ubuntu.dir/. /os/mnto script bash para garantir que os links simbólicos sejam preservados durante a cópia.

Eu também me certifiquei de ver se o initrd.imgarquivo de link simbólico existe na partição montada /os/mnt/bootque existe e também a fonte do arquivo de link simbólico, por exemploreadlink -f /os/mnt/boot/initrd.img

Fontes

iximiuz blogpost em dispositivos docker-to-bootable PockerISO

docker boot-loader
  • 1 respostas
  • 14 Views
Martin Hope
Shan-Desai
Asked: 2022-07-01 06:17:47 +0800 CST

jq substitui a chave exclusiva em vez de adicionar ao objeto JSON no arquivo

  • 0

Arquivo JSON

Atual

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    }
  }
}

Desejado

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    },
    "myrepo.com" {
      "auth": "passworder"
    }
  }
}

Testes

Como um teste simples na linha de comando, executo o seguinte:

 cat .docker/config.json | jq '.auths += {"myrepo.com": {"auth": "passworder"}}'

o resultado é o que eu desejo

{
  "auths": {
    "test": {
      "auth": "testserfdddd"
    },
    "repo.com": {
      "auth": "test"
    }
  }
}

No entanto, desejo executar a mesma lógica através de um script bash.

Script Bash

REPO=repo.com
PASSWD=passworder

$JQ --arg repo "$REPO" --arg passwd "$PASSWD" '.auths.[$repo] += {"auth": $passwd}' .docker/config.json

No entanto, isso substitui o test.authe repo.com.authnão adiciona à authschave

o resultado ao executar o script bash fornece o seguinte resultado

{
  "auths": {
    "repo.com": {
      "auth": "passworder
    }
  }
}

o objeto anterior é completamente sobrescrito. Qual é geralmente o padrão que eu preciso adaptar aqui na jqexpressão? Como o argumento repoé exclusivo ( testnão é o mesmo que repo.com), por que a +=operação não está funcionando no script bash?

jq
  • 2 respostas
  • 96 Views
Martin Hope
Shan-Desai
Asked: 2022-06-07 06:09:24 +0800 CST

bash não reconhece se as condições dentro de um loop for para cada elemento de uma matriz de strings

  • 3

Meta

Estou usando whiptailpara permitir que o usuário insira senhas em arquivos que são usados ​​em conjunto com envsubstalguns arquivos de modelo.

whiptaillista de controle

para renderizar coisas whiptaileu uso o seguinte:

declare -A availableServices=(
    [grafana]="Grafana Dashboard"
    [influxdb]="InfluxDB v1.x TSDB"
    [node-red]="Node-RED Flow UI"
    [portainer]="Portainer Container Mgmt"
)

# Render TUI
function askGenerateCredential() {
    local message="Set Password for particular Service\n
                Press <SPACEBAR> to Select \n
                Press <Enter> to Skip
                "
    local arglist=()
    
    # Generate a String for Whiptail Checkboxes
     # FORMAT: "<INDEX> <DESCRIPTION> <OFF>"
    for index in "${!availableServices[@]}";
    do
        # Default all Services are NOT-Selected (OFF)
        arglist+=("$index" "${availableServices[$index]}" "OFF")
    done
    SELECTED_SERVICES+=$($WHIPTAIL --title "Available Services within Populo" \
                --notags --separate-output \
                --ok-button Next \
                --nocancel \
                --checklist "$message" $LINES $COLUMNS $(( LINES - 12 )) \
                -- "${arglist[@]}" \
                3>&1 1>&2 2>&3)
}

o SELECTED_SERVICESé um array declarado como

declare -a SELECTED_SERVICES=()

A renderização funciona bem, porém tenho uma if elsecondição específica no meu script que não consegue executar comandos específicos com base no serviço selecionado no array acima.

askGenerateCredential
if [ -z "$SELECTED_SERVICES" ]; then
    echo "No Services were selected. Exiting..."
    exit 1
else
    for service in "${SELECTED_SERVICES}";
    do
        if [ "$service" == "influxdb" ]; then
            echo "Setting Credentials for InfluxDB"
            setInfluxDBCredentials
        elif [ "$service" == "grafana" ]; then
            echo "Setting Credentials for Grafana"
            setGrafanaCredentials
        elif [ "$service" == "node-red" ]; then
            echo "Setting Credentials for node-RED"
            setNodeRedCredentials
        elif [ "$service" == "portainer" ]; then
            echo "Setting Credential for Portainer"
            setPortainerCredentials
        fi
    done
fi

Ao adicionar o bloco acima, meu script sai com 0código quando seleciono vários valores por meio da whiptailinterface do usuário. Pelo contrário, quando seleciono apenas um valor na interface do usuário, a respectiva função é chamada.

O que eu estou fazendo errado aqui? Desejo que dependendo da servicevariável, a respectiva função seja chamada e não saia do script.

Código

#!/bin/env bash

WHIPTAIL=$(which whiptail)

if [ -z $WHIPTAIL ]
then
    echo "This script requires whiptail to render the TUI."
    exit 1
fi

declare -a SELECTED_SERVICES=()

LINES=$(tput lines)
COLUMNS=$(tput cols)


declare -A availableServices=(
    [grafana]="Grafana Dashboard"
    [influxdb]="InfluxDB v1.x TSDB"
    [node-red]="Node-RED Flow UI"
    [portainer]="Portainer Container Mgmt"
)

function askGenerateCredential() {
    local message="Set Password for particular Service\n
                Press <SPACEBAR> to Select \n
                Press <Enter> to Skip
                "
    local arglist=()
    
    # Generate a String for Whiptail Checkboxes
     # FORMAT: "<INDEX> <DESCRIPTION> <OFF>"
    for index in "${!availableServices[@]}";
    do
        # Default all Services are NOT-Selected (OFF)
        arglist+=("$index" "${availableServices[$index]}" "OFF")
    done
    SELECTED_SERVICES+=$($WHIPTAIL --title "Available Services within Populo" \
                --notags --separate-output \
                --ok-button Next \
                --nocancel \
                --checklist "$message" $LINES $COLUMNS $(( LINES - 12 )) \
                -- "${arglist[@]}" \
                3>&1 1>&2 2>&3)
}

function setInfluxDBCredential() {
    echo "set admin password env var for influxdb"
}

function setGrafanaCredential() {
    echo "set admin password env var for grafana"
}

function setNodeRedCredential() {
    echo "set admin password env var for node-REd"
}

function setPortainerCredential() {
    echo "set password file for portainer"
}

askGenerateCredential
if [ -z "$SELECTED_SERVICES" ]; then
    echo "No Services were selected. Exiting..."
    exit 1
else
    for service in "${SELECTED_SERVICES}";
    do
        if [ "$service" == "influxdb" ]; then
            echo "Setting Credentials for InfluxDB"
            setInfluxDBCredentials
        elif [ "$service" == "grafana" ]; then
            echo "Setting Credentials for Grafana"
            setGrafanaCredentials
        elif [ "$service" == "node-red" ]; then
            echo "Setting Credentials for node-RED"
            setNodeRedCredentials
        elif [ "$service" == "portainer" ]; then
            echo "Setting Credential for Portainer"
            setPortainerCredentials
        fi
    done
fi

EDITAR

Por sugestão, tentei ${SELECTED_SERVICES[@]}no loop for e adicionei um echo "$service"que é capaz de percorrer a matriz, mas as ifcondições não são acionadas.

bash shell-script
  • 1 respostas
  • 200 Views
Martin Hope
Shan-Desai
Asked: 2018-05-18 04:56:40 +0800 CST

O serviço systemd não aciona o comando tmux na reinicialização

  • 2

Estou usando uma imagem Yocto baseada no linux-mainlinekernel. que tenho systemdno sistema operacional incorporado que criei.

Mirar

Tenho um dongle UMTS conectado à placa que servirá usb_modeswitchpara reconhecer o dongle e wvdialse conectar à infra-estrutura 3G.

Método

Eu escrevi um script bash simples da /usr/umts.shseguinte forma

#!/bin/bash

sleep 1;
usb_modeswitch --default-vendor 12d1 --default-product 1446 -J

sleep 1;
/usr/bin/tmux new-session -d -s Cloud
/usr/bin/tmux set-option set-remain-on-exit on
/usr/bin/tmux new-window -d -n 'wvdial' -t Cloud:1 'sleep 1; /usr/bin/wvdialconf; /usr/bin/wvdial';

usb_modeswitchconfigurará o Dongle USB e a próxima parte criará uma tmuxsessão e acionará wvdialdentro.

meu systemdscript se parece com o seguinte em/etc/systemd/system/enable-umts.service

Arquivo GNU nano 2.2.5: /etc/systemd/system/enable-umts.service

[Unit]
Description=Enable UMTS Dongle for Cloud Connectivity

[Service]
Type=oneshot
ExecStart=/usr/umts.sh

[Install]
WantedBy=default.target

(Eu dei direitos de execução ao script usando chmod +x /usr/umts.sh)

Eu recarreguei o daemon systemctl daemon-reloade habilitei o serviçosystemctl enable enable-umts.service

e reiniciei a placa (OBS: só tenho rooton board e mais nenhuma user)

O dmesgfato aciona o usb_modeswitchdo script acima e vejo mensagens relacionadas

[  OK  ] Started Enable UMTS Dongle for Cloud Connectivity.
[   13.051247] scsi host2: usb-storage 1-1:1.5
[   13.067326] usb-storage 1-1:1.6: USB Mass Storage device detected
[   13.074645] scsi host3: usb-storage 1-1:1.6
[   13.158627] usbcore: registered new interface driver usbserial
[   13.165501] usbcore: registered new interface driver usbserial_generic
[   13.174754] usbserial: USB Serial support registered for generic
[   13.202356] usbcore: registered new interface driver option
[   13.208714] usbserial: USB Serial support registered for GSM modem (1-port)
[   13.216468] option 1-1:1.0: GSM modem (1-port) converter detected
[   13.229840] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   13.238774] option 1-1:1.3: GSM modem (1-port) converter detected
[   13.248906] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   13.256172] option 1-1:1.4: GSM modem (1-port) converter detected
[   13.264467] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[   14.069960] scsi 2:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
[   14.088684] scsi 3:0:0:0: Direct-Access     HUAWEI   TF CARD Storage       PQ: 0 ANSI: 2
[   14.127686] sd 3:0:0:0: [sda] Attached SCSI removable disk
GSM modem (1-port) converter detected
] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   13.238774] option 1-1:1.3: GSM modem (1-port) converter detected
[   13.248906] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   13.256172] option 1-1:1.4: GSM modem (1-port) coPassword

Mas, ao fazer o login, tento listar as sessões tmux lse informa que não há sessões criadas.

O `script de fato não falha e o status do serviço é o seguinte:

● enable-umts.service - Enable UMTS Dongle for Cloud Connectivity
   Loaded: loaded (/etc/systemd/system/enable-umts.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2018-05-17 12:52:10 UTC; 4min 51s ago
  Process: 214 ExecStart=/usr/umts.sh (code=exited, status=0/SUCCESS)
 Main PID: 214 (code=exited, status=0/SUCCESS)

May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: Set up interface 0
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: Use endpoint 0x01 for message sending ...
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: Trying to send message 1 to endpoint 0x01 ...
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]:  OK, message successfully sent
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: Reset response endpoint 0x81
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: Reset message endpoint 0x01
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]:  Could not reset endpoint (probably harmless): -99
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]:  Device is gone, skip any further commands
May 17 12:52:09 phyboard-mira-imx6-3 umts.sh[214]: -> Run lsusb to note any changes. Bye!
May 17 12:52:10 phyboard-mira-imx6-3 systemd[1]: Started Enable UMTS Dongle for Cloud Connectivity.

Se executar o script /usr/umts.shcomo um script autônomo, na verdade, ele fará tudo o que deve fazer (abra uma nova tmuxsessão e acione wvdial)

O que há de errado aqui? Tentei adicionar mais sleeptempo, mas também não está funcionando. Infelizmente, não há rc.localou cronestá disponível para a imagem yocto na qual estou trabalhando.

bash systemd
  • 1 respostas
  • 1681 Views
Martin Hope
Shan-Desai
Asked: 2018-04-28 08:44:21 +0800 CST

solução de problemas de configurações seriais por meio de stty

  • 2

hardware

Placa PHYTEC Mira com processador i.MX6

Sistema operacional

Imagem Yocto criada usando o BSP fornecido pela PHYTEC Source com pacotes mínimos.

A placa possui uma placa UART chamada UART3 e sua interface de software dentro do SO é /dev/ttymxc2 Hardware Manual . A única coisa disponível para verificar/definir a porta serial integrada é stty.

Tarefa

Desejo fazer a interface de um GPS Adafruit Ultimate com o UART3 para ler as informações dele no Mira Board.

Tentativa-1

Conectei os dois componentes da seguinte maneira.

UART3_RXD_RS232 (MIRA) --> TX pin (GPS)
UART3_TXD_RS232 (MIRA) --> RX pin (GPS)

Defina a porta serial da seguinte maneira:

 stty -F /dev/ttymxc2 speed 9600

Valor de leitura:

 cat /dev/ttymxc2

Resultado : Valores lixo. Tentei todas as configurações possíveis e ainda obtive valores de lixo. Escrevi um script simples nodepara tentar ler as informações vindas da porta, mas recebi um erro informando que os caracteres (valores lixo) não são reconhecidos.

Tentativa-2

Inicialmente tentei conectar o GPS a um simples Arduino Nano para obter os valores do GPS e funcionou, confirmando que o GPS envia informações e não ocorreu nenhum defeito.

Eu conecto as portas seriais do Mira e do Arduino e tento enviar as informações do Mira para a interface serial do Arduino e leio através do console serial.

configurar

   MIRA_Board (serial UART3) ---> Arduino Nano (Serial Pins) --USBCable--> Computer

alfinetes

 UART3_RXD_RS232 (MIRA) --> RX PIN NANO
 UART3_TXD_RS232 (MIRA) --> TX PIN NANO

Estou logado no quadro Mira através do SSH. O seguinte comando é acionado, esperando esperar o mesmo valor no console serial do computador através do Arduino

 echo 'hello' > /dev/ttymxc2

Resultado : ainda valores de lixo no console. Resultado na Massa

A configuração para /dev/ttymxc2é como

stty -F /dev/ttymxc2 -a                       
speed 9600 baud;stty: /dev/ttymxc2 line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;   -parenb -parodd cs8 hupcl -cstopb cread clocal –crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8  
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0   
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Se esse problema for devido à incompatibilidade da configuração serial, como soluciono o problema usando stty?

PS : Baud rate para GPS deve ser 9600o que é o caso

yocto stty
  • 1 respostas
  • 1068 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve