欢迎光临
我们一直在努力

Linux技巧

60秒内检查Linux服务器性能,你能做到吗?

阅读(203)评论(0)

如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。

自动草稿

概述:通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解
uptime

dmesg | tail

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

free -m

sar -n DEV 1

sar -n TCP,ETCP 1

top

其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。

下面我们来逐一介绍下这些命令,有关这些命令更多的参数和说明,请参照命令的手册。

uptime
$ uptime
 23:51:26 up 21:31,  1 user,  load average: 30.02, 26.43, 19.02

这个命令可以快速查看机器的负载情况。在Linux系统中,这些数据表示等待CPU资源的进程和阻塞在不可中断IO进程(进程状态为D)的数量。这些数据可以让我们对系统资源使用有一个宏观的了解。

命令的输出分别表示1分钟、5分钟、15分钟的平均负载情况。通过这三个数据,可以了解服务器负载是在趋于紧张还是区域缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。

dmesg丨tail
$ dmesg | tail 
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0 [...] [1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child [1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB [2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.  Check SNMP counters.

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。

vmstat 1
$ vmstat 1 
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu----- r  b swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 34  0    0 200889792  73708 591828    0    0     0     5    6   10 96  1  3  0  0 32  0    0 200889920  73708 591860    0    0     0   592 13284 4282 98  1  1  0  0 32  0    0 200890112  73708 591860    0    0     0     0 9501 2154 99  1  0  0  0 32  0    0 200889568  73712 591856    0    0     0    48 11900 2459 99  0  0  0  0 32  0    0 200890208  73712 591860    0    0     0     0 15898 4840 98  1  1  0  0 ^C

vmstat(8) 命令,每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列:

r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。

free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。

si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。

us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。

上述这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

示例命令的输出可以看见,大量CPU时间消耗在用户态,也就是用户应用程序消耗了CPU时间。这不一定是性能问题,需要结合r队列,一起分析。

mpstat-P ALL 1
$ mpstat -P ALL 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU) 07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle 07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78 07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99 07:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.00 07:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.00 07:38:50 PM    3  96.97   0.00   0.00    0.00   0.00   0.00    0.00    0.00    0.00   3.03 [...]

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

pidstat 1
$ pidstat 1 Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU) 07:41:02 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command 07:41:03 PM     0         9    0.00    0.94    0.00    0.94     1  rcuos/0 07:41:03 PM     0      4214    5.66    5.66    0.00   11.32    15  mesos-slave 07:41:03 PM     0      4354    0.94    0.94    0.00    1.89     8  java 07:41:03 PM     0      6521 1596.23    1.89    0.00 1598.11    27  java 07:41:03 PM     0      6564 1571.70    7.55    0.00 1579.25    28  java 07:41:03 PM 60004     60154    0.94    4.72    0.00    5.66     9  pidstat 07:41:03 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command 07:41:04 PM     0      4214    6.00    2.00    0.00    8.00    15  mesos-slave 07:41:04 PM     0      6521 1590.00    1.00    0.00 1591.00    27  java07:41:04 PM     0      6564 1573.00   10.00    0.00 1583.00    28  java 07:41:04 PM   108      6718    1.00    0.00    0.00    1.00     0  snmp-pass 07:41:04 PM 60004     60154    1.00    4.00    0.00    5.00     9  pidstat ^C

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见两个JAVA进程占用了将近1600%的CPU时间,既消耗了大约16个CPU核心的运算资源。

iostat-xz 1
$ iostat -xz 1 
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015  _x86_64_ (32 CPU) avg-cpu:  %user   %nice %system %iowait  %steal   %idle          73.96    0.00    3.73    0.03    0.06   22.21 Device:   rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util xvda        0.00     0.23    0.21    0.18     4.52     2.08    34.37     0.00    9.98   13.80    5.42   2.44   0.09 xvdb        0.01     0.00    1.02    8.94   127.97   598.53   145.79     0.00    0.43    1.78    0.28   0.25   0.25 xvdc        0.01     0.00    1.02    8.86   127.79   595.94   146.50     0.00    0.45    1.82    0.30   0.27   0.26 dm-0        0.00     0.00    0.69    2.32    10.47    31.69    28.01     0.01    3.23    0.71    3.98   0.13   0.04 dm-1        0.00     0.00    0.00    0.94     0.01     3.78     8.00     0.33  345.84    0.04  346.81   0.01   0.00 dm-2        0.00     0.00    0.09    0.07     1.35     0.36    22.50     0.00    2.55    0.23    5.62   1.78   0.03 [...] ^C

iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:

r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

free -m
$ free -m
total       used       free     shared    buffers     cached Mem:        
245998      24545     221453         83         59        541 
-/+ buffers/cache:      23944     222053 Swap:            0          0          0

free命令可以查看系统内存的使用情况,-m参数表示按照兆字节展示。最后两列分别表示用于IO缓存的内存数,和用于文件系统页缓存的内存数。需要注意的是,第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中提现),降低系统性能。

sar -n DEV 1
$ sar -n DEV 1 
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015     _x86_64_    (32 CPU) 12:16:48 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil 12:16:49 AM      eth0  18763.00   5032.00  20686.42    478.30      0.00      0.00      0.00      0.00 12:16:49 AM        lo     14.00     14.00      1.36      1.36      0.00      0.00      0.00      0.00 12:16:49 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00 12:16:49 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil 12:16:50 AM      eth0  19763.00   5101.00  21999.10    482.56      0.00      0.00      0.00      0.00 12:16:50 AM        lo     20.00     20.00      3.25      3.25      0.00      0.00      0.00      0.00 12:16:50 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00 ^C

sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。如示例输出中,eth0网卡设备,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,没有达到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1
$ sar -n TCP,ETCP 1 
Linux 3.13.0-49-generic (titanclusters-xxxxx)  07/14/2015    _x86_64_    (32 CPU) 12:17:19 AM  active/s passive/s    iseg/s    oseg/s 12:17:20 AM      1.00      0.00  10233.00  18846.00 12:17:19 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s 12:17:20 AM      0.00      0.00      0.00      0.00      0.00 12:17:20 AM  active/s passive/s    iseg/s    oseg/s 12:17:21 AM      1.00      0.00   8359.00   6039.00 12:17:20 AM  atmptf/s  estres/s retrans/s isegerr/s   orsts/s 12:17:21 AM      0.00      0.00      0.00      0.00      0.00 ^C

sar命令在这里用于查看TCP连接状态,其中包括:

active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;

passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;

retrans/s:每秒TCP重传数量;

TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

top
$ top 
top - 00:15:40 up 21:56,  1 user,  load average: 31.09, 29.87, 29.92 Tasks: 871 total,   1 running, 868 sleeping,   0 stopped,   2 zombie %Cpu(s): 96.8 us,  0.4 sy,  0.0 ni,  2.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st KiB Mem:  25190241+total, 24921688 used, 22698073+free,    60448 buffers KiB Swap:        0 total,        0 used,        0 free.   554208 cached Mem   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 20248 root      20   0  0.227t 0.012t  18748 S  3090  5.2  29812:58 java  4213 root      20   0 2722544  64640  44232 S  23.5  0.0 233:35.37 mesos-slave 66128 titancl+  20   0   24344   2332   1172 R   1.0  0.0   0:00.07 top  5235 root      20   0 38.227g 547004  49996 S   0.7  0.2   2:02.74 java  4299 root      20   0 20.015g 2.682g  16836 S   0.3  1.1  33:14.42 java     1 root      20   0   33620   2920   1496 S   0.0  0.0   0:03.82 init     2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd     3 root      20   0       0      0      0 S   0.0  0.0   0:05.35 ksoftirqd/0     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H     6 root      20   0       0      0      0 S   0.0  0.0   0:06.94 kworker/u256:0     8 root      20   0       0      0      0 S   0.0  0.0   2:38.05 rcu_sched

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。

总结

排查Linux服务器性能问题还有很多工具,上面介绍的一些命令,可以帮助我们快速的定位问题。例如前面的示例输出,多个证据证明有JAVA进程占用了大量CPU资源,之后的性能调优就可以针对应用程序进行。

Linux Kernel 5.17.5 的新特性:4 项重大改进

阅读(157)评论(0)

我们经常将 Linux 称为操作系统,但实际上,它只是内核。 并且所说的内核已经达到了 5.17 版,扩展了您现在可以使用免费和开源软件支持的硬件以及您可以在所述设备上执行的操作。

正如经常发生的那样,此版本删除了数万行代码,这一次是通过放弃对旧版 IDE 的支持。 尽管如此,由于所有的添加,这个内核仍然包含比上一个更多的代码行。

Linux Kernel 5.17.5 新特性

处理器
Linux 内核中的 ARM64 架构现在包括了内核并发净化器Kernel Concurrency Sanitizer(KCSAN)。KSCAN 是一个竞争条件检测器,已经支持了其他架构。而现在 ARM64 也在支持名单上了。另外,可扩展矩阵扩展Scalable Matrix Extensions(SME)的初始工作有望为矩阵操作提供更好、更快的支持。

AMD 带来了 基于 k10temp 的 CPU 温度监控,用于 AMD Zen 系列第 19 代 CPU 型号。

一组广泛的 Arm/SoC 支持 进入了 Linux 内核 5.17 中。其中主要包括新的 Snapdragon 8 Gen 1 和 X65 平台。其他 SoC 包括恩智浦 i.MX8ULP、德州仪器 J721S2 和瑞萨 R-Car S4-8。

CPU 的重大变化之一是加入了 AMD 的 P-state 驱动,这是与 Valve 为 Steam Deck 合作开发的。这将提供更好的电源效率,因为透过 ACPI 协作处理器性能控制Collaborative Processor Performance Controls(CPPC)支持,可以更加细化的控制电源。

这个内核中另一个重要的 RISC-V 变化是支持 sv48,提供了 48 位虚拟地址空间。这使得内核可以对高达 128TB 的虚拟地址空间进行寻址。

这个版本带来了很多笔记本电脑、平板电脑的驱动更新。这里 有一个列表,主要内容是:

  • 为华硕 ROG 笔记本电脑增加了自定义风扇曲线支持。
  • 增加了对通用手写笔计划Universal Stylus Initiative(USI)和 NVIDIA Tegra 平板电脑的支持。
  • 对基于 AMD 的笔记本电脑的一些性能改进和修复,涉及到睡眠和声音驱动。

显卡
英特尔的 Alder Lake P 显卡经过前一年的多次迭代,现在已经在主线内核上稳定了。这个内核引入了 对 Raptor Lake S 显卡的首批支持补丁。

英特尔的 Gen Icelake 显卡家族 获得了 可变刷新率/自适应同步支持。

一些较新的笔记本电脑带来了内置的隐私屏幕,预计更多的 OEM 厂商会效仿。另外,值得注意的是,GNOME 桌面和其他公司正计划在之后使用这一隐私功能。所以,为了这个以隐私为中心的功能,最初的架构和代码工作都已经包含在这个内核版本中了。

你可以在 这里 找到一个很好的显卡驱动更新列表。

存储
在内核的每个版本中都会对所有主要的文件系统和存储技术进行增量更新。这个版本也会有一些:

  • 主要的更新包括流行的 EXT4 文件系统使用新的 Linux 挂载 API。
  • 像往常一样,F2FS、Btrfs 和 XFS 的性能得到改善。
  • FS-Cache 和 CacheFiles 模块 做了 重大重写。

杂项硬件更新
今天谁还在使用软盘?我相信仍然有一些特定的商业用例仍在使用软盘。所以,这就给我们带来了这个特定的补丁,在这个内核版本中。内核中存在一个长期的错误:当系统试图读取一个坏掉的软盘时可能会挂起。所以,这个老毛病终于在这个版本中得到了解决,我希望能让少数仍然使用这种古老存储介质的人为此驻足一下。

其他值得注意的杂项硬件更新包括:

  • 任天堂 GameCube/Wii/Wii U 实时时钟驱动。
  • 一个通用的 USB GNSS(全球导航卫星系统Global Navigation Satellite System)驱动程序。
  • Cirrus CS35L41 高清音频编解码器驱动。
  • 许多英特尔 Wi-Fi 驱动程序改进。
  • 英特尔 Alder Lake N 音频支持。

如何获取 Linux 内核 5.17.5

如果您需要立即获取最新的内核,您可以选择通过从 kernel.org 下载文件来从源代码构建 Linux。但这既不是最简单也不是推荐的做事方式。

对于大多数用户来说,最好的选择是等待更新的内核作为常规系统更新的一部分到来。这可能意味着对某些发行版的等待时间比其他发行版更长。像 Ubuntu 这样的发行版可能会坚持使用单个内核,直到下一次主要的操作系统升级,而像 Arch Linux 这样的滚动发行版将在相对较短的时间内提供更新的内核。

手把手教你在优麒麟上搭建 RISC-V 交叉编译环境

阅读(179)评论(0)

RISC-V 设备价格昂贵、不易采购等诸多原因,许多小伙伴虽然很感兴趣,但仍无法参与 RISC-V 开发工作,今天就教大家如何在优麒麟上搭建 RISC-V 交叉编译环境,快学起来吧!

交叉编译(Cross Compile

指编译代码的平台,和执行编译后源代码的平台是两个不同的平台,比如在 x86/Linux 平台下使用交叉编译工具链编译 ARM/Linux 平台下的可执行文件。今天我们要讲的就是在优麒麟(x86/Linux)上编译 RISC-V 架构可执行文件的方法。

我们为什么需要交叉编译呢,主要有以下考虑:

01.性能与速度

交叉编译的目标平台往往 CPU 性能较差,内存和磁盘性能也可能不能满足编译的要求,这时候就要依赖性能资源更好的编译主机进行编译。

02.缺乏编译条件

就算目标平台性能足够且资源充足,可以本地编译,但第一个在目标平台运行的本地编译器总是需要我们通过交叉编译获得。

03.软件编译环境

一个完整的 Linux 发行版需要由数百个包构成,而我们往往只关注需要在目标主机上安装的包,所以我们可以在交叉编译的主机上配置这些环境,而不是把时间浪费在配置目标主机的编译依赖上。

本文包含以下两部分:

1、如何搭建一个 RISC-V 的交叉编译环境。

2、交叉编译 Linux 内核。

 

一、搭建 RISC-V 交叉编译环境

通常来讲,在搭建交叉编译环境时需要考虑不同体系架构的不同特性,包括 CPU 架构是 64 位还是 32 位系统、字节序是大端( big-endian )或小端( little-endian )、内存字节对齐方式等,不过好在 RISC-V 已经有完善的工具链,包含交叉编译所需的 binutils 、 gcc 和 glibc 3 个部分。

●  首先需要 RISC-V 交叉编译工具链,如果网络较慢,可以忽略其中的 qemu 子项目

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

 

这是 RISC-V 的 C/C++ 交叉编译工具链,其支持两种构建模式:

1. 通用 ELF/Newlib 工具链

2. Linux-ELF/glibc 工具链

●  安装所需依赖包

sudo apt-get install -y autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev libncurses-dev device-tree-compiler libssl-dev gdisk swig

●  接下来开始编译

cd riscv-gnu-toolchain
./configure --prefix=/opt/riscv(路径可以根据个人习惯自定义)
sudo make linux -j `nproc`

编译完成后,刚才指定的路径 opt/riscv/bin 下会生成以下文件:

自动草稿

交叉编译所需的工具,包括 Binutils(ld,as,ar 等,了解详情可参考https://sourceware.org/binutils/docs-2.37/binutils/index.html  )、gcc 、gdb  等都在其中。

可以将这个路径添加到环境变量中:

export PATH=/opt/riscv/bin:$PATH

也可以添加到:

echo "export PATH=/opt/riscv/bin:$PATH" >> ~/.bashrc

 

到这里我们就完成了交叉编译所需环境的搭建。

 

二、编译 Linux 内核

接下来我们以内核源码为例,了解一下上述交叉编译工具链的使用方法。

●  首先下载内核源码

git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

●  不过这里下载较慢,可以去国内的镜像站下载,比如清华大学镜像站

git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git

●  下载完成后

git checkout

接下来将需要打上你想要编译的开发板的 patch ,以 hifive unmatched 为例

●  首先下载

git clone https://github.com/sifive/meta-sifive

这里面还包含了编译 OpenSBI 和 U-Boot 所需的 patch ,编译过程大同小异,如果想要自己构建一个系统镜像,可以分别编译这两个工具。这里以内核为例:

●  打上所有 patch

for f in path to /meta-sifive/recipes-kernel/linux/files/*.patch; do echo $f;patch -p1 < $f;done

●  复制 defconfig 配置文件

cp path to /meta-sifive/recipes-kernel/linux/files/defconfig  ./.config

如果想避免产生额外后缀名,可以添加

touch .scmversion

接下来开始编译内核,这里需要指定 make 的两个参数:

1、CROSS_COMPILE:交叉编译器的前缀,表示将代码编译编译成目标CPU指令的工具,如果不指定,make 会默认使用系统自带的 gcc 来编译,这里指定我们之前编译出来的 riscv64-unknown-linux-gnu- 为前缀。

2、ARCH:即 architecture ,用于选择编译哪种 CPU 架构,也就是编译 arch/ 目录下的哪个子目录,这里指定 ARCH=riscv ,arch/riscv 目录下也包含此架构特有的 Kconfig 配置文件,所以 make menuconfig 时也会用到这个目录。

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv olddefconfig
make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv -j`nproc`

也可以将内核和内核模块打成 tar 包或 deb 包

make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv    INSTALL_MOD_STRIP=1 -j`nproc` tarbz2-pkg
make CROSS_COMPILE=riscv64-unknown-linux-gnu- ARCH=riscv INSTALL_MOD_STRIP=1 -j`nproc` bindeb-pkg

添加版本号

version=`cat include/config/kernel.release`;echo $version

编译完成后,会生成 path to/arch/riscv/boot/Image 内核镜像文件和 path to/arch/riscv/boot/dts/sifive/hifive-unmatched-a00.dtb 硬件 dtb 文件。

如果选择打成 deb 包,会生成三个 .deb 文件:

1. linux-headers-…

2. linux-libc-dev_…

3. linux-image-…

(其中省略号表示版本号)

到这里我们就完成了 RISC-V 架构 Linux 内核的编译,接下来便可以基于这个内核制作自己的系统镜像。

各位小伙伴,你学会了吗?

更多问题反馈和优化建议,请点击进入优麒麟社区论坛告诉我们哦~

参考文档:

https://github.com/carlosedp/riscv-bringup/tree/bbef412a4456acefdf814a9e14a75ce2778992ed/unmatched#build-u-boot

https://github.com/sifive/meta-sifive/tree/2021.12/recipes-kernel/linux/files

https://github.com/riscv-collab/riscv-gnu-toolchain

https://github.com/sifive/freedom-u-sdk

如何在 Linux 命令行中比较两个目录

阅读(225)评论(0)

Linux 中如何比较两个文件的差异?答案是使用 diff 命令。

那么,如何比较两个文件夹呢?仍然使用 diff 命令。

另外,使用 GUI 工具也可以更容易的以可视化界面来查看两个目录之间的差异。

今天我们分享一下如何使用 diff 命令来比较目录。

使用​​ tree 命令​​​可查看我们今天的例子中使用的两个目录的结构:

自动草稿

使用 diff 命令比较目录

使用 diff 命令,可参照如下语法结构:

diff -qr Directory-1 Directory-2
  • 1.

-q 选项,用于查找差异。当两个目录中发现差异的时候,会有输出报告:

diff -q LHB-1 LHB-2
  • 1.

自动草稿

但是,大家仔细看输出结果,diff 命令只查看第一层目录结构。默认情况下,它不会查找子目录中的文件。

要执行递归查找,需要使用 -r 选项:

diff -qr LHB-1 LHB-2
  • 1.

自动草稿

但是,另外的情况,如果想要查找类似的文件呢?

查找类似的文件可以使用 -s 选项。如果同时使用 -q 和 -s,将会同时显示相同和不同的目录文件:

diff -qrs LHB-1 LHB-2
  • 1.

自动草稿

diff 命令显示目录中不同的文件。要查看差异,可以再次对文件运行 diff 命令,以查看其内容的差异。

使用 GUI 工具来比较目录

如果不想使用命令行工具,只想以最简单的方式比较两个目录,可以使用 Meld。

Meld 是一个可以检查和合并差异的 GUI 工具。当然,使用前需要安装。如果使用的是 Ubuntu/Debian 系统,使用如下命令:

sudo
  • 1.

安装完成后,使用 Meld,可执行以下三个简单的步骤:

1)选择目录比较(directory comparison);

2)选择需要比较的目录;

3)点击比较(compare)按钮。

自动草稿

点击比较按钮后,它将显示所选目录中的匹配文件和不同文件:

自动草稿

标注星号的是完全匹配的文件,而用绿色突出显示的文件名仅可用于相应的目录。

Fedora Linux 上使用 Homebrew 包管理器

阅读(265)评论(0)

 Homebrew 与 Fedora Linux 包管理器 dnf 有什么不同,为什么你可能想在 Fedora Linux 上安装和使用它,以及如何安装。

Homebrew 是一个 macOS 的包管理器,用于在 macOS 上安装 UNIX 工具。但是,它也可以在 Linux(和 Windows WSL)上使用。它是用 Ruby 编写的,并提供主机系统(macOS 或 Linux)可能不提供的软件包,因此它在操作系统包管理器之外提供了一个辅助的包管理器。此外,它只以非 root 用户身份在前缀 ​​/home/linuxbrew/.linuxbrew​​​ 或 ​​~/.linuxbrew​​​ 下安装软件包,不会污染系统路径。这个包管理器在 Fedora Linux 上也适用。在这篇文章中,我将尝试告诉你 Homebrew 与 Fedora Linux 包管理器 ​​dnf​​ 有什么不同,为什么你可能想在 Fedora Linux 上安装和使用它,以及如何安装。

免责声明

你应该经常检查你在系统上安装的软件包和二进制文件。Homebrew 包通常以非 sudoer 用户运行,并工作在专门的前缀的路径下,因此它们不太可能造成破坏或错误配置。然而,所有的安装操作都要自己承担风险。作者和 Fedora 社区不对任何可能直接或间接因遵循这篇文章而造成的损失负责。

Homebrew 如何工作

Homebrew 在底层使用 Ruby 和 Git。它使用特殊的 Ruby 脚本从源代码构建软件,这些脚本被称为 “配方formula”,看起来像这样(使用 ​​wget​​ 包作为例子):

(LCTT 译注:Homebrew 本身意思是“家酿”,在这个软件中,有各种类似于酿酒的比喻。)

class Wget < Formula
  homepage "https://www.gnu.org/software/wget/"
  url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"

  def install
    system "./configure", "--prefix=#{prefix}"
    system "make", "install"
  end
end
Homebrew 与 dnf 有何不同

Homebrew 是一个包管理器,提供了许多 UNIX 软件工具和包的最新版本,例如 FFmpeg、Composer、Minikube 等。当你想安装一些由于某种原因在 Fedora Linux RPM 仓库中没有的软件包时,它就会证明很有用。所以,它并不能取代 ​​dnf​​。

安装 Homebrew

在开始安装 Homebrew 之前,确保你已经安装了 glibc 和 gcc。这些工具可以在 Fedora 上通过以下方式安装:

sudo dnf groupinstall "Development Tools"

然后,通过在终端运行以下命令来安装 Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

在安装过程中,你会被提示输入你的 ​​sudo​​ 密码。另外,你可以选择 Homebrew 的安装前缀,但默认的前缀就可以了。在安装过程中,你将成为 Homebrew 前缀目录的所有者,这样你就不必输入 ​​sudo​​ 密码来安装软件包。安装将需要数分钟。完成后,运行以下命令,将 ​​brew​​ 添加到你的 ​​PATH​​ 中:

echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.bash_profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
安装和检查软件包

要在 Homebrew 上使用“配方”安装一个软件包,只需运行:

brew install

替换为你要安装的“配方”的名称。例如,要安装 Minikube,只需运行:

brew install minikube

你也可以用以下方式搜索“配方”:

brew search

要获得一个“配方”的信息,请运行:

brew info

另外,你可以用以下命令查看所有已安装的“配方”:

brew list
卸载软件包

要从你的 Homebrew 前缀中卸载一个软件包,请运行:

brew uninstall
升级软件包

要升级一个用 Homebrew 安装的特定软件包,请运行:

brew upgrade

要更新 Homebrew 和所有已安装的“配方”到最新版本,请运行:

brew update
总结

Homebrew 是一个简单的包管理器,可以与 ​​dnf​​ 一起成为有用的工具(两者完全没有关系)。尽量坚持使用 Fedora 原生的 ​​dnf​​ 包管理器,以避免软件冲突。然而,如果你在 Fedora Linux 软件库中没有找到某个软件,那么你也许可以用 Homebrew 找到并安装它。请看 ​​“配方”列表​​ 以了解有哪些可用的软件。另外,Fedora Linux 上的 Homebrew 还不支持图形化应用(在 Homebrew 术语中称为“酒桶cask”)。至少,我在安装 GUI 应用时没有成功过。

systemd 的 journalctl 工具及其各种命令的基础知识介绍

阅读(231)评论(0)

简介

很多人说 systemd 不好,它对系统的影响很大,这也是一个有争议的话题。但你不能否认的是,它提供了一套完善的工具来管理和排除系统故障。想象一下,当你遇到一个没有 GUI 的损坏系统时,你可能会把启动和 GRUB 弄得一团糟。在这种情况下,你可以从一个立付Live系统启动,挂上你的 Linux 分区,然后浏览 systemd 的日志,找出问题所在。

systemd 有三个基本组件,如下所示:

  1. systemd:Linux 操作系统的系统和服务管理器。
  2. systemctl :该命令用于反观和控制 systemd 系统和服务管理器的状态。
  3. systemd-analyze:该命令提供系统启动时的性能统计,并从系统和服务管理器中检索其他状态和跟踪信息。

除了这三个服务外,systemd 还提供其他服务,如 journald、logind、networkd 等。在本指南中,我们将讨论 systemd 的 journald 服务。

journald – systemd 日志服务

根据设计,systemd 提供了一个集中的方式来处理所有来自进程、应用程序等的操作系统日志。所有这些日志事件都由 systemd 的 journald 守护进程来处理。journald 守护进程收集所有来自 Linux 操作系统各处的日志,并将其作为二进制数据存储在文件中。

以二进制数据集中记录事件、系统问题的好处有很多。例如,由于系统日志是以二进制而不是文本形式存储的,你可以以文本、JSON 对象等多种方式进行转译,以满足各种需求。另外,由于日志是按顺序存储的,通过对日志的日期/时间操作,超级容易追踪到单个事件。

请记住,journald 收集的日志文件数以千行计,而且不断更新每次开机、每个事件。因此,如果你有一个长期运行的 Linux 操作系统,日志的大小应该以 GB 为单位。由于有着数以千计的日志,最好用基本命令进行过滤,以了解更多系统问题。

journald 配置文件

journald 的配置文件存在于以下路径中。它包含了关于如何进行日志记录的各种标志。你可以看一下这个文件,并进行必要的修改。但我建议不要修改这个文件,除非你知道自己在做什么。

/etc/systemd/journald.conf

journald 存储二进制日志文件的地方
journald 以二进制格式存储日志。它们被保存在这个路径下的一个目录中:

/var/log/journal

例如,在下面的路径中,有一个目录包含了迄今为止的所有系统日志。
systemd 的 journalctl 工具及其各种命令的基础知识介绍
不要使用 cat 命令,也不要使用 nano 或 vi 来打开这些文件。它们(是二进制的),无法正常显示。

使用 journalctl 来查看和分析 systemd 日志
journald 基本命令

查看 journald 日志的基本命令是:

journalctl

systemd 的 journalctl 工具及其各种命令的基础知识介绍
该命令提供了所有应用程序和进程的日志条目,包括错误、警告等。它显示的列表中,最旧的日志在顶部,当前的日志在底部。你需要不断按回车键来逐行滚动浏览。你也可以使用 PAGE UP 和 PAGE DOWN 键来滚动。按 q 键可以退出这个视图。

如何以不同时区的时间查看日志条目

默认情况下,journalctl 以当前系统时区显示日志的时间。然而,你可以很容易地在命令中提供时区,将同一日志转换为不同的时区。例如,要以 UTC 查看日志,请使用以下命令:

journalctl --utc

systemd 的 journalctl 工具及其各种命令的基础知识介绍

如何在日志中只查看错误、警告等信息

系统产生的日志有不同的优先级。有些日志可能是可以忽略的警告,有些可能是重要的错误。你可能想只看错误,不看警告。这也可以用下面的命令来实现。

要查看紧急系统信息,请使用:

journalctl -p 0

systemd 的 journalctl 工具及其各种命令的基础知识介绍
错误代码:
0: 紧急情况
1: 警报
2: 危急
3: 错误
4: 警告
5: 通知
6: 信息
7:调试
当你指定错误代码时,它显示该等级及更高的所有信息。例如,如果你指定下面的命令,它会显示所有优先级为 2、1 和 0 的信息:

journalctl -p 2
如何查看特定启动的日志

当你运行 journalctl 命令时,它会显示当前启动的信息,即你正在运行的会话中的信息。但也可以查看过去的启动信息。

在每次重启时,日志都会持续更新。journald 会记录不同启动时的日志。要查看不同启动时的日志,请使用以下命令。

journalctl --list-boots

systemd 的 journalctl 工具及其各种命令的基础知识介绍

  1. 第一个数字显示的是 journald 的唯一的启动跟踪号码,你可以在下一个命令中使用它来分析该特定的启动。
  2. 第二个数字是启动 ID,你也可以在命令中指定。
  3. 接下来的两个日期、时间组合是存储在相应文件中的日志的时间。如果你想找出某个特定日期、时间的日志或错误,这就非常方便了。

要查看一个特定的启动号码,你可以选择第一个启动跟踪号码或启动 ID,如下所示。

journalctl -b -45
journalctl -b 8bab42c7e82440f886a3f041a7c95b98

systemd 的 journalctl 工具及其各种命令的基础知识介绍
你也可以使用 -x 选项,在显示屏上添加 systemd 错误信息的解释。在某些情况下,这是个救命稻草。

journalctl -xb -p 3

systemd 的 journalctl 工具及其各种命令的基础知识介绍

如何查看某一特定时间、日期的日志记录

journalctl 功能强大,可以在命令中提供类似英语的参数,用于时间和日期操作。

你可以使用 --since 选项与 yesterday、today、tomorrow 或 now 组合。

下面是一些不同命令的例子。你可以根据你的需要修改它们。它们是不言自明的。以下命令中的日期、时间格式为 "YYYY-MM-DD HH:MM:SS"

journalctl --since "2020-12-04 06:00:00"
journalctl --since "2020-12-03" --until "2020-12-05 03:00:00"
journalctl --since yesterday
journalctl --since 09:00 --until "1 hour ago"

systemd 的 journalctl 工具及其各种命令的基础知识介绍

你也可以将上述内容与错误级别开关结合起来。

如何查看内核特定的日志记录

Linux 内核信息也可以从日志中提取出来。要查看当前启动时的内核信息,请使用以下命令:

journalctl -k

如何查看某个服务、PID 的日志
你可以从 journald 日志中过滤出某个 systemd 服务单元的特定日志。例如,如果要查看 NetworkManager 服务的日志,请使用下面的命令。

journalctl -u NetworkManager.service

systemd 的 journalctl 工具及其各种命令的基础知识介绍
如果你不知道服务名称,可以使用下面的命令来列出系统中的 systemd 服务。

systemctl list-units --type=service
如何查看用户、组的日志

如果你正在分析服务器日志,在多个用户登录的情况下,这个命令很有帮助。你可以先用下面的命令从用户名中找出用户的 ID。例如,要找出用户 debugpoint 的 ID:

id -u debugpoint

然后使用 _UID 选项指定该 ID 与来查看该用户产生的日志。

journalctl _UID=1000 --since today

systemd 的 journalctl 工具及其各种命令的基础知识介绍
同样地,使用 _GID 选项也可以查到用户组的情况。

如何查看一个可执行文件的日志

你也可以查看某个特定程序或可执行文件的日志。例如,如果你想找出 gnome-shell 的信息,你可以运行以下命令。

journalctl /usr/bin/gnome-shell --since today

systemd 的 journalctl 工具及其各种命令的基础知识介绍

结束语

希望本指南能帮助你使用 journalctl 查看分析 Linux 桌面或服务器上的 systemd 日志,排除故障。如果你知道如何使用这些命令,systemd 日志管理的功能非常强大,它能让你在调试时的生活变得轻松一些。现在所有主流的 Linux 发行版都使用 systemd。Ubuntu、Debian、Fedora、Arch 它们都使用 systemd 作为其默认的操作系统组件。如果你想了解不使用 systemd 的 Linux发行版,你可能想看看 MX-Linux、Gentoo、Slackware、Void Linux。

OBS linux 使用虚拟摄像头 virtual cam

阅读(470)评论(0)

顾名思义,就是给电脑生成一个假的摄像头设备
应用场景:

电脑没有摄像头,想要一个摄像头输入
想要使用视频或者图片作为摄像头的输入, 比如可以在视频聊天时使用虚拟摄像头,播放视频给对方而不是使用真实摄像头
开发调试时为了摄像头输入图像稳定,也可以使用虚拟摄像头
需要在不支持串流的软件直播,比如在会议软件直播,需要调整画面内容, 可以采用虚拟摄像头 + OBS 的方式生成一个虚拟摄像头,然后在会议软件使用这个虚拟的摄像头进行视频即可
生成虚拟摄像头设备
这里以 manjaro(arch 系) 为例, ubuntu 使用 apt 替换即可,用法类似,自行灵活变通

pamac search v4l2loopback
pamac install v4l2loopback-dkms
sudo modprobe v4l2loopback devices=1 video_nr=2 exclusive_caps=1 card_label="VirtualWebCam"
lsmod | grep v4l2loopback
ls /dev/video*
会出现一个虚拟摄像头: 比如 /dev/video2, 这里指定设备为video2是因为一般电脑有实体摄像头时会注册video0和video1,将这两个设备名预留给真实设备

安装 obs-v4l2sink 插件
源码在: https://github.com/CatxFish/obs-v4l2sink

直接用包管理器安装

pamac search v4l2sink
pamac install obs-v4l2sink


如果前面的步骤没弄好就会像这样打不开,弄好了就可以打开辣, 格式建议选择 YUV420, 比如 google chrome 就是支持这种格式

使用
然后再其它程序中就能看到这个新的摄像头辣,如果不能使用,比如 chrome 无法识别到, 可以检查是不是按照前面说的命令执行的, 参数exclusive_caps=1很重要哦
可以

sudo modprobe -r v4l2loopback
sudo modprobe v4l2loopback devices=1 video_nr=2 exclusive_caps=1 card_label="VirtualWebCam"

 

 

怎样Linux下修复U盘驱动器

阅读(213)评论(0)

U 盘想必在大家的日常生活和工作中都已经不可或缺了,它让我们的文件维护和转移更加方便容易。但随着频繁使用,有可能会出现文件系统错误、坏块、坏扇区而影响正常使用的情况。对于 Windows 用户来说,修复此类 U 盘问题有专用的图形化工具使用,而 Linux 用户就相对麻烦一点,本文我们就介绍如何在 Linux 终端中修复 U 盘问题。

 

当然,本文中介绍的方法不仅适用于 USB 驱动器,同时也适用于其它接口类型的硬盘。但在操作前请自行对重要数据进行备份,自己的数据自己负责。

使用fsck移除U盘中的坏块

在 Linux 中修复闪存盘或其它类型驱动器最为简单的方法就是使用 fsck 工具,此工具是删除坏块、解决「不可读」问题和修复大多数文件系统问题的强大工具。不过在此前需要先使用 lsblk 命令来确定好 U 盘,该命令可以列出当前 Linux 系统上连接的所有磁盘。

自动草稿

要删除坏文件块,请在特定分区(例如/dev/sdc1)或整块磁盘(例如/dev/sdc)上执行 fsck 命令, 一旦完成,你将获得一个健康的 Linux 分区。

自动草稿

清零USB驱动器

当出现 U 盘已经完全不可读,里面的数据也无价值时,最佳的修复办法就是使用 dd 命令将 U 盘完全清零。

同样先使用 lsblk 命令找出 U 盘,再使用类似如下命令进行清零处理:

sudo dd if=/dev/zero of=/dev/sdb

清零操作完成后,需要用 fdisk 或其它工具对磁盘进行重新分区,之后再选择如下命令格式化之后即可正常使用:

FAT32

sudo mkfs.msdos -f 32 /dev/sdb1

EXT4

sudo mkfs.ext4 -f /dev/sdb1

NTFS

sudo mkfs.ntfs -f /dev/sdb1

开源版tailscale,headscale搭建

阅读(1.61K)评论(0)

Headscale 是什么 上一期视频讲了tailscale,Tailscale 是一个收费的vpn服务,免费用户有诸多限制,为了破除这些限制,有开源项目重新把tailscale实现了一遍,项目名称叫headscale

是由欧洲航天局的 Juan Font 使用 Go 语言开发,在 BSD 许可下发布,实现了 Tailscale 控制服务器的所有主要功能,可以部署在企业内部,没有任何设备数量的限制,且所有的网络流量都由自己控制。

目前 Headscale 还没有可视化界面,所有的操作都需要在命令行中完成,但是命令并不多,操作也不复杂。

因为是自建服务,那能自定义的配置就多了,任意定义网段,任意定义命名空间

udp直连会被运营商限速,所以会出现速度骤降,但是ping非常稳定,传速速度页非常稳定。

Headscale 部署

Headscale 部署在 Linux 主机上,随便找台有独立ip的vps就可以了,但是要注意,如果需要穿透的内网无法打洞成功那么流量就会由服务器中转,这意味着穿透后的速度会直接的受限于节点跟服务器之间的网络情况,所以尽量选择离你近的服务器,即使打洞失败了,至少网络还是稳定的,通畅的。

项目主页:https://github.com/juanfont/headscale/

# 下载服务端
wget --output-document=/usr/local/bin/headscale \
https://github.com/juanfont/headscale/releases/download/v0.17.0-alpha4/headscale_0.17.0-alpha4_linux_amd64
# 设置执行权限
chmod +x /usr/local/bin/headscale

准备

#创建配置目录:
mkdir -p /etc/headscale

#创建目录用来存储数据与证书:
mkdir -p /var/lib/headscale

#创建空的 SQLite 数据库文件:
touch /var/lib/headscale/db.sqlite

# 从example 创建 Headscale 配置文件:
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
  • server_url 设置为 http://<PUBLIC_IP>:8080,将 <PUBLIC_IP> 替换为公网 IP 或者域名。
  • 可自定义私有网段,也可同时开启 IPv4 和 IPv6:
  • ip_prefixes: # - fd7a:115c:a1e0::/48 - 10.1.0.0/16
  • 随机端口要打开,否则同一个内网中多个终端会有问题
  • randomize_client_port: true

创建 SystemD service 配置文件:

# /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=syslog.target
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5

# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale

[Install]
WantedBy=multi-user.target
# 创建 headscale 用户:

useradd headscale -d /home/headscale -m

# 修改 /var/lib/headscale 目录的 owner:

chown -R headscale:headscale /var/lib/headscale

#修改配置文件中的 `unix_socket`:


unix_socket: /var/run/headscale/headscale.sock

# Reload SystemD 以加载新的配置文件:

systemctl daemon-reload

#启动 Headscale 服务并设置开机自启:

systemctl enable --now headscale

# 查看运行状态:

systemctl status headscale

# 查看占用端口:

ss -tulnp|grep headscale

# 创建一个 namespace,以便后续客户端接入,例如:
headscale namespaces create default

# 查看命名空间:

headscale namespaces list

 

客户端安装

目前除了 iOS 客户端,其他平台的客户端都有办法自定义 Tailscale 的控制服务器,headscale仅仅是实现了tailscale服务端的功能。

OS Supports headscale
Linux Yes
OpenBSD Yes
FreeBSD Yes
macOS Yes (see /apple on your headscale for more information)
Windows Yes docs
Android Yes docs
iOS Not yet

Windows客户端

打开http://ip:8080/windows

下载一个注册表修改工具,执行一下

安装tailscale客户端

启动,登陆的时候就会去我们自己的服务器认证了

认证成功获取到ip,客户端就加入网络了

而且windows端做路由也是可以的,如果需要,加上参数–advertise-routes=192.168.188.0/24

打开cmd,执行

tailscale up  --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24

再去服务器端查看route,激活路由

headscale routes list -i 1
headscale routes enable -i 1 -r "192.168.188.0/24"

linux客户端

直接下载。查看最新版本:https://pkgs.tailscale.com/stable/

wget https://pkgs.tailscale.com/stable/tailscale_1.28.0_amd64.tgz
tar zxvf tailscale_1.28.0_amd64.tgz x tailscale_1.28.0_amd64/

将二进制文件复制到官方软件包默认的路径下:

cp tailscale_1.28.0_amd64/tailscaled /usr/sbin/tailscaled
cp tailscale_1.28.0_amd64/tailscale /usr/bin/tailscale
chmod +x /usr/sbin/tailscaled
chmod +x /usr/bin/tailscale

将 systemD service 配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.service /lib/systemd/system/tailscaled.service

将环境变量配置文件复制到系统路径下:

cp tailscale_1.28.0_amd64/systemd/tailscaled.defaults /etc/default/tailscaled
# 启动 tailscaled.service 并设置开机自启:
systemctl enable --now tailscaled
# 查看服务状态:
systemctl status tailscaled

Tailscale 接入:

tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false
# 如果申请为虚拟网关,需要指定
tailscale up --login-server=http://ip:8080 --accept-routes=true --accept-dns=false --advertise-routes=192.168.188.0/24
# 打开转发
echo 'net.ipv4.ip_forward = 1' | tee /etc/sysctl.d/ipforwarding.conf
echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.d/ipforwarding.conf
sysctl -p /etc/sysctl.d/ipforwarding.conf

执行完上面的命令后,会出现下面的信息:

To authenticate, visit:

http://xxxxxx:8080/register?key=905cf165204800247fbd33989dbc22be95c987286c45aac303393704

在浏览器中打开该链接,就会出现如下的界面:

开源版tailscale,headscale搭建

将其中的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace。

headscale -n default nodes register --key d1614a1407b7554cd368db21f383197802d9c95249130d7b3db256458d9a4043
# 注册成功,查看注册的节点:
headscale nodes list
# 许可路由的话,通过上个命令就可以看到linux节点的id,就是1,2,3,……
# 查看改节点的路由,假如id是1
headscale routes list -i 1
# 许可网关
headscale routes enable -i 1 -r "192.168.188.0/24"
# 再次查看虚拟网关状态,id是1
headscale routes list -i 1
# enabled就是已经启用了

回到 Tailscale 客户端所在的 Linux 主机,可以看到 Tailscale 会自动创建相关的路由表和 iptables 规则。路由表可通过以下命令查看:

ip route show table 52

 

群晖客户端

项目地址:https://github.com/tailscale/tailscale-synology

下载安装包手动上传到webui,安装启用

登录到ssh命令行

tailscale up --login-server=http://ip:8080 --accept-dns=false

剩下的步骤跟linux一致

如果需要群晖做虚拟网关的话,添加参数–advertise-routes=192.168.199.0/24

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

 

openwrt客户端

项目地址:https://github.com/adyanth/openwrt-tailscale-enabler

按照项目的安装说明安装即可

安装完成,启动服务后,执行跟linux和群晖相同的命令

tailscale up --login-server=http://ip:8080 --accept-dns=false --advertise-routes=192.168.199.0/24

 

安卓客户端

稍微麻烦些,需要自己去github上生成release,这里就不写了,直接提供包出来

重点就是指定服务器的地址,如果不指定的话认证服务器是指向tailscale的

要想自己指定服务器需要从项目代码中自己生成一个

可以在github上操作,总体来说费劲一点,这不是本期视频的重点,我就直接把我生成的客户端放到蓝凑云了

下载地址:https://xpn.lanzout.com/iXZX90hksddc

安装完成后别直接登录,

登陆页面,右上角有一个use login server,

打开,填上自己的服务器的ip和端口登录,同样会跳转到一个页面

复制给出的命令,修改namespace为default

去服务端命令行执行一下,认证成功

安卓端就搞定了

 

总体而言,除了安卓端麻烦些,openwrt端耗费的时间长一些,难度不高。

使用 HTTP/2 加速 Node.js 应用

阅读(190)评论(0)

我们想让现今使用 Node.js 构建的网站能够更加轻松的获得性能提升。为此,我们开发了 netjet 中间件,它可以解析应用生成的 HTML 并自动添加 Link 头部。

当在一个示例的 Express 应用中使用这个中间件时,我们可以看到应用程序的输出多了如下 HTTP 头:
自动草稿
本文是使用 Ghost(一个博客发布平台)进行发布的,因此如果你的浏览器支持 HTTP/2,你已经在不知不觉中享受了服务端推送技术带来的好处了。接下来,我们将进行更详细的说明。netjet 使用了带有定制插件的 PostHTML 来解析 HTML。目前,netjet 用它来查找图片、脚本和外部 CSS 样式表。你也可以用其它的技术来实现这个。在响应过程中增加 HTML 解析器有个明显的缺点:这将增加页面加载的延时(到加载第一个字节所花的时间)。大多数情况下,所新增的延时被应用里的其他耗时掩盖掉了,比如数据库访问。为了解决这个问题,netjet 包含了一个可调节的 LRU 缓存,该缓存以 HTTP 的 ETag 头部作为索引,这使得 netjet 可以非常快的为已经解析过的页面插入 Link 头部。
不过,如果我们现在从头设计一款全新的应用,我们就应该考虑把页面内容和页面中的元数据分开存放,从而整体地减少 HTML 解析和其它可能增加的延时了。
任意的 Node.js HTML 框架,只要它支持类似 Express 这样的中间件,netjet 都是能够兼容的。只要把 netjet 像下面这样加到中间件加载链里就可以了。

var express = require('express');
var netjet = require('netjet');
var root = '/path/to/static/folder';
express()
  .use(netjet({
    cache: {
      max: 100
    }
  }))
  .use(express.static(root))
  .listen(1337);

稍微加点代码,netjet 也可以摆脱 HTML 框架,独立工作:

var http = require('http');
var netjet = require('netjet');

var port = 1337;
var hostname = 'localhost';
var preload = netjet({
  cache: {
    max: 100
  }
});

var server = http.createServer(function (req, res) {
  preload(req, res, function () {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/html');
      res.end('<!doctype html><h1>Hello World</h1>');
  });
});

server.listen(port, hostname, function () {
  console.log('Server running at http://' + hostname + ':' + port+ '/');
});

netjet 文档里有更多选项的信息。

查看推送了什么数据

自动草稿
访问本文时,通过 Chrome 的开发者工具,我们可以轻松的验证网站是否正在使用服务器推送技术(LCTT 译注: Chrome 版本至少为 53)。在“Network”选项卡中,我们可以看到有些资源的“Initiator”这一列中包含了Push字样,这些资源就是服务器端推送的。
不过,目前 Firefox 的开发者工具还不能直观的展示被推送的资源。不过我们可以通过页面响应头部里的cf-h2-pushed头部看到一个列表,这个列表包含了本页面主动推送给浏览器的资源。
希望大家能够踊跃为 netjet 添砖加瓦,我也乐于看到有人正在使用 netjet。

Ghost 和服务端推送技术

Ghost 真是包罗万象。在 Ghost 团队的帮助下,我把 netjet 也集成到里面了,而且作为测试版内容可以在 Ghost 的 0.8.0 版本中用上它。

如果你正在使用 Ghost,你可以通过修改 config.js、并在production配置块中增加 preloadHeaders 选项来启用服务端推送。

production: {
  url: 'https://my-ghost-blog.com',
  preloadHeaders: 100,
  // ...
}

Ghost 已经为其用户整理了一篇支持文档。

总结

使用 netjet,你的 Node.js 应用也可以使用浏览器预加载技术。并且 CloudFlare 已经使用它在提供了 HTTP/2 服务端推送了。

登录

忘记密码 ?