用标准的GNU/Linux命令替换Alpine上的精简版命令

Alpine Linux 是一个基于 musl libc 和 busybox 的轻量级Linux发行版,busybox 实现了很多常用类Unix命令的精简版,特点是体积很小,舍弃了很多不常用参数,我们简单对比一下标准Linux自带的 date 命令 和 Alpine下默认的 date 命令便可略知一二:

GNU/Linux 版:

root@spacex:~# date --help
Usage: date [OPTION]... [+FORMAT]or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.Mandatory arguments to long options are mandatory for short options too.-d, --date=STRING          display time described by STRING, not 'now'--debug                annotate the parsed date,and warn about questionable usage to stderr-f, --file=DATEFILE        like --date; once for each line of DATEFILE-I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.FMT='date' for date only (the default),'hours', 'minutes', 'seconds', or 'ns'for date and time to the indicated precision.Example: 2006-08-14T02:34:56-06:00-R, --rfc-email            output date and time in RFC 5322 format.Example: Mon, 14 Aug 2006 02:34:56 -0600--rfc-3339=FMT         output date/time in RFC 3339 format.FMT='date', 'seconds', or 'ns'for date and time to the indicated precision.Example: 2006-08-14 02:34:56-06:00-r, --reference=FILE       display the last modification time of FILE-s, --set=STRING           set time described by STRING-u, --utc, --universal     print or set Coordinated Universal Time (UTC)--help     display this help and exit--version  output version information and exitFORMAT controls the output.  Interpreted sequences are:%%   a literal %%a   locale's abbreviated weekday name (e.g., Sun)%A   locale's full weekday name (e.g., Sunday)%b   locale's abbreviated month name (e.g., Jan)%B   locale's full month name (e.g., January)%c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)%C   century; like %Y, except omit last two digits (e.g., 20)%d   day of month (e.g., 01)%D   date; same as %m/%d/%y%e   day of month, space padded; same as %_d%F   full date; like %+4Y-%m-%d%g   last two digits of year of ISO week number (see %G)%G   year of ISO week number (see %V); normally useful only with %V%h   same as %b%H   hour (00..23)%I   hour (01..12)%j   day of year (001..366)%k   hour, space padded ( 0..23); same as %_H%l   hour, space padded ( 1..12); same as %_I%m   month (01..12)%M   minute (00..59)%n   a newline%N   nanoseconds (000000000..999999999)%p   locale's equivalent of either AM or PM; blank if not known%P   like %p, but lower case%q   quarter of year (1..4)%r   locale's 12-hour clock time (e.g., 11:11:04 PM)%R   24-hour hour and minute; same as %H:%M%s   seconds since 1970-01-01 00:00:00 UTC%S   second (00..60)%t   a tab%T   time; same as %H:%M:%S%u   day of week (1..7); 1 is Monday%U   week number of year, with Sunday as first day of week (00..53)%V   ISO week number, with Monday as first day of week (01..53)%w   day of week (0..6); 0 is Sunday%W   week number of year, with Monday as first day of week (00..53)%x   locale's date representation (e.g., 12/31/99)%X   locale's time representation (e.g., 23:13:48)%y   last two digits of year (00..99)%Y   year%z   +hhmm numeric time zone (e.g., -0400)%:z  +hh:mm numeric time zone (e.g., -04:00)%::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)%:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)%Z   alphabetic time zone abbreviation (e.g., EDT)By default, date pads numeric fields with zeroes.
The following optional flags may follow '%':-  (hyphen) do not pad the field_  (underscore) pad with spaces0  (zero) pad with zeros+  pad with zeros, and put '+' before future years with >4 digits^  use upper case if possible#  use opposite case if possibleAfter any flags comes an optional field width, as a decimal number;
then an optional modifier, which is either
E to use the locale's alternate representations if available, or
O to use the locale's alternate numeric symbols if available.Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date$ date --date='@2147483647'Show the time on the west coast of the US (use tzselect(1) to find TZ)$ TZ='America/Los_Angeles' dateShow the local time for 9AM next Friday on the west coast of the US$ date --date='TZ="America/Los_Angeles" 09:00 next Fri'GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/date>
or available locally via: info '(coreutils) date invocation'
root@spacex:~#

busybox版:

在这里插入图片描述

可以看到参数少了很多,虽然大部分情况下busybox的命令都足够用了,但遇到确实不能满足我们需求的时候,比如要运行一个基于标准Linux编写的shell脚本,其中用了很多命令的高级参数,对此,Alpine Linux 也提供了替换标准Linux 命令的方法。

默认情况下,Alpine下的一些常用Linux 命令其实都是指向 busybox 的软链,包括 ls 命令本身
在这里插入图片描述
除了上述列出的 /bin 目录下的命令,还有 /sbin//usr/bin//usr/sbin/ 目录下的大多命令都是如此。

要想替换Alpine 下的 busybox 命令,我们可以执行:

apk add util-linux pciutils hwdata-pci usbutils hwdata-usb coreutils binutils findutils grep iproute2 bash bash-completion

替换完之后,这些软链接要么被替换成了具体的可执行文件,要么还是软链,但不再指向busybox了:
在这里插入图片描述

如果只想替换某个具体用到的,那就要找出该命令所在的 GNU 工具包了,然后只安装该工具包即可,从而尽量保持体积不要太过膨胀,根据我目前的经验找出某个具体命令所在的工具包大致有以下几种方法供参考:

  1. 在 Alpine apk仓库 中搜索指定命令有没有提供单独的软件包,比如 grepsed 即是此类

在这里插入图片描述
在这里插入图片描述
如果存在就好办了,直接执行 apk add xxx 即可完成替换
在这里插入图片描述

  1. 查看标准Linux命令的帮助文档,看有没有提供包信息

比如从 date --help 的帮助文档我们可以知道它在 GNU coreutils 工具包下:
在这里插入图片描述

  1. 查看busybox项目的源码结构和文件命名,busybox通常一个命令就是一个源码文件。

比如 fdisk,flock, getopt 这些命令都是由 util-linux 包提供的,如果我们只用到其中的命令,只安装 util-linux 即可
在这里插入图片描述
同理,find, grep, xargs 三个命令由 findutils 包提供
在这里插入图片描述
还可以直接尝试搜索某个命令,看是否有对应的源文件,直接就能定位到软件包:
在这里插入图片描述

  1. apk info 查看某个包的具体介绍,从而推断可能包含哪些命令

在这里插入图片描述

  1. 实在不行只能一个个的尝试,看到安装了哪个包之后,目标软件的软链被替换掉了,说明这个就是我们要找的。

  2. 没办法的办法,自己编译,因为 Alpine 使用 musl libc 而不是标准 glibc,编译会更加麻烦, 这里以编译 debian cron 为例简单演示下编译步骤

#安装编译工具链
apk add build-base abuild autoconf automake libtool# 下载源码包,解压
wget https://salsa.debian.org/debian/cron/-/archive/updates/buster/cron-updates-buster.tar.gz# 编译
cd cron-updates-buster && make
cc -I. -DPOSIX -DDEBUGGING=0      -c -o cron.o cron.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o database.o database.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o user.o user.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o entry.o entry.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o job.o job.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o do_command.o do_command.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o misc.o misc.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o env.o env.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o popen.o popen.c
cc -I. -DPOSIX -DDEBUGGING=0      -c -o compat.o compat.c
cc  -o cron cron.o database.o user.o entry.o job.o do_command.o misc.o env.o popen.o compat.o
cc -I. -DPOSIX -DDEBUGGING=0      -c -o crontab.o crontab.c
cc  -o crontab crontab.o misc.o entry.o env.o compat.o# 替换busybox版本
bash-5.1# which crontab
/usr/bin/crontab
bash-5.1# ls -l /usr/bin/crontab
lrwxrwxrwx    1 root     root            12 Nov 24  2021 /usr/bin/crontab -> /bin/busybox
bash-5.1# install ./crontab /usr/bin/crontab
bash-5.1# ls -l /usr/bin/crontab
-rwxr-xr-x    1 root     root         53696 May  7 04:27 /usr/bin/crontab
bash-5.1#
bash-5.1# which crond
/usr/sbin/crond
bash-5.1#
bash-5.1# ls -l /usr/sbin/crond
lrwxrwxrwx    1 root     root            12 Nov 24  2021 /usr/sbin/crond -> /bin/busybox
bash-5.1#
bash-5.1# install ./cron /usr/sbin/cron
bash-5.1#
bash-5.1# ln -sf /usr/sbin/cron /usr/sbin/crond
bash-5.1#
bash-5.1# ls -l /usr/sbin/crond
lrwxrwxrwx    1 root     root            14 May  7 04:30 /usr/sbin/crond -> /usr/sbin/cron# 测试cron能否正常工作,略..

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3014900.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-组件中的data

一个组件的data选项必须是一个函数。保证每个组件实例&#xff0c;维护独立的一份数据对象。如下图&#xff1a; 组件一旦封装好了&#xff0c;可以使用多次&#xff0c;比如数字框组件使用了三次&#xff1a; 每次创建新的组件实例&#xff0c;都会重新执行一次data函数&#…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

2023年腾讯暑期实习 笔试原题与答案解析

试卷名称&#xff1a;腾讯2023实习生招聘-技术研究 考试时间&#xff1a;(北京时间)2023-03-26 20:00:00 -- 22:00:00 考试时长&#xff1a;120分钟 第一题 // package Tencent;import java.util.HashSet; import java.util.Scanner;public class Main {public static void …

Omnity 进展月报 | 2024.4.1-4.30

Omnity 大事摘要 1、Octopus 官宣升级为 Omnity。 2、Omnity 4月28号正式上线&#xff0c;实现BTC 和 ICP 之间跨链转账 Runes 资产。 3、为庆祝上线&#xff0c;以符文 HOPE•YOU•GET•RICH 为资产&#xff0c;发红包快速触达大量用户&#xff0c;体验跨链服务。 4、Omni…

【完美解决】使用git时候出现error setting certificate verify locations: CAfile:问题

1、出现场景&#xff1a; 在使用idea的时候&#xff0c;进行git下的push&#xff0c;出现下面的错误&#xff1a; 2、原因分析&#xff1a; 可能因为重装过系统&#xff0c;或者是安装git的位置发生了变化等情况出现。 3、解决方案&#xff1a; 找到git的安装路径&#xf…

Linux基础配置(镜像挂载,FQDN)

CentOS基础配置&#xff1a; 以下是appsrv的基础配置脚本&#xff0c;CentOS系统只需要把appsrv改成需要的主机名即可&#xff08;因为Linux基础配置都差不多&#xff0c;写脚本是最省时间的做法&#xff0c;IP地址的配置一般用nmtui图形化界面工具&#xff09; #!/bin/bash …

什么软件能在桌面上做笔记 好用的桌面笔记软件

一直认为&#xff0c;好记性不如烂笔头。在繁忙的工作和生活中&#xff0c;做笔记能够帮助我抓住那些一闪而过的灵感&#xff0c;也能让我随时回溯重要信息。特别是在电脑桌面上做笔记&#xff0c;更是方便快捷&#xff0c;一目了然。 想象一下&#xff0c;你正在工作中&#…

【web前端2024】简单几步制作web3d《萌宠星球》智体节点模板!

使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆&#xff…

Colibri for Mac v2.2.0 原生无损音频播放器 激活版

Colibri支持所有流行的无损和有损音频格式的完美清晰的比特完美播放&#xff0c;仅使用微小的计算能力&#xff0c;并提供干净和直观的用户体验。 Colibri在播放音乐时使用极少的计算能力。该应用程序使用最先进的Swift 3编程语言构建&#xff0c;BASS音频引擎作为机器代码捆绑…

走进CDO的世界:探索其主要职能职责

首席数据官&#xff08;CDO&#xff09;是统筹管理数据资产、系统开展内外部数据开放共享和价值开发的首要负责人&#xff0c;是推动以数据为核心要素的创新转型、合法合规开辟价值增长新空间的关键领导角色。CDO 制度是包括以CDO为首的数据人才队伍的岗位设置、职能职责体系、…

苹果自研大语言模型“Ajax“ 助力iOS 18升级;Stack Overflow与OpenAI建立API合作伙伴关系

&#x1f989; AI新闻 &#x1f680; 苹果自研大语言模型"Ajax" 助力iOS 18升级 摘要&#xff1a;苹果公司预计通过自研大语言模型Ajax来为iOS 18和Siri带来重大升级&#xff0c;但不计划推出类似ChatGPT的AI聊天机器人。Ajax模型基于Google的Jax框架&#xff0c;并…

220V转18V500mA非隔离恒压WT5113

220V转18V500mA非隔离恒压WT5113 亲爱的朋友们&#xff0c;你们是否在为如何提高电源方案而烦恼呢&#xff1f;今天我给大家带来了一款芯片&#xff0c;WT5113宽输出范围非隔离交直流转换芯片&#xff0c;它可是电源方案中的得力助手哦&#xff01; 这款芯片拥有220V降12V、2…

力扣刷题:四数相加Ⅱ

题目详情&#xff1a; 解法一&#xff1a;暴力枚举 对于这道题&#xff0c;我们的第一思路就是暴力枚举&#xff0c;我们可以写一个四层的for循环进行暴力匹配&#xff0c;只要相加的结果等于0就进行统计。但是我们会发现&#xff0c;我们的事件复杂度为O(N^4)事件复杂度非常大…

电度表抄表是什么?什么叫电度表抄表?

一、电度表抄表的概念和作用 电度表抄表是电力系统中一个基本但非常重要的阶段。它指的是对安装在用户处电度表开展载入&#xff0c;记录下来电力消耗的值&#xff0c;便于测算电费的一个过程。此项工作不仅有利于供电公司精确扣除电费&#xff0c;都是监控和管理电力工程应用…

【前端--Vue】组件之间的多种通信方式,一文彻底搞懂组件通信!

本篇将重点讲解vue中的多种组件通信方式&#xff0c;包括【父传子】【子传父】【兄弟组件通信】【依赖注入】等等&#xff0c;并提供具体案例来让小伙伴们加深理解、彻底掌握&#xff01;喜欢的小伙伴们点赞收藏&#xff0c;持续关注哦~&#x1f495; &#x1f49f; 上一篇文章…

浅谈智能电气火灾监控系统的设计及应用

摘要&#xff1a;致电气火灾的原因是多方面的&#xff0c;主要成因包括漏电、绝缘层老化、短路、电火花密集、接地发生故障、电气设备自然、接触不良和电流超负荷等。文章分析电气火灾的成因&#xff0c;并探索电气火灾监控系统的设计方案与注意事项。 关键词&#xff1a;电气…

推荐5个免费的国内平替版GPT

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…

多模态大模型学杂了能力反下降?新研究:MoE+通用专家解决冲突

微调&#xff0c;能让通用大模型更加适配具体的行业应用。 但现在&#xff0c;研究人员们却发现&#xff1a; 对多模态大模型做“多任务指令微调”&#xff0c;大模型可能会“学得多错得多”&#xff0c;因为不同任务之间的冲突&#xff0c;导致泛化能力下降。 △多模态指令微…

进制乘法表(任意进制均可以)

#include <iostream> // 包含输入输出流库 #include <vector> // 包含向量库&#xff0c;未使用&#xff0c;可以删除 #include <string> // 包含字符串库using namespace std; // 使用标准命名空间// 将十进制数转换为P进制形式的字符串 string toBase(…

uniapp 拉起微信授权登录App

登录 微信开放平台 创建移动应用&#xff1a; 然后下一步&#xff1a; 输入相关信息 然后在项目中配置&#xff1a; 通用链接页面需要在页面中配置拉起你的App的 UrlSchemes 具体可参考 uniapp 自定义App UrlSchemes-CSDN博客 示例代码&#xff1a; uni.login({"prov…