LWN: 让container更加安全

Linux工程师转型AI:必备技能与实战案例 随着AI技术重构技术栈,Linux工程师面临转型挑战。理解容器化技术(如Docker和Kubernetes)及其在AI基础设施中的应用是关键,特别是在GPU资源管理和性能调优方面。通过工具链(如eBPF和NVIDIA nsight)进行系统性能分析,可以优化AI负载的延迟和吞吐。实际场景中,如分布式训练集群搭建和模型服务性能优化,展示了Linux系统调优在AI时代的价值。掌握这些技能,Linux工程师可以顺利转型为AI基础设施专家或系统调优师,满足边缘AI部署等新兴需求。 阅读详情

640

点击上方蓝色“Linux News搬运工”关注我们~

Making containers safer

By Jake Edge


LSS-NA

在Linux Security Summit North America (LSS-NA)会议的第一天,Stéphane Graber和Christian Brauner做了一个联合演讲,介绍了container security (容器安全)的现状与未来。他们俩都在Canonical负责LXD项目相关的研发。Graber是项目领导人,Brauner是维护者(maintainer)。他们研究了kernel里面多种可以用来让container更加安全的技术,据此给出了一些建议。

Caring about container safety

Graber首先问道:“为什么我们会关注容器安全?” 他认为并不是所有人都关心的,不过Linux container project(包含LXD和LXC)已经在container领域钻研超过10年时间了。LXC和LXD用来创建“system containers”,可以运行各种无需专门修改的Linux发行版镜像,这一点同docker不一样,docker创建的是"application containers"。它的目的是让LXD用户在运行Linux发行版的时候就像是在一个虚拟机(VM)里面一样,也就是说,根本意识不到他们其实运行在container里。

640

system container的管理员通常会给用户SSH 访问container里的系统的权限,这些用户就可以自己在Linux里面做任意动作了。这就是为什么这个项目会很在乎安全。他们已经使用了所有能想到的技巧来让container更加安全,包括:namespaces,cgroup,seccomp filter,Linux security modules (LSMs),等等等等。目标就是能让这些container运行起来就像是个VM虚拟机。

因为这个项目是针对system container的,所以每天会针对18种Linux发行版编译出总共77种映像文件。其中也包括一些不太流行的发行版。还会编译Android映像文件。除此之外,LXD也包含在了Chromebook上Chrome OS里Linux桌面的一部分。Chrome OS里面每个用户都有一个单独的VM,Linux桌面发行版就运行在一个container里面,包含一些外部存储空间。得益于GPU passthrough等功能,桌面可以跟Chrome OS无缝集成起来。

无论使用上述哪种发行版,用户都可以在这些container里面执行任意代码。因此Linux container需要非常关注安全方面。

Privileged versus unprivileged

目前container可以分为两大类,一类是privileged,一类是unprivileged,不过Linux kernel并不会意识到有container这么个概念,container只是一个纯粹的user-space的、利用kernel提供的机制构建出来的东西。Privileged containers是指这样的一类container:container内部的root跟container外部的root是同一个用户(也就是UID都是0)。对unprivileged container来说则不同,container内部的UID 0用户其实是被映射到了container外部的某个unprivileged用户,这是通过user namespace来实现的。

可惜的是,今时今日在用的container,大多数都是privileged container。包括绝大多数Docker container以及Kubernetes里面运行的大多数container。这样做的主要问题是,如果攻击者能有办法攻破container的限制能触碰到host系统的话,它就会拥有host系统的root权限,这样整个系统就全部沦陷了。因为container的安全性很依赖于LSM,Linux capabilities,以及seccomp filter。而privileged container的用户权限没有隔离好,因此各种安全机制都很有可能会不保险。

LXD项目的假设就是privileged container永远无法做到安全,要想获得安全性,就不要使用privileged container。虽然LXD实现中想尽办法去堵住它所意识到的各种漏洞,不过仍然强烈不建议使用privileged container。

对于unprivileged container就好多了,因为container内部无法访问host系统上的UID 0用户,万一破出container了,虽然是一个重大风险,却比privileged container场景好得多,不会造成那么严重的破坏。并且还有一种工作模式,系统中各个LXD container都使用了host系统上互不重复的UID和GID范围,这样危害就更加有限了,哪怕破出了container,也只是拥有自己特有的UID和GID权限,而无权干涉其他container进程和host系统。

User namespace是kernel 3.12开始引入的功能,不过很少有其他container管理系统(CMS)会利用这个功能来对container做隔离。其中主要原因就是如果用了UID mapping之后,在各个container之间互相共享文件就会变得很麻烦。LXD则在Ubuntu系统上使用shiftfs来做各个container之间的UID转换,从而能实现大家共享host文件系统的一部分的功能。shiftfs暂时还没有合入upstream,希望不久之后mount API能拥有类似的功能。

The perils(严重危害) of privileges

640

接下来,Brauner接替了Graber继续进行演讲,首先他也问了一个问题:“privileged container真的那么不安全吗?”。他的回答是“绝对是的”。他列举了六七个“很严重”的CVE报告,是过去几年里面privileged container深受其害的。包括CVE-2019-5736,是二月份暴露的runc container-confinment破出(breakout)问题,为今年的container security领域开了个坏头。据他所知,所有这些CVE都无法攻破LXD创建的unprivileged container。一般人总以为把现有的安全机制都用上是件很容易的事情,不过其实不是。经常有一些攻击是可以用安全机制来阻止的,但是container管理员都因为这样那样的原因没有使用这些防护。有一些时候是因为安全机制的文档不完善,这是kernel开发者应该改进的地方。

首先以namespaces来说,他认为没有得到广泛使用。在application container世界里,namespace用的太少了,通常只用了mount namespace。其实所有各种namespace都是有安全防护价值的,能隔离一些资源避免受到系统其他部分被攻破之后的影响。最有用的namespace就是user namespace,可以把各个container的权限(privileges)都分隔开。

Namespace的API确实不太好用。kernel开发者应该想办法再改善一下。能在container启动的时候创建好各种namespace很有必要,除此之外没有什么办法能对把进程通过setns安全的(保持原子操作特性)绑定到所有namespace里去。Brauner说他有一些想法可以改善这部分。

接下来是seccomp filter,这是对privileged container来说必备的保护。比如,如果privileged container有全县能调用open_by_handle_at(),就相当于马上攻破了系统,拿到了本不该访问到的信息。Seccomp filter对unprivileged container来说也相当于增加了一层防护网,不过并不是必须的。因为通常来说unprivileged container都会维护一个system call黑名单,避免调用这些syscall。而privileged container则应该是创建一个白名单,只允许少数的安全系统调用。

LSM对于privileged container来说也是必须的。在procfs和sysfs里面不应该允许所有文件都能被访问,否则container可能会被攻破。container管理者最常用到的LSM就是SELinux和AppArmor。不过其他还有些次要一点的LSM(因为LSM支持叠加)也应该加进来一起保护系统。

Recent and future features

Brauner描述了一些近期加入kernel的安全功能,以及后续大家期望能加入的功能。Linux 5.0里面加入了让user space来做seccomp filter决策的功能,这样user space就能检查系统调用的参数而不出现race condition,这样像路径名这样的参数也就能审查了。LXD会用这个功能来允许container里的Linux发行版去调用mknod()创建某些设备节点(例如/dev/null),而不允许创建那些对container有安全风险的设备节点。此前要想做到这一点,就需要把host文件系统的安全设备mount进来。

他觉得这里让user space来决定,是一个非常精巧的设计。不过还是有一些问题,例如,这就导致user space去处理系统调用了,从而会引入一些需要小心处理的权限问题。如果系统调用审查之后是合理的,那么就需要在container用户的上下文、用这个用户的权限来执行,而不能用container管理器的权限。

这样,这个功能用起来就有些麻烦了。最好能有个办法告知kernel直接继续完成这个系统调用就好了。还有个问题是某些系统调用会有一些flag参数,例如clone3()这样,因为这些flag不是直接作为参数传递的,而是嵌入在一个结构里面,只把结构指针传递给了系统调用。这样依赖,kernel里的seccomp filter救没法拿到flag的值了,因为seccomp filter只能访问参数本身(在寄存器里)而不能访问指针指向的内容。他给ksummit-discuss mailing list发了一个seccomp的邮件,希望能在September的Kernel Summit开启这个议题,讨论一下这些麻烦的问题,看如何解决。

LXD项目也很希望能把这些主要的LSM(SELinux, AppArmor, 还有Smack)都堆叠起来使用。希望让host和container内部能使用不同LSM方案,例如Android container里面运行的是SELinux,而container可能是运行在Ubuntu系统(使用AppArmor)上的;或者可能要让一个Ubuntu container运行在Fedora(也是使用SELinux的)上。如果能实现就会很方便。

Linux 5.3里面包含了SafeSetID LSM,可以做到只允许白名单中的UID/GID转换。这个功能来自Chrome OS,对privileged container也会很有帮助。

新加的moutn API把mount()这个系统调用分成了好几个独立的调用,这样对于container管理器来说就可以多一些很高级的用法了。例如,现在允许anonymous mount,就是mount的内容没有对应到文件系统的路径上,不过仍然允许拥有这个mount descriptor的进程访问其中的文件。这可以用来做UID/GID shifting(加偏移值),从而不用再使用shiftfs了。

Brauner还提到了pidfd功能(process ID file descriptor)。pidfd是指向某个进程的一个文件描述符,发signal的时候就可以避免发错对象(此前,如果PID被废弃又被另一个进程很快重用了,给PID发signal就会发错对象)的问题。pidfd也能让进程拿到其他进程(不限于自己的子进程)的退出通知。pidfd在LXD里也有应用,后面他期待会有更多pidfd的高级用法。

最后总结到了,Graber认为其他container manager(管理器)可以从LXD的工作中学习这些优势。他认为应该尽快停止使用privileged container,开始使用user namespace,不过其他这些container manager确实需要会针对自己特定情况来决定方案。他的判断是,除非container能把权限隔离做好,否则container不可能做到真的把用户操作的影响局限在container内部。

[I would like to thank LWN's travel sponsor, the Linux Foundation, for funding to travel to San Diego for LSS-NA.]

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

640?wx_fmt=jpeg

fs-verity-rs:不使用libfsverity的Rust支持Linux的fs-verity fs-verity 此板条箱实现了用于处理Linux内核的fs-verity功能的实用程序。 什么是fs-verity ? 它使您可以使文件永久不变,并使内核为该文件计算并存储基于的哈希,可以立即从该文件检索该哈希。 内核还将再次验证从文件读取的所有数据以及Merkle树数据,如果不匹配,则拒绝读取。 这意味着(只要您信任正在运行的内核),就可以绝对确定此即时可检索的哈希将与您从文件读取的数据匹配。 您应该通过其他方式来确定哈希是否是预期的哈希,例如检查哈希是否在已由某些密钥签名的可接受哈希列表中。 内核的fs-verity代码确实实现了基本的(和可选的)内核内签名验证方案。 但是,由于您仍然必须手动检查打开的文件是否启用了fs-verity ,因此它不会增加太多价值,并且可能更多是概念验证。 此板条箱目前不支持此方案。 当前, fs-verity仅在f2fs和ext4文件系统 立即下载

相关推荐

STM32外围电路硬件解析

复位 :让MCU回到最开始的状态。并且从头开始,重新执行程序 我们什么时候需要复位? 1.烧录的时候 2.程序跑飞了的时候 3.上电复位(上电的时候需要复位) 复位方式: 1.上电复位: --- 一定要有 MCU的Reset是复位引脚,当这个引脚为低电平时,

qq_39577221的博客 1万+

LWN:丢弃文件系统的page cache!

关注了就能看到更多这么棒的文章哦~Dropping the page cache for filesystemsBy Jake EdgeJune 11, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/977486/VFS 维护者 Christian Brauner 在 2024 年的Linux 存储、文件系统、...

Linux News搬运工 1687

中国传媒大学计算机考研初复试经验贴

中传的计算机专业考研的话主要分为两大学院:计网学院和国重,大部分专业在计网学院。

DoKiDoK的博客 1559

Udacity Nanodegrees 项目教程

Udacity Nanodegrees 项目教程 1. 项目介绍 Udacity Nanodegrees 项目是一个包含所有 Udacity 纳米学位课程的列表,并提供了每个课程的免费学习链接。该项目旨在帮助那些没有足够资金或不愿意支付费用的学习者,通过免费课程来学习纳米学位中的内容。虽然这些免费课程不能替代实际的纳米学位项目(包括项目评审、额外的学生和职业指导以及工作保障),但它们提供了高质量的...

gitblog_00018的博客 683

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析)

本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。

weixin_29184371的博客 491

Visual Studio 6.0 镜像下载全指南:从企业版到中文版

本文提供Visual Studio 6.0企业版和中文版的镜像下载全指南,包括详细版本解析、已验证的下载链接及校验信息。针对现代系统的安装技巧和兼容性处理方案,帮助开发者高效获取并运行这一经典开发工具,特别适合维护遗留系统的专业人员。

weixin_33712987的博客 985

19 | 容器安全(1):我的容器真的需要privileged权限吗?

本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。 下面说下容器安全的模块。 容器的安全很大程度由容器的架构特性决定的:比如容器与宿主机共享Linux 内核,通过Namespace来做资源的隔离,通过 shim/runC 的方式来启动等。 这些容器架构特性,在选择使用容器之后,作为容器的用户,其实没有多少能力去对架构层面做安全上的改动了。 你可能会说用Kata Container、gVisor 就是安全“容器”了。不过,Kata 或者 gVisor 只是兼容了容器接口标准,而内部的实现完全是另外.

草办的学习记录 2461

CTF实战:Wireshark数据包分析从入门到精通(附经典题型解析)

本文详细介绍了Wireshark在CTF比赛中的数据包分析技巧,从基础抓包到高级协议解析,涵盖HTTP流量分析、USB键盘数据还原等实战案例。通过经典题型解析,帮助读者掌握精准过滤、文件提取等核心技能,提升CTF竞赛中的网络流量分析能力。

pz890123的博客 586

容器安全问题综述

文章目录背景基于软件的保护机制Linux内核特性namaspaceControl GroupsCapabilitySecure Computation Mode(SECCOMP)基于硬件的保护机制 paper: Container Security: Issues, Challenges, and the Road Ahead 容器相比虚拟机有许多优势,容器可以50毫秒启动,虚拟机则需要几十秒,而且在容器在资源占用方面也比虚拟机小很多。现在流行的微服务架构与容器技术完美的结合。 不过市场调查显示对其

yijiull 1097

C# Blazor Server工业监控Web UI:实时数据推送、历史曲线、报警记录,跨浏览器访问(踩坑总结+生产可用)

坑点现象解决方案StateHasChanged()太频繁服务器CPU占用高,浏览器卡顿别100ms刷新一次,1秒刷新一次足够并发高时服务器卡多个用户同时访问,服务器响应慢用Redis做分布式缓存,或者加服务器做负载均衡断线重连后数据丢失浏览器刷新后,实时数据不更新用InfluxDB存历史数据,刷新后重新查询工业现场网络不稳定Blazor Server频繁断线用SQLite本地缓存,断网时数据不丢,联网后补发历史曲线查询慢查询过去7天的数据,要等很久。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 303

第7章: MMU notifier在AMD GPU驱动中的应用

AMD GPU驱动利用MMU Interval Notifier机制实现共享虚拟内存(SVM)和异构内存管理(HMM)。通过分析AMDGPU内存架构(VRAM、GTT、Userptr)和Buffer Object设计,重点探讨了Userptr零拷贝机制如何依赖MMU notifier保持CPU/GPU内存一致性。HMM框架进一步实现统一地址空间和透明页面迁移,AMDGPU通过amdgpu_hmm.c实现两种invalidate回调(GFX和HSA模式),处理不同场景下的内存失效同步问题。

图形/计算GPU的驱动与虚拟化技术分享园地 2463

【K8S认证】2023年CKS考题-Container安全(解析+答案)

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

xnxqwzy的博客 925

Android系统开发工程师面试指南与参考答案

本文整理了Android系统开发工程师面试常见问题与参考答案。核心内容涵盖:1)Framework层定制方法,如修改HAL和系统服务;2)ANR问题分析工具(systrace)与解决方案;3)性能优化实践,包括开机加速和功耗管理;4)四大组件工作机制与应用案例;5)Native崩溃调试技巧。文章强调通过AOSP源码研究、工具使用和项目案例准备来提升面试表现,重点考察应聘者的系统开发深度和实操能力。参考答案均基于实际开发经验,提供可量化的优化成果说明。

郑伟强dev的专栏 255

LWN:可由BPF编程的网络设备!

关注了就能看到更多这么棒的文章哦~The BPF-programmable network deviceBy Jonathan CorbetNovember 6, 2023ChatGPT translationhttps://lwn.net/Articles/949960/在 Linux 上,容器和虚拟机是通过虚拟网络设备与世界通信。这样就使得其可以利用 Linux 网络协议栈的全部功能了,但也引...

Linux News搬运工 1040

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LWN:将进程的可执行文件对它自己隐藏起来!

关注了就能看到更多这么棒的文章哦~Hiding a process's executable from itselfBy Jonathan CorbetJanuary 23, 2023DeepL assisted translationhttps://lwn.net/Articles/920384/早在 2019 年的时候,由于一个重要的容器(container)漏洞 (https://lwn.n...

Linux News搬运工 465

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

LWN:6.6合并窗口的前半部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.6 merge windowBy Jonathan CorbetAugust 31, 2023ChatGPT assisted translationhttps://lwn.net/Articles/942954/截至目前,已经有4588个non-merging changset合并到了6.6内核版本的mainlin...

Linux News搬运工 1020

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LWN:如何确定采用dlopen()方式引入了哪些依赖!

关注了就能看到更多这么棒的文章哦~Identifying dependencies used via dlopen()By Daroc AldenApril 16, 2024ChatGLM translationhttps://lwn.net/Articles/969908/最近的XZ后门事件在开源社区中引发了很多关于如何链接和打包软件的讨论。正在讨论的一个可能的安全改进是更改 systemd ...

Linux News搬运工 333

LWN:OpenSUSE MicroOS Desktop - 基于Flatpak 的不可更改发行版!

关注了就能看到更多这么棒的文章哦~OpenSUSE MicroOS Desktop: a Flatpak-based immutable distributionMarch 29, 2023This article was contributed by Koen VervloesemDeepL assisted translationhttps://lwn.net/Articles/927373/...

Linux News搬运工 1880

The GPU Memory Subsystem as a Mirror of CPU Memory Management: A Structural Analogy

Abstract: The Linux GPU memory management subsystem (TTM/GEM/GPUVM) is a domain-specific reimplementation of classical CPU virtual memory principles, adapted for accelerator hardware.

图形/计算GPU的驱动与虚拟化技术分享园地 698

centos 安装git_理解docker [三] git与overlayfs

本系列文章是以docker为主题展开的,但讲到现在,还没有说明docker的具体使用方法。这是因为要理解docker的使用,还缺了一项关键技术的介绍,即union filesystem。假设有三个文件系统,它们的目录和文件布局如下图所示:现在将它们按照从左到右的顺序,层层堆叠起来:这实际上是做了一个合并,其结果就是:如果底层在某个目录下有文件而顶层没有,那么合并后你还可以看到它,而如果顶...

weixin_39747568的博客 103

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 442

深入理解Linux网络技术内幕 P1-P2

细品

西门吹雪 539

Docker 安全问题与防护 (学习笔记)

文章目录1. Docker面临的安全问题1.1 Docker简介1.2 Docker安全问题2. Docker安全方案2.1 Docker安全基线2.2 Docker安全规则2.3 Docker镜像安全扫描与审计2.4 Docker入侵检测2.5 Docker容器安全隔离与资源控制2.5.1 namespace2.5.2 cgroup2.6 Docker容器系统调用和文件访问的权限控制2.7 安全管理docker容器敏感信息3. 竞品厂商3.1 [neuvector](https://neuvector.c

pwl999的博客 2619

Container Security Checklist完全指南:从镜像到工作负载的终极防护方案

容器技术已成为现代应用开发和部署的核心,但随之而来的安全挑战也日益凸显。**Container Security Checklist**作为一份全面的安全指南,从镜像构建到工作负载运行,为容器安全提供了端到端的防护策略,帮助开发者和运维人员系统性地降低安全风险。 ## 云原生环境的安全挑战 传统应用与云原生应用在安全需求上存在显著差异。云原生应用具有频繁发布、大量使用开源组件、工作负载短暂且分

gitblog_01091的博客 751

DINOv3企业级部署实战指南:5大高效架构策略助力视觉AI规模化应用

DINOv3作为Meta AI最新发布的自监督视觉基础模型,正在重新定义企业级视觉AI应用的开发范式。这款革命性的视觉Transformer模型通过自监督学习生成高质量的密集特征表示,在无需微调的情况下即可在多种视觉任务中超越专业领域的最新成果,为企业提供了强大的视觉AI基础设施解决方案。 ## 项目核心价值与战略定位 DINOv3的核心价值在于其**零样本泛化能力**和**企业级可扩展性**

gitblog_00715的博客 796

K8s攻击案例:Privileged特权容器导致节点沦陷

01、概述特权容器(Privileged Container)是一种比较特殊的容器,在K8s中运行特权容器,需要将Privileged 设为 true ,容器可以执行几乎所有可以直接在主机上执行的操作。基于此,利用容器的特权配置可以获取容器所在节点的权限,甚至从节点权限提升至集群管理员权限。02、攻击场景编写yaml文件,在securityContext中加入参数,将privileged设置为t...

8174
上一篇: LWN: 华为EROFS能应对好损坏的文件系统数据吗?
下一篇: 2019年,Greg怎样使用mutt
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值