如何在Alpine Linux上创建开发环境


近年来,Alpine Linux广受欢迎,并且可能是Docker最受青睐的Linux。它最初是为路由器设计的,它是一种安全,快速,轻巧的Linux:基本的Alpine基本映像仅占用5 MB,比其他流行的Linux发行版少几个数量级。这一事实使其成为理想的选择,成为需要较小尺寸的Docker映像的基础系统,特别是对于OpenJDK Docker映像(否则占用数百MB)。

在这篇文章中,我将介绍我建立Alpine Linux工作站以进行C ++和Java开发的经验,并提供一些有用的Alpine专有技术,技巧和资源。

那么,使用Alpine Linux会得到什么呢? 首先,让我们看一下Alpine Linux的主要功能。

该项目的主页很好地总结了这一点:“ Alpine Linux是一个独立的,非商业的,通用的Linux发行版,设计用于了解安全性,简单性和资源效率的高级用户。”

最显着的安全功能是经过加固的,经过特殊修补的Linux内核。

其他安全功能包括:

PIE可执行文件。所有Alpine可执行文件都以PIE(与位置无关的可执行文件)的形式构建,它们不依赖于绝对内存地址来进行正确的操作,就像共享库一样。此类可执行文件要经过地址空间布局随机化(ASLR)处理,该技术中内核在随机存储器位置之间动态移动程序,这对于防止某些类型的攻击很有用。 堆栈防砸保护。此功能已在所有Alpine二进制文件中实现,并允许堆栈溢出的程序正常退出而不是崩溃。通常通过使用特殊的C / C ++编译器选项(-fstack-protector-fstrong)进行构建来实现,该选项将堆栈Canaries添加到程序代码中。这些是编译器生成的变量,它们在每个函数中标记分配的堆栈帧的结尾,并且被覆盖时,表明堆栈已溢出并且故障就在前面,就像“煤矿中的金丝雀”。 “少即是多”。尽管Alpine本身并不是一个功能,但其极简主义的性质也使其更安全,更不容易受到攻击,因为它几乎没有多余的负担,因此可能的攻击面要小得多,尤其是与其他Linux相比。不幸的是,与任何其他系统一样,它不是100%防弹的。 因此,Alpine尽可能地安全,但是它的占用空间小却真正使它与其他Linux脱颖而出。它围绕两个使它特别紧凑的组件构建:

Busybox。Busybox是一种多合一的多功能二进制文件。它以其作者的名字命名为“嵌入式Linux的瑞士军刀”,它为awk,cp,grep,gzip,sh和top等数十种标准程序提供了核心功能。所有程序都与/ bin / busybox符号链接,/ bin / busybox会根据执行该程序的名称来标识要运行的程序。它通常提供简化的功能集,从而与GNU同类产品具有高度兼容性,但不用担心-您通常可以通过安装同名的软件包(例如grep或tar)或捆绑软件包(如coreutils)来获得完整的GNU功能。

Busybox对Alpine的体积很小非常重要-使用单个静态二进制文件可以减少多个可执行文件的开销,并可以有效地优化生成的二进制文件的大小。在Alpine 3.8上,它仅压缩为780 KB。 MUSL的libc。musl libc库是GNU libc库glibc的紧凑而引人注目的替代品,glibc是大多数Linux发行版中使用的事实上的libc实现。与glibc相比,musl的大小很小:在Alpine 3.8上,musl的重量仅为572 KB,而在Ubuntu 16.04上,glibc的重量为3 MB(3 MB是libc.so和libm.so的总和;在Alpine中,libm .so与musl.so符号链接。但是,比起它的小巧,它还有更多的优点:它提供了更严格的POSIX一致性,更高的安全性和竞争性能。这对比图,从ETA实验室,MUSL的作者,给人的libc的实现和亮点MUSL的强度之间的差异非常详细的图片。 但是,有一个陷阱:将musl作为默认的libc实现会导致与其他基于glibc的Linux的主要兼容性问题。几乎所有Linux程序都与libc动态链接,而glibc Linux二进制文件将与libc.so链接,而Alpine二进制文件将与musl.so链接。因此,基于glibc发行版(例如Ubuntu和RedHat)构建的Linux可执行文件将无法在Alpine上运行,至少不能立即使用。

高山还有什么? 一个简洁,简单的软件包管理器,称为apk。如果您已经熟悉apt软件包管理器,那么您就不会习惯于apk:基本的命令是add,del,search和update,这很不错。如果您已经编写了Alpine Dockerfiles,那么您应该已经非常了解apk。 Alpine中的默认外壳是busybox提供的ash。与Alpine中的任何东西一样,它也非常简约,并且缺少一些shell便利功能,例如自动完成功能。如果像我一样喜欢bash,只需安装bash apk软件包,并将其用作默认shell。 让我们安装Alpine 正如我所看到的,有两种选择:一种是在我的开发工作中使用Alpine Docker,另一种是在笔记本电脑上启动合适的Alpine工作站。这是我与Docker的第一次真正接触,所以我不确定是否应该朝这个方向潜水,因为我想快速起步并运行。而且,在那时,我认为Docker本质上是一个一次性环境,对于日常开发而言可能不是理想的环境(直到后来我才意识到Docker也可以用于此目的)。

Alpine工作站选项似乎更具吸引力,但是我也没有使用Alpine的经验,因此我不确定开发的舒适程度。使用Docker选项,至少我仍然可以使用Ubuntu桌面。

最后,我选择了第二个选项,并急于在已经双重引导的Ubuntu-Windows Dell XPS 15上安装Alpine。

我转到了Alpine下载页面。它提供了最新的Alpine版本(在编写这些行时为3.8.1),提供8种不同的ISO版本。事实证明,Alpine可以在几乎所有设备上运行,从服务器,泊坞窗和虚拟机,到嵌入式ARM设备和Raspberry Pi。在x86_64图像中,我打算在“标准”和“扩展”之间进行选择。由于我的目标是建立一个完整的桌面环境,因此我认为Extended将是一个更好的起点(稍后证明是正确的),然后单击下载按钮。高山ISO –检查。

Google首次对“ install alpine”感兴趣的是Alpine Linux Wiki上的安装页面。Wiki是令人难以置信的信息来源,几乎所有有关Alpine的信息都应有尽有。高山团队的工作真是棒极了。

如安装页面中所述,Alpine可以三种不同的方式安装:

无盘模式–在这种模式下,Alpine从安装介质(例如CD或USB记忆棒)启动,并加载到RAM中。没有数据写入磁盘,并且会话在重新启动后被丢弃。

数据模式–与无盘模式类似,但将/ var文件夹安装到可写介质上,该介质在两次重新引导之间保持不变。

Sys模式–传统的硬盘安装。

显然,选择3是最适合我的选择。因此,我在Ubuntu上进行以下安装Alpine的步骤:

创建了可启动的Alpine安装USB(指南)。

用gparted缩小了我现有的卷,为新的Alpine分区腾出了空间,并将其格式化为ext4。 将Alpine系统复制到新分区(指南)。 通过运行update-grub2,重新生成了GRUB菜单项。 调整了GRUB条目以允许引导到Alpine(请参见下文)。 就是这样。只需几个小时的工作,现在我可以登录到全新的Alpine Linux安装,并使用Ubuntu和Windows三重启动

Getting Started With Alpine 现在我已经能够成功启动Alpine了,是时候进行一些基本的设置步骤了。

连接到Wi-Fi 首先,我需要获得正常的互联网连接。

我的笔记本电脑没有有线网络插座,我的USB RJ45适配器坏了,所以我唯一的选择是Wi-Fi。这个Alpine Wiki页面“连接到无线访问点”非常清楚地描述了Wi-Fi设置过程,因此我很快就能连接到我的工作Wi-Fi网络(特别是,我遵循了“手动配置”步骤)。

要在Alpine上开始使用Wi-Fi,需要安装两个基本软件包:wireless-tools和wpa_supplicant。事实证明,我对扩展ISO的赌注得到了回报:与标准ISO相比,它在脱机apk数据库中包含了这些软件包。这省去了我用同事的计算机从Alpine软件包目录中下载这些软件包的麻烦(顺便说一句,真棒!),将它们复制到USB记忆棒,将其安装到Alpine并手动安装.apk文件的麻烦。

现在,有了网络连接,我就可以更新apk存储库索引并安装一些便利包,例如bash,coreutils和nano。

准备构建环境 此时,我的Alpine命令行运行正常,因此非常适合准备构建环境。

与Ubuntu build-essential相似,build-base meta-package是安装最常见的构建工具和实用程序(包括g ++,make和binutils)的良好起点。为了构建我们的C ++堆栈,我需要其他几个软件包,包括cmake和linux-headers。

某些C ++项目仅与某些编译器版本兼容,特别是Alpine 3.8随gcc 6.4.0一起提供。据我所知,Alpine官方存储库不包含以前的主要gcc版本,因此,如果您需要在Alpine上使用其他gcc版本,您可能会在musl-cross找到它(或兼容版本) -make项目页面:https : //github.com/just-containers/musl-cross-make/releases。

我已经亲自测试了gcc 4.9.4,它运行良好。这些家伙干得不错,对某些人来说可能是真正的救星。

接下来,安装Java。Alpine JDK的官方实现是OpenJDK,由OpenJDK IcedTea项目提供给我们。提供了OpenJDK版本7和8,可以从Alpine apk存储库下载。不幸的是,当前没有针对Java 9、10和11的GA构建(请参阅项目Portola主页和此github讨论以了解当前状态)。现在,我对openjdk8软件包感到满意。

最后,在期望进行激烈调试的时候,我继续安装了gdb和strace以及musl和OpenJDK调试符号,它们分别在musl-dbg和openjdk8-dbg软件包中提供。带上它,高山!

提示:对于最新的软件包,您可能需要将边缘存储库添加到/ etc / apk / repositories文件中,如软件包管理页面中所述。例如,lldb当前仅在边缘可用。但是,边缘包是试验性的,因此请谨慎使用它们。

安装桌面和IDE Alpine提供了多种台式机,包括GNOME,MATE和Xfce。我还不熟悉Xfce,所以我决定尝试一下。与往常一样,Alpine Wiki是一个不错的起点。“ Xfce设置”页面详细介绍了安装和启动Xfce所需的所有步骤。最重要的是,要安装的软件包是xfce4 –台式机本身和alpine-desktop。后者是一个非常全面的元软件包,可提供默认的Alpine桌面体验,包括Firefox Web浏览器,AbiWord编辑器,Audacious声音播放器等。

提示:不要忘记安装字体包,例如font-noto。否则,您将得到奇怪的文本空白方块,并且某些GUI应用程序可能会崩溃或行为异常。这花了我相当多的时间来弄清楚!

我的阿尔卑斯难题中缺少的最后一块是为C / C ++和Java开发找到合适的IDE。在这里,musl-glibc兼容性问题变得非常痛苦。例如,找不到与musl兼容的Eclipse CDT构建,因此如果没有glibc兼容层,就不可能在Alpine上运行Eclipse。我对命令行很满意,但是我确实希望有一个合适的IDE,特别是对于调试。

幸运的是,我们拥有JetBrains IDE系列。JetBrains的IntelliJ,CLion和其他IDE都在JVM上运行,并且不直接依赖于底层的libc实现。由于OpenJDK JVM与musl完全兼容,因此任何标准Java应用程序都可以立即运行,IntelliJ和CLion也是如此。我是IntelliJ的忠实粉丝,因此很高兴看到它在Alpine上也能正常工作。终于解脱了!

重要的是要注意,尽管IntelliJ在其社区版中对所有人免费提供,但CLion仅在30天的评估期内免费(尽管学生可以申请免费的学术许可证)。现在,这已经足够了。

就是这样–我已经设置好自己的Alpine桌面环境!


原文链接:http://codingdict.com