Compilar seu software para rodar em quase qualquer lugar, sem nunca usar o root

Bem … nem sempre , acho que se voc√™ ainda usou solu√ß√Ķes de hospedagem compartilhada com provedores que oferecem apenas uma conta FTP para trabalhar – isso n√£o √© para voc√™. Esta dica profissional compartilha as informa√ß√Ķes que permitir√£o a algu√©m, em particular aquelas configura√ß√Ķes sem raiz que requerem tal abordagem, usar GNU autotools dentro da pasta pessoal do usu√°rio e reconstruir sua pr√≥pria /usrhierarquia local de bibliotecas de software para usar, como possivelmente ter outro software depende e √© constru√≠do. Em particular, qualquer pessoa atualmente usando, LD_LIBRARY_PATHpor exemplo, ~/.bashrcou ~/.zshrcpode se beneficiar desta dica profissional. J√° que n√£o assumimos nenhum acesso root, acho que n√£o tenho que avisar / aconselhar contra a compila√ß√£o de pacotes do c√≥digo-fonte como root (NUNCA, NUNCA, FA√áA, ISSO).

P√ļblico

Ou o “para quem √© isso?”. Bem, vamos ver se consigo imaginar um bom perfil de quem pode se beneficiar com essa dica profissional. Voc√™ pode j√° estar procurando por algo nesta ordem, mas provavelmente n√£o sabe o que procurar. Vamos ver. Voc√™ tem horas de combate no ambiente do terminal de linha de comando * nix e, na verdade, tem um ou mais ambientes nos quais voc√™ trabalha, acesso n√£o-root mais ou menos ‘n√£o supervisionado’ por meio de uma conex√£o SSH. Voc√™ n√£o tem acesso normal ao gerenciador de pacotes Debian ou RPM / Yum (provavelmente sem os comandos por completo) e n√£o pode escrever em /usrou /usr/local. Voc√™ ainda deseja executar seu pr√≥prio software personalizado, como faz√™-lo?

Um exemplo de caso de uso do mundo real

Provedores de hospedagem, como nosso provedor de hospedagem dedicada Magento, podem oferecer acesso n√£o-root ‘n√£o gerenciado’ a ambientes presos / protegidos e redes corporativas. Portanto, no caso de nosso host Magento, eles rodam o parque de servidores web (Apache / nginx) e banco de dados (escravos MySQL / MariaDb) que s√£o otimizados para hospedagem Magento e, no caso de banco de dados n√£o sem import√Ęncia, a manuten√ß√£o de freq√ľentes ajustes de toda a coisa. Mas o acesso para os usu√°rios √© limitado a um painel de controle baseado na web que controla as coisas que voc√™ pode ajustar sozinho. Isso tem um SLA e garante um certo tempo de atividade e tempo de recupera√ß√£o de, erh, na maioria desenvolvedores Magento inexperientes, eu acho – e voc√™ estragou muito no in√≠cio, eu prometo – mas a m√°quina shell (presa, compartilhada por 10 contas) obviamente n√£o tem SLA. Qual √© bom,qualquer coisa que possamos gerenciar sem realmente quebrar ou quebrar os sistemas de seguran√ßa (se voc√™ for essa elite, bom para voc√™), mas sem SLA significa apenas sem suporte (como trein√°-los no suporte de opera√ß√Ķes de linha de comando? n√£o √© realmente poss√≠vel cobrir todo o terreno ) De qualquer forma, o principal motivo que eles d√£o a voc√™ √© um lugar de 6 GB para hospedar os arquivos Magento de possivelmente v√°rias pastas e m√≠dias duplicadas e … seu pr√≥prio armazenamento memcache. As restri√ß√Ķes se aplicam basicamente apenas √† leitura / vazamento de coisas que as outras 9 contas est√£o usando no meu caso.

aviso Legal

Uma palavra de advertência com antecedência. O proprietário da máquina pode tentar fazer isso, pode ter uma política de uso corporativa em vigor que o proíba de fazer isso. Certifique-se de que o que você está prestes a fazer, a compilação do software da fonte, é realmente permitido. Nada é mais fácil do que contrabandear um ou dois arquivos de texto, compile-os na máquina e de repente você terá uma ferramenta de cracking. Portanto, um bom administrador de sistema terá removido quaisquer compiladores ou impedido o acesso a eles por usuários regulares, após qualquer configuração de provisionamento ter sido feita (se for usado gcc, pode ser necessário durante a configuração de máquinas). Além disso, você deve sempre conhecer sua máquina , tanto o hardware quanto o software. Não serei responsabilizado (moral ou legalmente) por nenhuma máquina fraturada ou BOFH irritado portanto, aja com responsabilidade e não mantenha o dedo no gatilho se não tiver certeza absoluta de que deseja puxá-lo.

Linha de base

Neste exemplo, vou mostrar os comandos que usei para compilar o meu pr√≥prio zshno host do provedor, uma vez que o √ļnico sh oferecido (ba) deles aborrece o bazinga de mim. Sinto falta das fun√ß√Ķes familiares, o zle, zparseopts e outras coisas legais que v√£o com o funcionamento do melhor dos dois ( ).zsh > bash

$ uname -a
Linux ssh1 3.2.0-4-grsec-amd64 #1 SMP Debian 3.2.53-2grsec6 x86_64 GNU/Linux

Ok, então eu confirmei que estamos executando um grseckernel. Enquanto tentava compilar antes, zshdescobri que não tínhamos a ncursesbiblioteca instalada, então precisava obtê-la. Vamos baixar e descompactar estas fontes:

$ test -d ~/build || mkdir ~/build; cd $_
$ wget
-qO- http://sourceforge.net/projects/zsh/files/zsh/5.0.5/zsh-5.0.5.tar.gz/download | tar xzv
$ wget
-qO- http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz | tar xzv

Decidi mostrar alguns pequenos truques apenas para um b√īnus adicional, voc√™ pode ou n√£o querer investig√°-los se n√£o conhecer esses comandos.

A rotina normal (FALHA)

Normalmente, as ferramentas GNU autoconfe automakesoftware construído, e há muitos pacotes oferecidos dessa forma, permitirão que alguém faça, por exemplo, o seguinte para configurar, construir / compilar e instalar o software:

$ cd some-package-sources
$
./configure
$ make
&& make install

Se alguma biblioteca essencial (cabe√ßalhos) estiver faltando, voc√™ ser√° informado durante a etapa de configura√ß√£o ou durante a cria√ß√£o do software. Nesse caso, voc√™ precisa descobrir qual componente est√° faltando e esperar por uma √°rvore de depend√™ncia muito simples que se segue a partir dele ou ficar√° preso no inferno de depend√™ncias. Esta √© realmente a maioria dos gerenciadores de pacotes de merda como aptitudeetc. tentam lidar com o seu: detecte automaticamente os pacotes dependentes e instale-os primeiro antes do que depende deles (essa e outras condi√ß√Ķes at√īmicas / de corrida principalmente mais, bem, eles s√£o confort√°vel de usar – coisas arcaicas como essas ferramentas n√£o fazem com que muitas pessoas saibam como oper√°-las e, ent√£o, escrevam sobre isso)

De qualquer maneira, essa tentativa n√£o funcionar√° principalmente porque comandos inalterados (sem argumentos para, por exemplo) geralmente tentar√£o instalar software e, lembre-se, n√£o temos permiss√Ķes de grava√ß√£o para essa pasta. Algumas equipes de desenvolvimento, mais ativas, na verdade configuram para oferecer um melhor suporte pronto para as pastas grav√°veis ‚Äč‚Äčpelo usu√°rio, mas muitas vezes esse √© apenas o caso para a configura√ß√£o de um √ļnico usu√°rio ou um ambiente onde, talvez, uma equipe de desenvolvimento pudesse receber uma parte (por exemplo ) permiss√Ķes de grava√ß√£o de arquivos e pastas, mas muitos ainda n√£o o fazem../configure/usr/usr/localsetfacl/usr/local

Sempre h√° um local grav√°vel para n√≥s praticamente garantido: mas qualquer administrador de sistema que valha seu dinheiro n√£o permitir√° a execu√ß√£o de execut√°veis ‚Äč‚Äčcompilados neles. N√£o. Existe um lugar melhor para fazer isso, √© por isso que fizemos a pasta, n√£o s√≥ para baixar, mas tamb√©m para construir. Mas onde instalar?/tmp~/build

Instalando na casa do usu√°rio (AGAIN FAIL)

O fant√°stico $HOMEoferece o resultado. √Č um lugar que, se voc√™ tiver acesso ao terminal, pode confiar que ser√° total e verdadeiramente seu em todos os aspectos. √Č o lugar perfeito para configurar nossa hierarquia de sistema de arquivos ‘imitar’ de bibliotecas e pacotes ausentes. A pr√°tica comum fornece mais ou menos a localiza√ß√£o para n√≥s, mas isso n√£o √© obrigat√≥rio para a pasta, obviamente. Voc√™ poderia, mas provavelmente n√£o deveria, nomear os diret√≥rios de outra forma.

$ mkdir ~/local

Perfeito. Com isso no lugar, podemos adicionar nosso primeiro argumento ao script de configuração:

$ ./configure --prefix=$HOME/local

Muitas vezes, eu descobri, √© t√£o simples e muitos fontes compilar√£o muito bem dessa maneira. No entanto, se voc√™ precisar de bibliotecas din√Ęmicas compiladas personalizadas para vincular (como eu fa√ßo com ncurses), voc√™ ter√° problemas.

Uma maneira que tradicionalmente usei para lidar com isso foi por meio de um afixo no comando como:./configure

$ env CPPFLAGS='-I/home/myuser/local/include' 
> LDFLAGS='-L/home/myuser/local/lib/' ./configure

Observe que GNU autoconf e autotools levam muitas, muitas op√ß√Ķes de configura√ß√£o e a documenta√ß√£o nem sempre pode ser facilmente encontrada ou totalmente compreendida. Felizmente, a maioria das vari√°veis ‚Äč‚Äčde ambiente e valores / sinalizadores s√£o usados ‚Äč‚Äčautomaticamente ou quase nunca s√£o usados. Para sua refer√™ncia, a documenta√ß√£o GNU √© provavelmente um come√ßo √ļtil.

Sem entrar em detalhes sobre o que s√£o exatamente CPPFLAGS(sinalizadores do compilador C ++) e LDFLAGS(sinalizadores do vinculador din√Ęmico), acredite que eles podem ser muito importantes e podem ser ajustados para corresponder √† sua situa√ß√£o. Talvez seja importante notar que (menos i) acrescentar√° esses caminhos aos locais j√° conhecidos, como por exemplo ou . Portanto, os locais do sistema nativo n√£o s√£o esquecidos e podem ser usados ‚Äč‚Äčpara fazer o link.-I/usr/include/usr/local/include

Resta uma Pièce de résistance final. E se você não souber o nome dele, será muito difícil pesquisar no Google o que você não sabe que está realmente procurando.

O evasivo (FTW!)config.site

H√° um mecanismo integrado muito interessante para localizar as vari√°veis ‚Äč‚Äčde ambiente de que nossas ferramentas precisam. √Č chamado de e √© tudo que voc√™ precisava e muito mais. Basicamente, ele permite que voc√™ ignore a configura√ß√£o manual tediosa e demorada normalmente associada a esses comandos.config.site

  1. coloque um arquivo na pasta de localização, por exemploshare//home/myuser/local/share
  2. nomeie esse arquivo config.site
  3. fa√ßa com que seu conte√ļdo defina seus sinalizadores de compila√ß√£o

A mais elegante das solu√ß√Ķes permite uma configura√ß√£o diversamente rica para usar como linha de base. Mais informa√ß√Ķes podem ser encontradas aqui . Por um lado, ele nos permite definir um sinalizador de compila√ß√£o que venho sugerindo: o kernel grsec √†s vezes requer sinalizador. ncurses vai precisar dele e voc√™ pode ler sobre o que ele faz aqui .-fPic

Eu tenho o seguinte definido em ~/local/share/config.site

CHOST="x86_64-unknown-linux-gnu"

# util-linux and other programs might complain for libraries not in standard location
# this goes for a few header files `<ncurses.h>` and `<term.h>` which many libs/apps use
# the last addition `-I` to `/ncurses` fixes this since a component relies on this it fails all
CPPFLAGS
="-I/home/myuser/local/include -I/home/myuser/local/include/ncurses"
LDFLAGS
=-L/home/myuser/local/lib

# next line you may find the need to toggle or remove from -fPIC -fstack-protector
# for not everything may appreciate its use (glibc compile may fail for example)
CFLAGS
="-march=native -O2 -pipe -fPIC -fstack-protector"
CXXFLAGS
="$CFLAGS"

# the -j stands for the number of jobs to simultaneously run, principle is to simply
# set the -j value to the number of cores plus 1, or at least common in Gentoo/Arch.
MAKEFLAGS
="-j5"

# foreign function interface library: high level programming interface
# for one, it allows packages to compile without explicit use of pkg-config tool
LIBFFI_CFLAGS
=-I/home/myuser/local/lib/libffi-3.1/include
LIBFFI_LIBS
="-L/home/myuser/local/lib -lffi"

Voc√™ pode querer reservar algum tempo para ler e estudar cuidadosamente essas e outras vari√°veis ‚Äč‚Äčde ambiente que afetam o gcc . Muitos deles podem nunca ser usados ‚Äč‚Äčefetivamente, mas alguns s√£o realmente √ļteis para configurar corretamente e ir√£o ajustar e otimizar ainda mais seu processo de constru√ß√£o. Mas cuidado: certifique-se de que as estat√≠sticas de hardware fornecidas est√£o corretas, por exemplo, n√£o use mais sinalizadores do que sua m√°quina pode controlar e use em vez-j3core2nativepode otimizar um pouco sua produ√ß√£o, a √ļltima √© mais freq√ľentemente a aposta mais segura em que voc√™ n√£o pode errar! Voc√™ deve se informar sobre quaisquer culpados que possam se aplicar √† sua situa√ß√£o antes de fazer qualquer coisa precipitada e est√ļpida (voc√™ j√° foi avisado o suficiente). Google as perguntas que voc√™ pode ter – apenas como uma observa√ß√£o geral – a documenta√ß√£o, refer√™ncias, postagens de blog e outras fontes de informa√ß√£o tornam-se muito escassos em algum ponto conforme voc√™ se aprofunda na matriz: da √°rea de usu√°rio ao kernel e ao c√≥digo de m√°quina, menos voc√™ ser√° capaz de desenterrar fontes (obrigado, capit√£o, √≥bvio) com as quais voc√™ esteja acostumado e confort√°vel. Incluindo a mim mesmo: de alguma forma, nunca vou aprender a amar os manuais Zsh, Apache ou GNU, mas a informa√ß√£o geralmente est√° l√° e voc√™ s√≥ ter√° que fazer as perguntas certas, pesquisar com intelig√™ncia e obter essas informa√ß√Ķes. Ah – e bem-vindo ao mundo das listas de discuss√£o, usenet e IRC, caso voc√™ ainda n√£o tenha se familiarizado. Voc√™ ver√° muitos deles.

Agora, de volta ao caso de exemplo, devemos agora tentar construir a biblioteca de terminal ncurses e, dado o arquivo de exemplo mencionado acima , devemos (depois de estudar e ajustar os valores à sua situação pessoal) avançar:config.site

$ cd ~/build/ncurses-source-folder
$ mkdir build
&& cd build
$
./../configure --prefix=$HOME/local
$ make
&& make install

Gra√ßas √† nossa nova ‘m√°gica’ encontrada, estamos de volta aos comandos de ‘corte limpo’ novamente, embora a configura√ß√£o real para construir o software tenha alguma complexidade adicional na parte de tr√°s, o resultado final na frente √© muito mais desej√°vel . No entanto, uma coisa a se ter em mente: nem todo pacote ser√° t√£o tolerante e voc√™ pode ter que recorrer a mais pesquisas para descobrir quaisquer op√ß√Ķes espec√≠ficas de longo ou curto que voc√™ precisa fornecer. Felizmente, a sa√≠da de erro √© freq√ľentemente uma dica boa o suficiente para resolver problemas r√°pido o suficiente e muito raramente algu√©m realmente precisa ‘ir fundo’ e alterar, por exemplo, arquivos autoconf, m4, libtool e outros. As op√ß√Ķes podem se aplicar apenas a essa ferramenta e sua pr√≥pria configura√ß√£o espec√≠fica, por isso √© dif√≠cil ser espec√≠fico, mas frequentemente tamb√©m voc√™ pode incluir e excluir bibliotecas / m√≥dulos compilados com os bin√°rios resultantes.:versionmostra estes) n√£o foi inclu√≠do? Interruptores de compila√ß√£o.

O padrão se repete para a pasta de origem zsh. Nesse ponto, percebi uma violação anterior de uma prática recomendada: dei comandos para compilar diretamente no (agora corrigi isso, mas pensei que deveria compartilhar), mas é muito melhor não construir diretamente no código-fonte. Porém, uma subpasta é aceitável (pelo que me lembro), então como segundo comando na sequência abaixo, criamos a pasta e configuramos + make a partir dela:ncurses-source-folder/build/

$ cd ~/build/zsh-source-folder
$ mkdir build
&& cd build
$
./configure --prefix=$HOME/local
$ make
&& make install

Se algo der errado e você tiver que começar de novo de alguma forma, lembre-se:

$ make distclean

O padrão típico é make cleanremover todos os arquivos intermediários e make distcleandeixar a árvore do jeito que estava quando foi descompactada (ou algo bem parecido) incluindo a remoção de qualquer saída do script de configuração. E dependendo dos autores do pacote, outros comandos make podem estar disponíveis frequentemente: test, uninstall, dist e outros.

Acho que devo dar o exemplo de fechamento adequado, ou seja, amarrar as √ļltimas pontas soltas porque ainda n√£o chegamos a 100%. Era necess√°rio pelo menos mais um passo para me reunir verdadeira e totalmente com um velho amigo em terras estrangeiras; bastante compreens√≠vel, mas sem o root, n√£o √© poss√≠vel alterar o shell (usando com freq√ľ√™ncia chsh) e modificar o arquivo para que no pr√≥ximo login, possamos usar zsh imediatamente. Devido a essas restri√ß√Ķes, √© dif√≠cil recorrer ao que eu poderia chamar de uma carona nas costas fornecida pelo bash, um impulso para todo o trabalho. Bash e clib fornecem apenas o mecanismo para este ‘hack’, usando os arquivos auto-carregados do bash que podemos modificar (em nossa casa), sendo (n√£o funcionou em meu host) ou , que funcionou:/etc/passwd~/.profile~/.bash_profile

# ~/.bash_profile
export PATH="$HOME/local/bin:$PATH" # ensure shebang #!/usr/bin/env zsh works
export SHELL=$HOME/local/bin/zsh # set the shell environment variable
exec $SHELL # do not spawn a new sub-shell / fork the process - rather replace altogether

A maioria das técnicas ilustradas neste exemplo deve fornecer material suficiente para trabalhar. Lembre-se de que a cadeia pode quebrar em dependências ausentes durante a configuração ou posteriormente ao fazer o software. Nesse caso, inspecione a saída e encontre o comando ausente, depois Google e veja a qual pacote esse comando pertence e tente encontrar o código-fonte para ele. Praticamente todo o GNU pode ser baixado como fonte, e muitas coisas também podem ser encontradas no GitHub .

Desfrute de mexer e usar seus novos poderes com sabedoria.

PS Eu adoraria ouvir de você. Comentários, acréscimos, erros, críticas ou apenas feedback simples são apreciados e se algo exigir elaboração ou esclarecimento, pergunte nos comentários.