如何在Alpine Linux上创建开发环境
为C++和Java开发设置Alpine Linux工作站的分步指导,以及一些我最喜欢的技巧和资源。
Alpine Linux近年来非常受欢迎,可能是Docker最喜欢的Linux。它最初是为路由器设计的,是一个安全、快速、轻便的Linux:一个基本的Alpine基础映像只需5 MB,比其他流行的Linux发行版少几个数量级。这一事实使它成为Docker映像基础系统的理想选择,小尺寸是可取的,特别是对于占用几百MB的OpenJDK Docker映像。
在这篇文章中,我’将介绍我在为C++和Java开发建立阿尔卑斯Linux工作站方面的经验,以及一些希望有用的阿尔卑斯诀窍、技巧和资源。
那么你从Alpine Linux得到了什么?
首先,让我们来看看Alpine Linux的主要功能。
项目主页很好地总结了它:“Alpine Linux是一个独立的、非商业的、通用的Linux发行版,专为喜欢安全性、简单性和资源效率的高级用户设计。”
最显著的安全特性是一个经过特别修补的强化Linux内核。
其他安全功能包括:
-
PIE可执行文件。所有阿尔卑斯山可执行文件都构建为PIE–独立位置可执行文件—它们的正确操作不依赖绝对内存地址,很像共享库。这些可执行文件受地址空间布局随机化(ASLR)的约束,这是一种内核在随机内存位置之间动态移动程序的技术,有助于防止某些类型的攻击。
-
堆栈粉碎保护。此功能在所有Alpine二进制文件中实现,并允许堆栈溢出的程序优雅地退出,而不是可怕地崩溃。它通常通过构建一个特殊的C/C++编译器选项(-fstack-protected ector-fstrong)来实现,该选项将堆栈金丝雀添加到程序代码中。这些是编译器生成的变量,标志着每个函数中分配的堆栈帧的结束,当被覆盖时,表明堆栈已经溢出,麻烦就在前方,就像煤矿”中的“金丝雀一样。
-
“少即是多”。虽然阿尔卑斯山本身不是一个功能,但它的简约本质也使它更安全,更不容易受到攻击,因为它几乎没有多余的行李,因此可能的攻击面要小得多,尤其是与其他Linux相比。不幸的是,与任何其他系统一样,它不是100%防弹的。
所以,阿尔卑斯尽可能的安全,但是它的小足迹是它区别于其他Linux的真正原因。它是围绕两个组件构建的,这使得它特别紧凑:
-
Busybox。Busybox是一个多功能二进制文件。它的作者“嵌入式Linux”的瑞士军刀命名,它为几十个标准程序提供核心功能,如awk、cp、grep、gzip、sh和top。所有程序都与/bin/busybox有符号链接,它根据执行程序的名称标识要运行的程序。它为GNU同行提供了高兼容性,通常是功能集减少,但不用担心–您通常可以通过安装同名包(如grep或t ar)或捆绑包(如coreutils)来获得完整的GNU功能。
-
Busybox对于Alpine的小尺寸来说意义重大–使用单个静态二进制文件可以减少多个可执行文件的开销,并允许有效地优化生成的二进制文件的大小。在Alpine 3.8上,它只被压缩成780 KB的质量。
-
musl libc。musl libc库是GNU libc库的一个紧凑而引人注目的替代方案,gl ibc实际上是大多数Linux发行版中使用的libc实现。与gl ibc相比,musl体积很小:它在Alpine 3.8上仅重572 KB,而在Ubuntu 16.04上gl ibc只有3 MB(3MB是libc.so和libm.so的总和;在Alpine,libm.so与musl.so相关联)。但是,musl不仅仅是它的小尺寸:它提供了更严格的POSIX一致性、更高的安全性和更具竞争力的性能。这张来自ETA实验室的对比图,musl的作者,非常详细地描述了libc实现之间的差异,并突出了musl的优势。
但是,有一个问题:将musl作为默认的libc实现会带来与其他基于gl ibc的Linux程序的主要兼容性问题。几乎所有的Linux程序都与libc动态链接,而gl ibc Linux二进制文件将链接到libc.so,阿尔卑斯二进制文件将链接到musl.so.因此,构建在gl ibc发行版如Ubuntu和Red Hat上的Linux可执行文件将无法在阿尔卑斯运行,至少不会开箱即用。
阿尔卑斯山还有什么?
-
一个简洁的包管理器叫做apk。如果你’已经熟悉apt包管理器,就不需要习惯apk:基本的命令是add、de l、search和update,你’可以使用。如果你’写过Alpine Docker file,你应该已经很了解apk了。
-
Alpine中默认的shell是busybox提供的ash。和Alpine中的任何东西一样,它也非常简约,缺乏一些shell便利功能,比如自动完成。如果你’像我一样喜欢bash,只需安装bash apk包,并将其用作默认的shell。
让我们安装Alpine
在我看来,有两种选择:一是在我的开发工作中使用Alpine Docker,二是在我的笔记本电脑上安装一个合适的Alpine工作站。这是我第一次真正遇到Docker,所以我’不确定我是否应该朝着这个方向努力,因为我想快速启动和运行。此外,在那时,我认为Docker本质上是一个一次性的环境,可能不适合日常开发(直到后来我才意识到Docker在这方面也很有用)。
Alpine工作站选项看起来更有吸引力,但是我也没有使用Alpine的经验,我’不确定它对开发来说有多舒服;有了Docker选项,至少我还有Ubuntu桌面可以使用。
最后,我选择了第二个选项,并匆忙在我已经双引导的Ubuntu-Windows戴尔XPS 15上安装Alpine。
我去了Alpine下载页面。它提供了最新的Alpine版本(3.8.1,截至写这几行时),有8种不同的国际标准化组织版本。事实证明,Alpine运行在几乎任何东西上,从服务器、码头工人和虚拟机,到嵌入式ARM设备和覆盆子派。在x86_64的图像中,我考虑了“标准”和“扩展”。因为我的目标是一个成熟的桌面环境,我认为扩展会是一个更好的起点(后来证明是正确的),并点击下载按钮。Alpine ISO–检查。
“安装高山”的第一个谷歌热门是高山Linux维基的安装页面。维基是一个不可思议的信息来源,几乎所有关于阿尔卑斯山的信息都有。阿尔卑斯团队做得非常棒。
如安装页面所述,Alpine可以以三种不同的模式安装:
-
无盘模式–在该模式下,阿尔卑斯将从安装介质,如光盘或u盘启动,并加载到内存中。没有数据写入磁盘,重新启动时会丢弃会话。
-
数据模式–类似于Diskless,但/var文件夹安装到可写介质,在重新启动之间保持不变。
-
Sys模式–传统的硬盘安装。
显然,选项3是最适合我的。因此,我继续在Ubuntu上安装Alpine的以下步骤:
-
创建了一个可引导的Alpine安装USB(指南)。
-
使用gparted来缩小我现有的卷,为新的Alpine分区腾出空间,并将其格式化为ext4。
-
将Alpine系统复制到新分区(指南)。
-
通过运行update-grub2重新生成我的GRUB菜单项。
-
调整GRUB条目,允许启动到Alpine(见下文)。
就这样。工作’几个小时,我现在可以登录我全新的阿尔卑斯Linux安装,用Ubuntu和视窗系统启动了三次
开始与阿尔卑斯山
现在我能够成功地引导到Alpine,是时候进行一些基本的设置步骤了。
连接到Wi-Fi
首先,我需要一个有效的互联网连接。
我的笔记本电脑’有线网络插座,我的USB RJ45适配器坏了,所以我唯一的选择是无线网络。这个阿尔卑斯维基页面,“连接到无线接入点”,非常清楚地描述了无线网络设置过程,所以我能够非常快地连接到我的工作无线网络(具体来说,我遵循了“手动配置”步骤)。
为了开始在阿尔卑斯山使用无线网络,有两个基本的包需要安装:无线工具和wpa_supplicant。事实证明,我在扩展国际标准化组织上的赌注得到了回报:它将这些包包含在离线apk数据库中,而不是标准的国际标准化组织。这让我省去了使用同事的电脑从阿尔卑斯包目录下载这些包的麻烦(顺便说一句,非常棒!), 将它们复制到u盘上,安装到阿尔卑斯山,然后手动安装. apk文件。
现在我有了网络连接,我能够更新apk存储库索引并安装一些便利包,如bash、coreutils和nano。
准备构建环境
在这一点上,我有一个不错的工作Alpine命令行,所以我很适合准备构建环境。
与Ubuntu build-本质类似,构建基元包是安装最常见的构建工具和实用程序的一个很好的起点,包括g++, make和binutils。为了构建我们的C++堆栈,我需要其他几个包,包括cmake和linux头。
一些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讨论的当前状态)。目前,我对open jdk 8包很满意。
最后,期待着激烈的调试,我继续安装了gdb和strace,以及musl和OpenJDK调试符号,分别在musl-dbg和open jdk8-dbg包中提供。来吧,阿尔卑斯山!
提示:对于边缘和最新的包,您可能希望将边缘存储库添加到您的/etc/apk/repositories文件中,如包管理页面所述。例如,lldb目前仅在边缘可用。然而,边缘包是实验性的,所以要小心使用。
安装桌面和****IDE
Alpine有各种各样的桌面可用,包括GNOME、MATE和Xfce。我’还不熟悉Xfce,所以我决定试一试。和往常一样,Alpine Wiki是一个很好的起点。“Xfce设置”页面详细介绍了安装和启动Xfce所需的所有步骤。最重要的是,要安装的包是xfce4–桌面本身,以及高山桌面。后者是一个非常全面的元包,提供默认的Alpine桌面体验,包括火狐网络浏览器、AbiWord编辑器、大胆的声音播放器等等。
小贴士:别忘了’安装一个字体包,比如字体符号。否则,你’会得到奇怪的文本空白方块,一些图形用户界面应用程序可能会崩溃或行为不端。这花了我相当多的时间才弄清楚!
我的Alpine谜题中缺少的最后一块是为C/C++和Java开发找到合适的IDE。在这里,musl-gl ibc兼容性问题变得非常痛苦。例如,找不到与musl兼容的Eclipse CDT构建,所以没有gl ibc兼容性层,就不可能在Alpine上运行Eclipse。我对命令行’满意,但是我真的很想要一个合适的IDE,尤其是用于调试。
幸运的是,我们有JetBrains IDE系列。IntelliJ、CLion和JetBrains的其他IDE都运行在JVM上,并且不直接依赖于底层的libc实现。由于OpenJDK JVM与musl完全兼容,任何标准的Java应用程序都可以开箱即用,IntelliJ和CLion也是如此。我’是IntelliJ的超级粉丝,所以我很高兴看到它在阿尔卑斯山上也能正常工作。真是如释重负!
值得注意的是,虽然IntelliJ的社区版对每个人都是免费的,但CLion只有30天的评估期(尽管学生可以申请免费的学术许可证)。目前,这就足够了。
就是这样–我被设置了我的Alpine桌面环境!