Adicionando ao caminho x vinculando a partir de / bin


24

Nosso administrador de sistemas instalou um aplicativo de software (Maven) no servidor e disse a todos para adicionar a /usr/local/maven/bin/pasta ao caminho.

Eu acho que poderia ser mais conveniente apenas vincular os poucos programas nessa pasta a partir da /binpasta (ou outra pasta que todos tenham em seu caminho) assim:

ln -s /usr/local/maven/bin/* /bin

Isso está correto? Existem alguns efeitos colaterais ocultos na minha sugestão?


2
Por LSB, você deve adicionar pacotes externos em /opt.
— 21414 vonbrand

Respostas:


31

Ligando

Você geralmente não ligar /usr/local/*com /bin, mas esta é mais uma prática histórica. Em geral, existem algumas razões "técnicas" pelas quais você não pode fazer o que está sugerindo.

Criar links para executáveis ​​em /binpode causar problemas:

  1. Provavelmente, a maior advertência seria se o sistema estiver gerenciando pacotes por algum tipo de gerenciador de pacotes, como RPM, dpkg, APT, YUM, pacman, pkg_add, etc. Nesses casos, geralmente você deseja deixar o pacote gerente de fazer o seu trabalho e gerenciar diretórios tais como /sbin, /bin, /lib, e /usr. Uma exceção seria o /usr/locallocal normalmente seguro para você fazer o que achar melhor na caixa, sem precisar se preocupar com o fato de um gerenciador de pacotes interferir nos seus arquivos.

  2. Muitas vezes, os executáveis ​​criados para /usr/localesse PATH são codificados em seus executáveis. Também pode haver arquivos de configuração incluídos /usr/localcomo parte da instalação desses aplicativos. Portanto, vincular apenas o executável pode causar problemas com esses aplicativos, encontrando os .cfgarquivos posteriormente. Aqui está um exemplo de tal caso:

    $ strings /usr/local/bin/wit | grep '/usr/local'
    /usr/local/share/wit
    /usr/local/share/wit/
    
  3. O mesmo problema que se aplica à localização de .cfgarquivos também pode ocorrer com executáveis ​​"auxiliares" que o aplicativo principal precisa executar. Eles também precisam estar vinculados /usr/bin, sabendo que isso pode ser problemático e só aparece quando você realmente tenta executar o aplicativo vinculado.

NOTA: em geral, é melhor evitar a tentação de vincular a aplicativos únicos /usr/bin.

/etc/profile.d

Em vez disso, se todos os usuários fornecerem esse gerenciamento, o administrador poderá adicioná-lo facilmente a todos que estiverem $PATHna caixa, adicionando um arquivo correspondente no /etc/profile.ddiretório.

Um arquivo como este /etc/profile.d/maven.sh:

PATH=$PATH:/usr/local/maven/bin

Você geralmente faz isso como administrador, em vez de poluir todas as configurações dos usuários.

Usando alternativas

A maioria das distros agora fornece outra ferramenta chamada alternatives(Fedora / CentOS) ou update-alternatives(Debian / Ubuntu), que você também pode usar para fazer um loop nas $PATHferramentas que podem estar fora do /bin. O uso de ferramentas como essas é preferível, pois elas seguem mais o que a maioria dos administradores consideraria "prática padrão" e, assim, facilita a transferência de sistemas de um administrador para outro.

Essa ferramenta faz uma coisa semelhante ao criar links /bin; mas ele gerencia a criação e a destruição desses links, portanto, é mais fácil entender a configuração pretendida de um sistema quando realizada por meio de uma ferramenta versus diretamente, como você sugere.

Aqui estou usando esse sistema para gerenciar o Java da Oracle em uma caixa:

$ ls -l /etc/alternatives/ | grep " java"
lrwxrwxrwx. 1 root root 73 Feb  5 13:15 java -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java
lrwxrwxrwx. 1 root root 77 Feb  5 13:15 java.1.gz -> /usr/share/man/man1/java-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 70 Feb  5 13:19 javac -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javac
lrwxrwxrwx. 1 root root 78 Feb  5 13:19 javac.1.gz -> /usr/share/man/man1/javac-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz
lrwxrwxrwx. 1 root root 72 Feb  5 13:19 javadoc -> /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/bin/javadoc
lrwxrwxrwx. 1 root root 80 Feb  5 13:19 javadoc.1.gz -> /usr/share/man/man1/javadoc-java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64.1.gz

Você pode ver os efeitos disso:

$ type java
java is /usr/bin/java

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.60-2.4.4.1.fc19.x86_64/jre/bin/java

Meus US $ 0,02

A criação de links /bin, embora plausível, provavelmente seria altamente desencorajada pela maioria dos administradores de sistemas:

  1. Seria desaprovado porque é visto como personalizado e pode causar confusão se outro administrador for necessário para pegar a caixa
  2. Pode levar à quebra de um sistema em um estado futuro como resultado dessa personalização "frágil".

@slm Convém modificar seu primeiro parágrafo. Existem várias razões técnicas para não usar um link simbólico.
— Jlliagre

@ jlliagre - ao olhar para o seu A, não estou convencido de que os administradores não sejam os proprietários do /bindiretório. Aqui está um exemplo. Nas distros da Red Hat que utilizam o RPM, se um arquivo já existir no /binRPM, não serão instaladas como você descreveu, a menos que sejam coxas para fazer isso usando o --replacefilesswitch. Portanto, essa não é realmente uma razão técnica. O mesmo com outros diretórios. Entendo o que você está dizendo sobre o sistema operacional "proprietário", /binmas não é tão claro quanto você afirma.
— slm

@ jlliagre - também no meu A, não estou incentivando ninguém a criar um link, apenas afirmando que pode, se optar por fazê-lo. Eu odeio sistemas onde as coisas são feitas assim e normalmente amaldiçoo o administrador que é feito 8-).
— slm

@slm Eles podem (como possuem privilégios suficientes), mas isso não implica que isso funcione. Os pontos 2 e 3 da minha resposta ainda são razões técnicas válidas para não criar um link, mas para usar o PATH correto, especialmente no caso do OP. Gostaria de encorajá-lo a mencioná-los na sua resposta.
— Jlliagre

@jlliagre - detalhes adicionados de acordo com o seu feedback.
— slm

7

Respondendo às perguntas:

Isso está correto?

Não , é uma prática ruim.

Existem alguns efeitos colaterais ocultos na minha sugestão?

Sim, existem vários efeitos colaterais. Sua sugestão pode funcionar ou não, dependendo do aplicativo, e pode regredir ou ser interrompida a longo prazo.

Existem razões sensatas para não criar um link tão simbólico:

  • Os administradores não "possuem" /bin(consulte a nota 1), pois esse diretório pertence aos desenvolvedores do sistema operacional / distribuição. Por outro lado, /usr/localé um local tradicional para software criado pelo administrador local, /opt/<packagename>sendo um local para software desagregado. Se você criar um arquivo ou um link /bin, existe o risco de ser substituído por uma instalação de pacote, no seu caso, um mavenpacote hipotético fornecido pelo sistema operacional, que pode levar a uma regressão se o criado localmente for criado a partir de versões mais recentes. código fonte que a versão do sistema operacional. Por exemplo, tarballs SVR4 pkgadd, debian dpkg, red-hat rpme slackware sobrescreverão cegamente o seu link simbólico.

  • Alguns aplicativos procuram o local em que são chamados para recuperar arquivos de configuração, plugins e recursos similares. Se você chamar o aplicativo por um link simbólico, seu código poderá falhar em segui-lo e, em seguida, procure esses arquivos de recursos /usr/binonde eles não estão.

  • Pode haver outros binários /usr/local/maven/bine a não inclusão desse diretório no PATH os tornará indisponíveis. Removido como você já leva isso em consideração com seu comando, vinculando todos os comandos em potencial.

  • A página maven2 diz para adicionar este diretório ao seu PATH (precisamente: adicione a variável de ambiente M2 ao seu caminho, por exemplo, exporte PATH = $ M2: $ PATH .), Usando uma abordagem diferente, você está quebrando essa etapa e, portanto, não é suportado. maneira. Obviamente, se a maioria dos usuários de um sistema são mavenusuários em potencial , faria mais sentido definir o PATHglobalmente do que em cada um .profile.

Nota 1:

Documentação do Slackware:

   The /bin directory usually doesn't receive modification
   after installation. If it does, it's usually in the form
   of package upgrades that we provide.

Padrão de Hierarquia Debian / Sistema de Arquivos

/bin/
   Essential command executable (binaries) for all users (e.g., cat, ls, cp) 
   (especially files required to boot or rescue the system)
...
/opt/
   Add-on application software packages 
   Pre-compiled, non ".deb" binary distribution (tar'ed..) goes here.
/opt/bin/
   Same as for top-level hierarchy

Documentação do Solaris:

/usr/bin
   Platform-dependent, user-invoked executables. These  are
   commands  users expect to be run as part of their normal
   $PATH. For executables that are different  on  a  64-bit
   system  than  on a 32-bit system, a wrapper that selects
   the  appropriate  executable   is   placed   here.   See
   isaexec(3C).  An approved installation location for bun-
   dled Solaris software. The analogous location for add-on
   system     software     or     for    applications    is
   /opt/packagename/bin.

Teste simples mostrando o Debian dpkgnão preserva um link existente, mesmo quando a --force-overwriteopção não é usada:

# ls -l /usr/bin/banner
lrwxrwxrwx 1 root root 11 Feb 25 21:37 /usr/bin/banner -> /tmp/banner
# dpkg -i sysvbanner_1.0.15_amd64.deb 
Selecting previously unselected package sysvbanner.
(Reading database ... 236250 files and directories currently installed.)
Unpacking sysvbanner (from sysvbanner_1.0.15_amd64.deb) ...
Setting up sysvbanner (1.0.15) ...
Processing triggers for man-db ...
# ls -l /usr/bin/banner
-rwxr-xr-x 1 root root 11352 May  7  2009 /usr/bin/banner

Importante mesmo. É muito lamentável que aceitou uma resposta que afirma incorretamente é apenas uma prática histórica, sem razões técnicas para evitar ...
— jlliagre

11
Você está certo, mas aceitei essa resposta porque ela me deu uma solução prática que usei, ou seja, diga ao administrador do sistema para colocar o comando de modificação PATH no /etc/profile.d.
— Erel Segal-Halevi

Concordo que ele deu uma solução prática e correta, mas não às duas perguntas que você fez ("Isso está correto? Existem efeitos colaterais?").
— Jlliagre

11
jlliagre está totalmente certo. Esta prática não é histórica. É uma prática recomendada recente. Pelo contrário, nos antigos Unixes, todos instalavam seu software diretamente em /binou /usr/bin. Ao descobrir os problemas dos binários do sistema ocultos ou desarrumados (o mais famoso foi test), a melhor prática para instalar binários que não são do sistema em outro lugar foi adotada progressivamente.
— dan

3

Se você deseja fazer o link simbólico, seria melhor fazer o link simbólico para /usr/local/bin. No meu servidor, eu costumava instalar o software local /opt/NAMEe vincular os binários a eles /usr/local/bin.


0

Uma alternativa aos dois métodos sugeridos é criar um script de shell em /usr/local/binque, quando executado, execute o binário que você especificar no script. Por exemplo, usando o maven como exemplo, eu criaria um shell script /usr/local/binchamado mavenque possui um pequeno script interno para executar o binário do maven no local em que está localizado e passar quaisquer argumentos para ele:

#!/bin/sh
exec /usr/local/maven/bin/maven "$@"

Isso tem a desvantagem de ter que fazer isso para todos os binários que você deseja "vincular", mas permite que você chame esses binários da linha de comando sem precisar estragar sua $PATHvariável de ambiente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.