电脑使用的用途和需求对内核配置也是会有很大的影响,比如说是个人电脑桌面系统desktop or 架设服务器集群server、是否使用虚拟化(kvm、virtualbox虚拟机)、是否是64位CPU、64位系统是否打算兼容32位应用程序(multilib)、电脑内存容量是否够大、是否使用initramfs(旧称initrd)、是否做内核开发、是否使用linux作程序开发、是否做debug等。
#目前除Gentoo以外的所有发行版,其内核均是标配vmlinux+initramfs,而且这个initramfs一般在250mb左右,体积还是比较大的。这是发行版考虑到了用户类型广泛,为了照顾到各种不同的电脑和硬件,所以才在设计出了这种大而全面的内核出来,这种内核:一、开启了很多不必要的内核功能,而且很多都是针对服务器或超级计算机的功能,并不适用于普通的个人桌面系统;二、没有专门的针对某一种CPU进行优化,只是简单的将Processor type and features-->Processor family设置为“Generic-x86-64”;三,将几乎所有的内核树内驱动全部编译为模块,然后全部打包放在一个initramfs里,虽然能够灵活动态加载,但是加载效率低下。
#我不喜欢systemd,因为这货就和大内总管一样,什么东西都有涉及,而且随着开发的更新,更是越来越开始加入各种各样花里胡哨的功能,what a mess it is!! 我怀疑总有一天systemd会从linux主干里分离出去,成为一个“完整”的systemd OS,或者成功篡位主导linux内核的开发。~~这可真是可怕,未来的linux会被systemd搞成什么样,想想都会起鸡皮疙瘩。
转载
手工编译linux桌面内核(一)——内核总体设置和性能调优
前言:
关于linux内核的配置,不同的电脑硬件会有很大的不同,其中最主要的就是CPU和显卡了,这个系列的文章都是基于我自己的炫龙毁灭者DD2游戏笔记本(Intel i5 8400 CPU、UHD630核显和Nvidia GTX 1050 Ti独显、8GB内存)写出来的。所以这些文章只能是作为你在配置自己的内核时的参考,真正具体的配置得上Gentoo Wiki根据你自己的硬件配置仔细查阅对照。 基本上2015年以后生产的电脑都适用于此系列配置。
这个系列的文章使用的是Gentoo提供的官方内核(sys-kernel/gentoo-sources),目前版本为5.4.48,算是比较新的内核了。很多的配置都是得益于参照金步国先生的内核配置文章(linux 4.4版本),外加自己一步一步翻译各条选项的help、上网查阅相关资料,整整花了一个星期的时间才确定最终的方案。成果来之不易,过程也很痛苦,所以为了节省刚刚接触配置内核的爱好者们的时间,我打算把我的内核配置分享出来以供大家参考,相信在有前人踩坑的前提下,后来的人再来走这条路就会好走很多了。
电脑使用的用途和需求对内核配置也是会有很大的影响,比如说是个人电脑桌面系统desktop or 架设服务器集群server、是否使用虚拟化(kvm、virtualbox虚拟机)、是否是64位CPU、64位系统是否打算兼容32位应用程序(multilib)、电脑内存容量是否够大、是否使用initramfs(旧称initrd)、是否做内核开发、是否使用linux作程序开发、是否做debug等。
本系列文章的定位是:打造一个适合于个人用桌面系统的、能够快速响应的桌面内核,并且以牺牲内核总体吞吐量和内核安全性为代价,尽可能的提升桌面程序的响应速度。 外加只是用来作为平平常常的家庭办公、娱乐、游戏用途的普通桌面系统,不做内核开发、不做程序开发、不做debug、不跑虚拟机。
配置内核的总体原则是:在保证电脑基本功能能够正常发挥、且满足电脑使用需求的前提下,尽量精简一切不必要的内核功能和驱动模块,达到真正的内核个人定制化,直到编译出只适合于自己电脑的小而精美的内核。并且禁用内核里的一切与程序开发、测试、debug的特性。 这与genkernel追求的大而全面的目标不同,手工配置内核的优点就在于能够完全自由的定制裁减自己的个性内核,充分发挥自己电脑的性能。
图片里每一项内核配置都是经过仔细阅读说明、仔细斟酌后才选定或禁用的,因此每一项配置都是有理由据,并没有毫无根据地沿用genkernel的“默认”配置,所以也算是我的劳动成果了。请仔细对照我的图片里的设置以及文字,尽量不要看漏,为了压缩文章的篇幅,一些多余的图片我是省略掉了的。
看完这个系列的文章后,你应该能够做到脱离genkernel,完全自主自由地定制自己的内核。我总共花了一个星期的时间来完成配置,你在我的基础上参照着设置,应该只需要1-2天吧?
作为本系列的第一篇文章,主要内容是根据自己的CPU定制内核功能、调优性能。 文章多图预警!!请注意自己的流量。
以下是我的电脑的具体硬件配置:
零、配置界面总览
你将会看到——
#我的CPU为64位,所以需要选定“64-bit kernel”,不过现代的CPU都是64位的了,除非你用的是很老旧的32位电脑。
#我不打算在自己的gentoo系统里跑kvm或virtual box虚拟机,所以我直接把“Virtualization”禁用,顺带也把BIOS里intel cpu的vt-d功能禁用了。
#键盘上下方向键可移动选项光标、带有“--->”的选项可按Enter键进入具体设置子选项;按下键盘Y字母键表示启用该选项并将它直接编译进内核静态加载,选中后选项前会有“*”的提示;按下键盘M字母键表示启用该选项并将它编译为模块module动态加载,选中后选项前会有“M”的提示;按下键盘N字母键表示不启用该选项且不编译该项功能,即禁用此选项,选项前的提示为空。
#键盘左右方向键是在最下面的“Select Exit Help Save Load”之间移动切换,选中后按Enter键进入。
#建议在开始真正的配置内核前先把以上基本操作熟悉一下。
#内核配置完后,我建议你同时将配置“Save”到.config和bak.config这两个文件中,其中.config文件是内核编译的默认配置文件,而不是bak.config。也就是说,编译内核时gcc编译器读取的是.config文件里的配置;这里bak.config只是作为配置的备份文件,免得.config里的设置出错以后,还可以“Load” bak.config进行回滚。 所以建议配置内核一步一步的来,新的改动先保存到.config里,然后编译内核试试看效果,如果改动没有问题了,再保存到bak.config里,如此循环反复、步步递进,最终确定下来的bak.config文件,就是自己稳定可用的内核配置,可以当作传家宝了。 骚年,没有人的内核配置是一步完成滴~~
#选项前是“[ ]”的,只能按Y编译进内核,不能按M编译为模块;选项前是“< >”的,既可按Y编译进内核,也可按M编译为模块。选项前是“--”或“-M-”的为固定选项,不能取消或禁用,但“-M-”能按Y键改为“--”。
一、Binary Emulations
#此界面表示你是否愿意在64位系统上兼容运行32位的应用程序(multilib),建议选中开启“IA32 Emulation”。因为目前仍有较多的程序是32位的,比如wine上运行的QQ、微信等windows程序就是32位的,还有Steam里的一些游戏也是。 除非你是铁了心想与过去的32位程序完全决裂,走上新时代的道路,打造一个只有64位程序的“纯洁”的系统(no-multilib),那么你大可直接把这两项都禁用。
#“x32 ABI for 64-bit mode”是64位系统上兼容运行32位程序的另一个接口实现,但是非常不实用,目前很多程序都不支持x32 ABI的编译,而且gentoo portage里所有程序包的USE flags都是“ABI_X86=64 -32 (-x32)”或“ABI_X86=32 64 (-x32)” ,即默认禁用x32 ABI;另外Linux 内核开发人员正在讨论删除对 x32 ABI 的支持了。 所以你大可放心禁用此选项。
二、General setup
#关于initramfs(旧称initrd),由于很多发行版的内核都集成了initramfs,结果导致很多人误以为initramfs是linux内核必不可少的一部分。然而Gentooer告诉你,initramfs并不是必须的!! 只要把根分区/的文件系统支持和硬盘的驱动选Y直接编译进内核之中(后续的文章中会讲到),而不是选M编译为模块,那么单个的vmlinux内核是完全能够不依靠initramfs而实现自启动的。 怎么样,神奇吧?这就是gentoo的最大优点,完全的定制自己的内核和系统。 而且少了initramfs之后,内核启动时就不用再花时间加载initramfs,这样内核的启动时间就能够缩短,开机加载速度更快。 因此大可放心禁用“Initial RAM filesystem and RAM disk (initramfs/initrd) support”,完全不需要依赖initramfs。更具体的配置方法,请看本系列的第三篇文章——《手工编译linux桌面内核(二)——硬件驱动的配置 下篇》。
#为了打造能够快速实时响应的桌面系统,你需要将“Preemption Model”设为“Preemptible Kernel (Low-Latency Desktop)”、将“Timer tick handling”设为“Idle dynticks system (tickless idle)”、将“Cputime accounting”设为“Simple tick based cputime accounting”。
#建议启用“High Resolution Timer Support”,一些视频或音频程序需要开启此项支持,以获得良好的音视频体验,如pulseaudio。
#即便你的内存很大,如16G内存,我还是建议你划分出一个swap分区出来。swap分区有一个很好的特性,当系统休眠时,需要从内存中将数据移出保存到swap分区中,如同windows系统开关机界面的“睡眠”,此时swap分区就充当了windows C盘里虚拟内存页面文件的功能。所以可想而知,linux系统的休眠功能依赖于swap分区;没有swap分区,你的系统就没有休眠功能。
#“Auditing support”这一项是为了支持SElinux,不过普通人甚至大多数服务器都用不上SElinux这么高级的安全体系,所以可以禁用。
#使用intel核显开源驱动mesa的,必须开启“Checkpoint/restore support”。
#“Automatic process group scheduling”,这号称linux桌面系统的“鸡血补丁”,开启后能显著降低操作延迟、提升程序响应速度,所以怎么能不开启呢?
三、Processor type and features
#由于我使用的是intel的cpu,所以我把amd、ibm等除intel之外的一切cpu硬件支持全部禁用了。
#为了打造能够快速实时响应的桌面系统,你需要将“Timer frequency”设为1000hz。
#“Avoid speculative indirect branches in kernel”表示给内核打上retpoline补丁。2018年Intel、AMD和ARM处理器均爆出了Meltdown(熔断)和Spectre(幽灵)内存崩溃漏洞,几乎涉及了以往开发的每一款处理器,其影响几乎遍及全世界的每一台电脑。retpoline补丁就是为了补上这两个严重的漏洞的,但是会带来一个不好的问题,那就是CPU性能的下降。所以为了提高性能,我选择禁用此选项,以牺牲内核安全性的代价换取性能。
#添加如下内核参数——
以禁用spectre_v1、spectre_v2、spectre_v4补丁,这些都会影响CPU性能。
#我是在我的笔记本实体机上跑Gentoo,而没有在虚拟机里跑,所以禁用“Linux guest support”。话说在虚拟机里编译Gentoo系统的人,难道不觉得等的时间很长吗?
#“Maximum number of CPUs”表示系统支持的CPU物理核心数目,注意是实际的物理核心数而不是虚拟的超线程数哦。我的intel i5 8400是6核心,所以设为6。如果你是i7或i9那样的土豪,那么大可设置为8或16。
#“TSX enable mode”我设为on,这也是一项牺牲内核安全性换取性能的实现。英特尔事务扩展技术(TSX)是intel为旗下的CPU开发的一项优化指令集,但是存在僵尸负载漏洞(ZombieLoad)。开启TSX后,能感觉到CPU在编译程序时速度有小幅度的提升。
四、IO Schedulers
#为了打造能够快速实时响应的桌面系统,你需要启用“BFQ I/O scheduler”,即当下在各大桌面发行版如Ubuntu、Manjaro、SUSE中广为流行的BFQ调度器。 其余两个调度器可放心禁用。 另外以前的CFQ调度器现在已被BFQ调度器取代。
#关于MuqSS调度器(旧称BFS调度器),接触过linux桌面系统的人都知道这是由澳大利亚的一位麻醉医生Con Kolivas专门针对桌面系统设计的I/O调度器,旨在提高桌面程序的响应速度,非常著名。 所以也许有人会指出,既然追求快速实时响应的桌面系统,那为什么不为内核打上MuqSS调度器的补丁patch,或直接使用ck内核(sys-kernel/ck-sources)呢? 抱歉,我已经尝试打过MuqSS补丁了,然而体验下来的结果是——桌面响应速度和只使用BFQ调度器相比几乎没有差别,而且MuqSS存在CPU过热、我的小本本风扇总是呼呼的转、电脑温度过高、CPU占用较高、CPU资源占用不均匀等问题,最典型的表现是htop下可以看到我的CPU六个核心中,即便是在不开启任何桌面应用时有3个核心CPU占用总是高达20%以上,有3个核心CPU占用却不超过5%,CPU资源分配非常不平衡。这些问题在使用BFQ调度器时都不存在。 ——嗯??? 所以我的建议是,不打MuqSS的补丁,只使用BFQ调度器即可。
五、Enable loadable module support
#对,只开启一个选项即可。
#如果你想做到把所有内核功能和驱动全部按Y编译进内核静态加载,而不编译任何一个动态加载的模块module,那么你可以在总界面里把“Enable loadable module support”这一项直接禁用,从而实现一个0模块的完整体内核,一个真正意义上的宏内核、一个高性能的内核。 我觉得这是一个很有意思的方案,也鼓励你们去尝试。 关于直接编译进内核Y和编译为动态模块M的区别,我会在后续文章中讲到。
#目前我已经实现了将所有的内核树内功能和驱动全部编译进一个内核之中了,但是除外nvidia的闭源驱动模块nvidia.ko、 nvidia-modeset.ko、nvidia-drm.ko、nvidia-uvm.ko这四个,因为它们均是属于内核树外驱动,无法通过常规的方法直接编译进内核之中。因此为了使用nvidia闭源驱动,我不得不开启“Enable loadable module support”,如果有人知道怎么把这四个树外驱动编译进内核的方法,我迫切地希望您能告诉我,谢谢!
#如果你用的是amd的独立显卡,那么恭喜你,你完全可以实现上述方案,因为amd有专门的linux开源驱动,而且这个开源驱动属于内核树内模块,可以直接编译进内核,so AMD yes!! But Nvidia fork you!!!
#有的人会指出,把所有功能和驱动全部直接编译进内核是没有意义的,不仅牺牲了模块按需动态加载调用的优势,而且会造成内核臃肿的问题。在这里我要提出反驳:第一,除非你的电脑硬件是经常更换或热插拔的,既然大多数人的电脑几年都不换一次硬件,那么驱动编译进内核静态加载和编译为模块动态加载又有什么区别呢?为了能够提高开机加载速度和驱动的利用效率,选择编译进内核静态加载不是更好的方案么?第二,如上述所说,在精简裁减了所有不需要的内核功能和驱动之后,目前除了nvidia驱动之外,我已经将所有的内核树内功能和驱动全部编译进一个内核之中了,用lz4算法压缩内核,并且不需要initramfs,这样的一个单内核vmlinux只有10mb,根本不存在所谓内核臃肿的问题。 而且这样的单内核开机加载速度飞快,硬件驱动的载入速度也很快。 所以很多东西就是这样,每当一个新的方案摆在你面前的时候,在否定这个方案之前请你至少先去尝试一下,你才有资格来作出评论。没有自己亲自实践过,单凭自己的臆想就来下定论,或人云亦云,是谁给了你这么大的自信?
#目前除Gentoo以外的所有发行版,其内核均是标配vmlinux+initramfs,而且这个initramfs一般在250mb左右,体积还是比较大的。这是发行版考虑到了用户类型广泛,为了照顾到各种不同的电脑和硬件,所以才在设计出了这种大而全面的内核出来,这种内核:一、开启了很多不必要的内核功能,而且很多都是针对服务器或超级计算机的功能,并不适用于普通的个人桌面系统;二、没有专门的针对某一种CPU进行优化,只是简单的将Processor type and features-->Processor family设置为“Generic-x86-64”;三,将几乎所有的内核树内驱动全部编译为模块,然后全部打包放在一个initramfs里,虽然能够灵活动态加载,但是加载效率低下。
#Gentoo的内核设计理念完全相反,它追求:一、针对特定电脑硬件CPU作出最佳的优化设置;二、根据你的具体应用场景需求,如个人桌面系统或服务器系统,作出不同的优化;三、尽可能的精简不必要的驱动,只保留电脑必要的驱动,从而大幅度减小内核的体积;四、不需要依赖initramfs即能完成开机启动;五、能够做到将所有功能和驱动全部编译进一个单内核中,加载效率比编译为模块的高。 总结下来,就是高度自主个性的定制化和性能的最大化。这样定制编译出来的单内核vmlinux,小而精美,高性能。 所以还用什么二进制发行版呢?Gentoo它不香吗? 咳咳,开玩笑的,选择什么样的发行版是你的自由,每个发行版都是平等的,都有自己的优点。
#关于genkernel,其实我很不建议用genkernel编译内核,它有很流氓的一点是,无论你的内核配置是什么,genkernel编译内核时会直接无视你的内核配置,强行覆盖上它默认的配置,然后生成一大坨臃肿的vmlinux+initramfs,如同绝大多数的发行版,开启了几乎所有的内核功能、编译了全部的驱动、驱动全部以模块方式加载,毫无精小可言,更谈不上性能和优化,而且有些功能或驱动之间还会相互冲突。 我用genkernel编译内核需要25分钟的时间,用我自己的配置编译内核只需要4分钟,高下立判。 genkernel出来的内核与自己定制出来的内核相比,桌面程序响应速度上还是有差别的。
六、Memory Management options
注释:
#“zswap.enabled=1”代表开机时由grub向内核传递引导参数,以开启zswap功能。zswap能够减少对swap分区的读写次数,对SSD而言可延长其寿命,而且由于在数据真正写入swap之前,数据交换是发生在内存中的zswap区域中的,所以读写速度会比SSD快上很多。zswap功能的另一个好处是,它可以变相的增加swap分区的容量,当然是以牺牲部分内存容量为条件。
#“zswap.compressor=lz4”表示zswap启用lz4压缩算法。lz4拥有卓越的解压缩读取速率,这也是我选择lz4算法压缩内核vmlinux的原因,加载速度会更快。
#“vm.swappiness = 1”表示在使用swap分区之前,尽可能地利用实际内存容量,直到内存严重不足必须依赖swap分区时。由于内存条的读写速度远远快于SSD,所以一定程度上能加快桌面的响应速度。
#以上设置均是建立在你的内存足够大的前提下(>=4G),充分利用你的大内存来提高桌面的响应速度。 但如果你的内存小,那么我建议你把图片里的“Transparent Hugepage Support”选项禁用,否则可能会导致你的内存被快速耗尽;而且也不建议你设置“vm.swappiness = 1”。 但是仍然建议你开启zswap功能,尽管zswap会牺牲部分内存容量,但是由于zswap作为内存和swap分区的缓冲区域,能有效的提高swap的读写速度,并且变相的增加swap分区的容量,而swap分区是作为内存不足的一个补充,所以zswap对于缓解小内存还是很有益处的。
#关于zram,linux内核中还有另一项和zswap类似的实现,叫zram。与zswap不同的是,zram不需要任何实际的物理swap分区,它的实现原理是直接在内存中开辟出一块固定大小的区域来,作为一个虚拟的swap分区,在内存容量不足的情况下,将多余的内存数据经过压缩然后放到这块区域中,从而变相地增加内存的容量。由于这个虚拟的swap分区存在于内存中,而内存的读写速度是远远高于SSD的,所以zram区域中数据解压缩的速度也是很快的,几乎感觉不到延迟,但是代价是需要更多的CPU资源来提供数据的解压缩计算。这项技术在windows和android平台上名叫“内存压缩技术”,但多用于手机等内存和nand容量均小的移动设备上。普通的个人电脑,因为你已经有足够的硬盘容量了,所以我更倾向于建议你在SSD上开辟一个物理的swap分区,使用zswap;有物理swap分区的另一个好处是,可以启用linux系统的断电休眠功能,这将在后续的文章中讲到。 除非你有足够的内存了,或者是想试试zram的特性。
#zswap和zram只能开启其中一者,非常不建议同时开启二者。试想一下,zswap是在内存中划分出一块内存和物理swap分区之间的缓冲区域,需要占用一定的内存容量;zram也是在内存中划分出一块虚拟swap分区,同样也需要占用一定的内存空间。那么若两者同时开启,不就更多的削减了你的实际内存容量了吗?而且二者由于都是需要CPU的压缩算法,所以同时开启二者后也会更多的消耗CPU的计算资源,这对CPU的性能是不利的。 然而genkernel的默认配置就是这样,直接把zswap和zram都给你开了。genkernel追求大而全面的配置、想尽量涵盖足够多的硬件,因此把几乎所有内核功能特性全开启了,却没有考虑到有些内核功能是互相冲突的,不只zswap和zram,其他配置也有存在这样的问题,真的是槽多无吐。
七、Firmware Drivers
八、General architecture-dependent options
#禁用“Stack Protector buffer overflow detection”,相当于gcc编译器的“-fno-stack-protector”选项,禁用程序栈堆溢出保护。由于栈堆溢出保护需要一定的性能开销,所以为了提高性能,我选择禁用此选项,以牺牲内核安全性的代价换取性能。 禁用后你的内核可能会遭受到黑客的栈堆溢出攻击,但是可能性大吗??那些脚本精神小伙都是去喜欢攻击一些具有公网ip地址的服务器系统,你一台个人用的桌面系统,一没有公网ip,二没有重要商业价值的数据,要是真的哪天有一个闲着是在没事干的无业精神小伙,与你处于同一局域网内,又碰巧发现了你的电脑,又又碰巧你成功引起了他的注意,又又又碰巧他知道了你的系统内核没有开启栈堆溢出保护,那么你这运气也是没谁了。我觉得你可以去买彩票,就凭这运气还是能中个大奖的。
九、Enable the block layer
十、Executable file formats
十一、Security options
#是的,你没有看错,禁用所有内核安全选项。还是那句话,你不是服务器系统、没有公网ip,只是个人用的桌面系统,那么linux自古就传承下来的DAC(Discretionary Access Control,自主访问控制) 权限管理体系已经足够满足你的安全需求了。外加搭配上nftables防火墙的加持,即便不用clamav杀毒软件,你的系统已经足够安全了。 SElinux这种美国国家安全局才会用的玩意儿,你真的有这个需要吗? 而且过多的内核安全管理体系会增加性能的开销,所以我宁愿牺牲内核安全性换取性能。
#DAC权限管理体系是什么?很简单,就是用户、组、rwx权限、700、755、644等这些权限设定,这是每一个刚接触linux的人都必须学习并掌握的基本概念。能玩Gentoo的人想必已经对这些基础十分熟悉了吧?
#开启“Diffie-Hellman operations on retained keys”是因为iwd需要。
十二、Cryptographic API
十三、Library routines
#这是与内核开发相关的选项,我又不是内核开发人员,而且我也没那个本事,只是单纯地用用由Linus领导的一众大佬们开发出的大玩具,已经很满足了。所以除了被标记为“-*-”内核默认强制选定的选项,其余选项全部禁用。
十四、Kernel hacking
这样就可以取消“Kernel debugging”的强制选中,然后按N键禁用这一项了。
注释:
#同样这也是与内核开发相关的选项,我不是内核开发人员,我也不做令人头秃的debug,所以你大可完全按照图片里的跟我配置的一模一样。
#genkernel的默认配置里开启了很多关于内核开发和debug的特性,让我真的很无语。我还傻乎乎的一条一条对照翻译看说明,结果最后发现这些特性全都与我无关,所以我学精了,但凡选项的help说明里有“debugging”或“testing”等单词的,一律禁用。
#“Early printk”那一项也给它禁用掉,免得影响X11图形环境的性能。
十五、Gentoo Linux
#我不喜欢systemd,因为这货就和大内总管一样,什么东西都有涉及,而且随着开发的更新,更是越来越开始加入各种各样花里胡哨的功能,what a mess it is!! 我怀疑总有一天systemd会从linux主干里分离出去,成为一个“完整”的systemd OS,或者成功篡位主导linux内核的开发。~~这可真是可怕,未来的linux会被systemd搞成什么样,想想都会起鸡皮疙瘩。
#总之,systemd让我失去了对linux很大的定制性,而我现在最看重的就是这一点,如果不追求定制性的话,那为何不去用Ubuntu、Manjaro这些二进制桌面发行版呢?所以我选择拥向OpenRC的怀抱。
后记:
截图不易,码字更累,所以各位看官们请多多向其他人分享一下我的文章。我写这个系列的文章就是为了帮助刚接触Gentoo(桌面)内核配置的新人们更容易地入门,所以也希望更多的人能看到我的文章。毕竟系统的使用难度降低了,用的人也就会更多,系统用的人多了,那么提出新想法、分享经验、贡献代码、提交bug的人也就更多,系统的发展也会更快。这就是开源的力量,集众人之力,行良性循环。
Typora真心好用,文字排版编辑、图片排版这些都很nice,而且界面也相当美观,整篇文章都是在Typora下编辑完成的。这是我目前最爱用的makrdown编辑器,有了它就没怎么用office或wps了,所以我也把它推荐给你们,用的人越多,软件发展的更好。(非商业吹捧)
我的截图软件用的是FlameShot,同样也是很简洁好用,推荐