GVKun编程网logo

Linux 实例常用内核网络参数介绍与常见问题处理(linux网络内核分析)

3

本文将带您了解关于Linux实例常用内核网络参数介绍与常见问题处理的新内容,同时我们还将为您解释linux网络内核分析的相关知识,另外,我们还将为您提供关于cephfslinuxkernelclien

本文将带您了解关于Linux 实例常用内核网络参数介绍与常见问题处理的新内容,同时我们还将为您解释linux网络内核分析的相关知识,另外,我们还将为您提供关于cephfs linux kernel client 针对 linux page cache 的操作、EasyWSL工具将 Linux Docker 映像转换为适用于 Linux 的、ld:在 /buildtools/linux/x86-32 中找不到 /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6、Linux CentOS 下安装mysql-8.0.13-linux-glibc2.12-x86_64安装的实用信息。

本文目录一览:

Linux 实例常用内核网络参数介绍与常见问题处理(linux网络内核分析)

Linux 实例常用内核网络参数介绍与常见问题处理(linux网络内核分析)

本文总结了常见的 Linux 内核参数及相关问题。修改内核参数前,您需要:

  • 从实际需要出发,最好有相关数据的支撑,不建议随意调整内核参数。
  • 了解参数的具体作用,且注意同类型或版本环境的内核参数可能有所不同。
  • 备份 ECS 实例中的重要数据。参阅文档创建快照。

查看和修改 Linux 实例内核参数

方法一、通过 /proc/sys/ 目录

查看内核参数:使用 cat 查看对应文件的内容,例如执行命令 cat /proc/sys/net/ipv4/tcp_tw_recycle 查看 net.ipv4.tcp_tw_recycle 的值。

修改内核参数:使用 echo 修改内核参数对应的文件,例如执行命令 echo "0" > /proc/sys/net/ipv4/tcp_tw_recycle 将 net.ipv4.tcp_tw_recycle 的值修改为 0。

注意:

  • /proc/sys/ 目录是 Linux 内核在启动后生成的伪目录,其目录下的 net 文件夹中存放了当前系统中开启的所有内核参数、目录树结构与参数的完整名称相关,如 net.ipv4.tcp_tw_recycle,它对应的文件是 /proc/sys/net/ipv4/tcp_tw_recycle,文件的内容就是参数值。
  • 方法一修改的参数值仅在当次运行中生效,系统重启后会回滚历史值,一般用于临时性的验证修改的效果。若需要永久性修改,请参阅方法二。

方法二、通过 sysctl.conf 文件

查看内核参数:执行命令 sysctl -a 查看当前系统中生效的所有参数,如下所示:

 
  1. net.ipv4.tcp_app_win = 31
  2. net.ipv4.tcp_adv_win_scale = 2
  3. net.ipv4.tcp_tw_reuse = 0
  4. net.ipv4.tcp_frto = 2
  5. net.ipv4.tcp_frto_response = 0
  6. net.ipv4.tcp_low_latency = 0
  7. net.ipv4.tcp_no_metrics_save = 0
  8. net.ipv4.tcp_moderate_rcvbuf = 1
  9. net.ipv4.tcp_tso_win_divisor = 3
  10. net.ipv4.tcp_congestion_control = cubic
  11. net.ipv4.tcp_abc = 0
  12. net.ipv4.tcp_mtu_probing = 0
  13. net.ipv4.tcp_base_mss = 512
  14. net.ipv4.tcp_workaround_signed_windows = 0
  15. net.ipv4.tcp_challenge_ack_limit = 1000
  16. net.ipv4.tcp_limit_output_bytes = 262144
  17. net.ipv4.tcp_dma_copybreak = 4096
  18. net.ipv4.tcp_slow_start_after_idle = 1
  19. net.ipv4.cipso_cache_enable = 1
  20. net.ipv4.cipso_cache_bucket_size = 10
  21. net.ipv4.cipso_rbm_optfmt = 0
  22. net.ipv4.cipso_rbm_strictvalid = 1

修改内核参数:

  1. 执行命令 /sbin/sysctl -w kernel.parameter="example" 修改参数,如sysctl -w net.ipv4.tcp_tw_recycle="0"
  2. 执行命令 vi /etc/sysctl.conf 修改 /etc/sysctl.conf 文件中的参数。
  3. 执行命令 /sbin/sysctl -p 使配置生效。

注意:调整内核参数后内核处于不稳定状态,请务必重启实例。

Linux 网络相关内核参数引发的常见问题及处理

Linux 实例 NAT 哈希表满导致 ECS 实例丢包

此处涉及的内核参数:

  • net.netfilter.nf_conntrack_buckets
  • net.nf_conntrack_max

问题现象

ECS Linux 实例出现间歇性丢包,无法连接实例,通过 tracert、mtr 等工具排查,外部网络未见异常。同时,如下图所示,在系统日志中重复出现大量(table full, dropping packet.)错误信息。

 
  1. Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
  2. Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
  3. Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.
  4. Feb 6 16:05:07 i-*** kernel: nf_conntrack: table full, dropping packet.

原因分析

ip_conntrack 是 Linux 系统内 NAT 的一个跟踪连接条目的模块。ip_conntrack 模块会使用一个哈希表记录 TCP 协议 established connection 记录,当这个哈希表满了的时候,便会导致 nf_conntrack: table full, dropping packet 错误。Linux 系统会开辟一个空间用来维护每一个 TCP 链接,这个空间的大小与 nf_conntrack_bucketsnf_conntrack_max 相关,后者的默认值是前者的 4 倍,而前者在系统启动后无法修改,所以一般都是建议调大 nf_conntrack_max

注意:系统维护连接比较消耗内存,请在系统空闲和内存充足的情况下调大 nf_conntrack_max,且根据系统的情况而定。

解决思路

  1. 使用管理终端登录实例。
  2. 执行命令 # vi /etc/sysctl.conf 编辑系统内核配置。
  3. 修改哈希表项最大值参数:net.netfilter.nf_conntrack_max = 655350
  4. 修改超时参数:net.netfilter.nf_conntrack_tcp_timeout_established = 1200,默认情况下 timeout 是 432000(秒)。
  5. 执行命令 # sysctl -p 使配置生效。

Time wait bucket table overflow 报错

此处涉及的内核参数:

  • net.ipv4.tcp_max_tw_buckets

问题现象

Linux 实例 /var/log/message 日志全是类似 kernel: TCP: time wait bucket table overflow 的报错信息,提示 time wait bucket table 溢出,如下:

 
  1. Feb 18 12:28:38 i-*** kernel: TCP: time wait bucket table overflow
  2. Feb 18 12:28:44 i-*** kernel: printk: 227 messages suppressed.
  3. Feb 18 12:28:44 i-*** kernel: TCP: time wait bucket table overflow
  4. Feb 18 12:28:52 i-*** kernel: printk: 121 messages suppressed.
  5. Feb 18 12:28:52 i-*** kernel: TCP: time wait bucket table overflow
  6. Feb 18 12:28:53 i-*** kernel: printk: 351 messages suppressed.
  7. Feb 18 12:28:53 i-*** kernel: TCP: time wait bucket table overflow
  8. Feb 18 12:28:59 i-*** kernel: printk: 319 messages suppressed.

执行命令 netstat -ant|grep TIME_WAIT|wc -l 统计处于 TIME_WAIT 状态的 TCP 连接数,发现处于 TIME_WAIT 状态的 TCP 连接非常多。

原因分析

参数 net.ipv4.tcp_max_tw_buckets 可以调整内核中管理 TIME_WAIT 状态的数量,当实例中处于 TIME_WAIT 及需要转换为 TIME_WAIT 状态连接数之和超过了 net.ipv4.tcp_max_tw_buckets 参数值时,message 日志中将报错 time wait bucket table,同时内核关闭超出参数值的部分 TCP 连接。您需要根据实际情况适当调高 net.ipv4.tcp_max_tw_buckets,同时从业务层面去改进 TCP 连接。

解决思路

  1. 执行命令 netstat -anp |grep tcp |wc -l 统计 TCP 连接数。
  2. 执行命令 vi /etc/sysctl.conf,查询 net.ipv4.tcp_max_tw_buckets 参数。如果确认连接使用很高,容易超出限制。
  3. 调高参数 net.ipv4.tcp_max_tw_buckets,扩大限制。
  4. 执行命令 # sysctl -p 使配置生效。

Linux 实例中 FIN_WAIT2 状态的 TCP 链接过多

此处涉及的内核参数:

  • net.ipv4.tcp_fin_timeout

问题现象

FIN_WAIT2 状态的 TCP 链接过多。

原因分析

  • HTTP 服务中,Server 由于某种原因会主动关闭连接,例如 KEEPALIVE 超时的情况下。作为主动关闭连接的 Server 就会进入 FIN_WAIT2 状态。
  • TCP/IP 协议栈中,存在半连接的概念,FIN_WAIT2 状态不算做超时,如果 Client 不关闭,FIN_WAIT_2 状态将保持到系统重启,越来越多的 FIN_WAIT_2 状态会致使内核 Crash。
  • 建议调小 net.ipv4.tcp_fin_timeout 参数,减少这个数值以便加快系统关闭处于 FIN_WAIT2 状态的 TCP 连接。

解决思路

  1. 执行命令 vi /etc/sysctl.conf,修改或加入以下内容:

     
    1. net.ipv4.tcp_syncookies = 1
    2. net.ipv4.tcp_fin_timeout = 30
    3. net.ipv4.tcp_max_syn_backlog = 8192
    4. net.ipv4.tcp_max_tw_buckets = 5000
  2. 执行命令 # sysctl -p 使配置生效。

    注意:由于 FIN_WAIT2 状态的 TCP 连接会进入 TIME_WAIT 状态,请同时参阅 time wait bucket table overflow 报错。

Linux 实例中出现大量 CLOSE_WAIT 状态的 TCP 连接

问题现象

执行命令 netstat -atn|grep CLOSE_WAIT|wc -l 发现当前系统中处于 CLOSE_WAIT 状态的 TCP 连接非常多。

原因分析

关闭 TCP 连接时,TCP 连接的两端都可以发起关闭连接的请求,若对端发起了关闭连接,但本地没有关闭连接,那么该连接就会处于 CLOSE_WAIT 状态。虽然该连接已经处于半开状态,但是已经无法和对端通信,需要及时的释放掉该链接。建议从业务层面及时判断某个连接是否已经被对端关闭,即在程序逻辑中对连接及时关闭检查。

解决思路

编程语言中对应的读、写函数一般包含了检测 CLOSE_WAIT TCP 连接功能,例如:

Java 语言:

  1. 通过 read 方法来判断 I/O 。当 read 方法返回 -1 时则表示已经到达末尾。
  2. 通过 close 方法关闭该链接。

C 语言:

  1. 检查 read 的返回值。
    • 若等于 0 则可以关闭该连接。
    • 若小于 0 则查看 errno,若不是 AGAIN 则同样可以关闭连接。

客户端配置 NAT 后仍无法访问 ECS 或 RDS 远端服务器

此处涉及的内核参数:

  • net.ipv4.tcp_tw_recycle
  • net.ipv4.tcp_timestamps

问题现象

客户端配置 NAT 后无法访问远端 ECS、RDS,包括配置了 SNAT 的 VPC ECS 。同时无法访问连接其他 ECS 或 RDS 等云产品,抓包检测发现远端对客户端发送的 SYN 包没有响应。

原因分析

若远端服务器的内核参数 net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_timestamps 的值都为 1,则远端服务器会检查每一个报文中的时间戳(Timestamp),若 Timestamp 不是递增的关系,不会响应这个报文。配置 NAT 后,远端服务器看到来自不同的客户端的源 IP 相同,但 NAT 前每一台客户端的时间可能会有偏差,报文中的 Timestamp 就不是递增的情况。

解决思路

  • 远端服务器为 ECS 时,修改参数 net.ipv4.tcp_tw_recycle 为 0。
  • 远端服务器为 RDS 等 PaaS 服务时。RDS 无法直接修改内核参数,需要在客户端上修改参数 net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_timestamps 为 0。

文档涉及的 Linux 内核参数说明

参数 说明
net.ipv4.tcp_max_syn_backlog 该参数决定了系统中处于 SYN_RECV 状态的 TCP 连接数量。SYN_RECV 状态指的是当系统收到 SYN 后,作了 SYN+ACK 响应后等待对方回复三次握手阶段中的最后一个 ACK 的阶段。
net.ipv4.tcp_syncookies 该参数表示是否打开 TCP 同步标签(SYN_COOKIES),内核必须开启并编译 CONFIG_SYN_COOKIES,SYN_COOKIES 可以防止一个套接字在有过多试图连接到达时引起过载。默认值 0 表示关闭。
当该参数被设置为 1 且 SYN_RECV 队列满了之后,内核会对 SYN 包的回复做一定的修改,即,在响应的 SYN+ACK 包中,初始的序列号是由源 IP + Port、目的 IP + Port 及时间这五个参数共同计算出一个值组成精心组装的 TCP 包。由于 ACK 包中确认的序列号并不是之前计算出的值,恶意攻击者无法响应或误判,而请求者会根据收到的 SYN+ACK 包做正确的响应。启用 net.ipv4.tcp_syncookies 后,会忽略 net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_synack_retries 该参数指明了处于 SYN_RECV 状态时重传 SYN+ACK 包的次数。
net.ipv4.tcp_abort_on_overflow 设置该参数为 1 时,当系统在短时间内收到了大量的请求,而相关的应用程序未能处理时,就会发送 Reset 包直接终止这些链接。建议通过优化应用程序的效率来提高处理能力,而不是简单地 Reset。
默认值: 0。
net.core.somaxconn 该参数定义了系统中每一个端口最大的监听队列的长度,是个全局参数。该参数和 net.ipv4.tcp_max_syn_backlog 有关联,后者指的是还在三次握手的半连接的上限,该参数指的是处于 ESTABLISHED 的数量上限。若您的 ECS 实例业务负载很高,则有必要调高该参数。listen(2) 函数中的参数 backlog 同样是指明监听的端口处于 ESTABLISHED 的数量上限,当 backlog 大于 net.core.somaxconn时,以 net.core.somaxconn 参数为准。
net.core.netdev_max_backlog 当内核处理速度比网卡接收速度慢时,这部分多出来的包就会被保存在网卡的接收队列上,而该参数说明了这个队列的数量上限。

参考链接

    1. Linux man-pages
    2. kernel/git/torvalds/linux.git_proc
    3. kernel/git/torvalds/linux.git_proc_net_tcp
    4. kernel/git/torvalds/linux.git_ip-sysctl
    5. kernel/git/torvalds/linux.git_netfilter-sysctl
    6. kernel/git/torvalds/linux.git_nf_conntrack-sysctl

cephfs linux kernel client 针对 linux page cache 的操作

cephfs linux kernel client 针对 linux page cache 的操作

针对 linux page cache 的操作主要体现在 struct address_space_operations 数据结构中,cephfs 处理 linux page cache 的函数集合如下:

const struct address_space_operations ceph_aops = {

        .readpage = ceph_readpage,

        .readpages = ceph_readpages,

        .writepage = ceph_writepage,

        .writepages = ceph_writepages_start,

        .write_begin = ceph_write_begin,

        .write_end = ceph_write_end,

        .set_page_dirty = ceph_set_page_dirty,

        .invalidatepage = ceph_invalidatepage,

        .releasepage = ceph_releasepage,

        .direct_IO = ceph_direct_io,

};

 

ceph_readpage(struct file *filp, struct page *page)

|__调用 readpage_nounlock (filep, page)     在加锁的情况下读取一个物理内存页的数据

    |__确定 page 的 offset 没有超出 inode 的总长度

    |__调用 ceph_readpage_from_fscache () 函数尝试从 fscache 中读取一个物理内存页的数据

        |__若读取成功则直接返回

    |__调用 ceph_osdc_readpages () 函数从 ceph 集群中读取一个物理内存页的数据

        |__调用 ceph_osdc_new_reqeust () 函数创建一个读请求

        |__调用 osd_req_op_extent_osd_data_pages () 函数为读请求的返回内容分配内存空间

        |__调用 ceph_osdc_start_request () 函数将读请求同步发送给 ceph 集群

    |__调用 flush_dcache_page () 函数刷 page 到 dcache 中

    |__调用 SetPageUptodate () 函数设置物理内存页的状态是 update 的

    |__调用 ceph_readpage_to_fscache () 函数将新读到的物理内存页更新到 fscache 中

|__调用 unlock_page (page)

    |__调用 clear_bit_unlock () 函数为 page 解锁

    |__调用 wake_up_page () 函数唤醒等待该 page 的相关进程

 

ceph_readpages (struct file *file, struct address_space *mapping, struct list_head *page_list, unsigned nr_pages)    读取多个页

|__调用 ceph_readpages_from_fscache () 函数尝试从 fscache 中读取多个物理内存页的数据

    |__若读取成功则直接返回

|__遍历 page_list

    |__调用 start_read () 函数读取数据到 page_list 所包含的物理内存页

        |__调用 ceph_osdc_new_reqeust () 函数创建一个读请求

        |__调用 calc_pages_for (0, len) 函数得到读取指定长度 len 的数据需要的物理内存页数

        |__从 page_list 中摘下指定数量的物理内存页

        |__调用 osd_req_op_extent_osd_data_pages () 函数将从 page_list 中摘下的物理内存页作为读请求的接收缓冲

        |__设置读请求完成后的回调函数为 finish_read ()

        |__调用 ceph_osdc_start_request () 函数将读请求同步发送给 ceph 集群

 

finish_read (struct ceph_osd_request *req)        从 ceph 集群中读操作结束后的回调函数

|__遍历读取到的所有物理内存页

    |__调用 flush_dcache_page () 函数将 page 中的内存刷到 dcache 中

    |__调用 SetPageUptodate () 函数设置 page 的状态是 uptodate 的

    |__调用 ceph_readpage_to_fscache () 函数将读取到的 page 内存同步到 fscache 中

 

ceph_writepage(struct page *page, struct writeback_control *wbc)

|__调用 writepage_nounlock (page,wbc) 函数同步 page 信息到 ceph 集群

    |__调用 page_snap_context () 函数得到 page 的 snap context 信息 (page 将 CephSnapContext 信息写入到 page 的 private 中)

    |__调用 set_page_writeback (page) 函数设置 page writeback 标识

    |__调用 ceph_osdc_writepages () 函数将 page 信息同步写到 ceph 集群

        |__调用 ceph_osdc_new_reqeust () 函数创建一个写请求

        |__调用 osd_req_op_extent_osd_data_pages () 函数为写请求设置写内容物理内存页

        |__调用 ceph_osdc_start_request () 函数将写请求同步发送给 ceph 集群

    |__设置 page->private=0,即:删除 page 的 CephSnapContext 信息

    |__调用 ClearPagePrivate (page) 函数清空 page 的 private

    |__调用 end_page_writeback () 函数

        |__调用 wake_up_page (page, PG_writeback) 函数唤醒在 page 上等待 writeback 完成的进程

 

ceph_writepages_start(struct address_space *mapping, struct writeback_control *wbc)

|__调用 pagevec_init (&pvec, 0) 函数初始化 struct pagevec 实例 pvec

|__从 wbc 的 range_start 和 range_end 中得到 start 和 end

|__调用 pagevec_lookup_tag (&pvec, mapping, PAGECACHE_TAG_DIRTY…) 函数从 mapping 中 radix tree 中找到 tags==PAGECACHE_TAG_DIRTY 的所有 pages 且将所有 pages 写入到 pvec 中

|__遍历所有 PAGECACHE_TAG_DIRTY 的 pages

    |__调用 page_offset () 函数得到 page 所在的 offset 值

    |__调用 ceph_calc_file_object_mapping () 函数得到从 offset 开始,长度是 len 的文件所占用的 objects 个数以及在 object 中的偏移

    |__将 page 添加到 pages 数组中

|__从 pages 数组中得到 offset 值,即:offset=page_offset (pages [0])

|__调用 ceph_osdc_new_request () 函数创建一个写数据请求

|__设置写数据请求的回调函数为 writepages_finish

|__调用 osd_req_op_extent_osd_data_pages () 函数添加写请求额外的数据

|__调用 ceph_osdc_start_request () 函数将写请求同步发送到 ceph 集群

 

writepages_finish(struct ceph_osd_request *req)

|__清除所有在发送写请求过程中产生的内存

 

ceph_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigend flags, staruct page **pagep, void **fsdata)

|__得到 pos 所在的 page 位置,即:index=pos >> PAGE_SHIFT

|__调用 grab_cache_page_write_begin (mapping, index, flags) 函数在 pagecache 中指定位置 index 出获取或创建一个物理内存页 page

    |__调用 pagecache_get_page () 函数在 pagecache 中指定位置 index 出获取或创建一个物理内存页 page

    |__调用 wait_for_stable_page (page) 函数等待该 page 上的 writeback 函数返回

|__调用 ceph_update_writeable_page (file, pos, len, page) 函数只允许往 clean page 里写入数据或者已经 dirty 的 snap context 里写入数据

    |__调用 wait_on_page_writeback (page) 函数等待 page 的 writeback 完成

    |__调用 page_snap_context (page) 函数得到该 page 的 snap context

    |__若 snap context 的 seq > oldest->seq

        |__调用 ceph_queue_writeback (inode) 函数将 inode 放入到 writeback 队列中

    |__调用 clear_page_dirty_for_io (page) 函数清除 page 上的 dirty 标识

    |__调用 writepage_nounlock (page, NULL) 函数将 page 数据同步的写入到 ceph 集群

    |__调用 PageUptodate (page) 检查 page 是否是 uptodate 的

        |__是则直接返回

    |__若 page 已经满了

        |__直接返回

    |__调用 i_size_read (inode) 函数得到 inode 的读数据的大小

    |__调用 readpage_nounlock (file, page) 函数从 ceph 集群中读取数据到 page 中

 

ceph_write_end(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned copied, struct page **page, void *fsdata)

|__若 copied < len

    |__调用 zero_user_segment (page, from+copied, len) 函数将 page 中从 from+copied 一直到 from+copied+len 的内存空间置 0

|__若 pos+copied > i_size_read (inode)

    |__调用 ceph_inode_set_size () 函数设置 inode 的 size 为 pos+copied

|__若 Page 不是 uptodate 的

    |__调用 SetPageUptodate (page) 函数设置 page 是 uptodate 的

|__调用 set_page_dirty (page) 函数设置 page 是 dirty 的

 

ceph_set_page_dirty(struct page *page)

|__若 PageDirty (page)

    |__直接返回

|__通过 mapping 的到 struct ceph_inode_info 结构

|__调用__ceph_have_pending_cap_snap () 函数检查 cephfs 是否有 snaps

    |__从 struct ceph_inode_info 结构中的 i_cap_snaps 列表中得到 struct ceph_cap_snap 结构

    |__从 struct ceph_cap_snap 结构中得到 struct ceph_snap_context 结构

|__若 cephfs 没有 snaps

    |__调用 ceph_get_snap_context () 函数从 struct ceph_inode_info 的 i_head_spapc 中得到 struct ceph_snap_context 结构

|__将 struct ceph_snap_context 结构设置到 page 的 private 中,即:page->private=snapc

|__调用__set_page_dirty_nobuffers () 函数将 page 在 address_spaces 中的 radix tree 中设置成 dirty

 

ceph_invalidatepage(struct page *page, unsigned int offset, unsigned int length)

|__调用 ceph_invalidate_fscache_page () 函数使得 page 在 fscache 中无效

|__若 page 没有 private

    |__直接返回

|__设置 page->private=0 清除 page 的 snaps

|__调用 ClearPagePriavte (page)

 

ceph_releasepage(struct page *page, gfp_t g)

|__调用 ceph_release_fscache_page () 函数在 fscache 中删除 page

|__返回!PagePrivate (page)

 

ceph_direct_io(struct kiocb *iocb, struct iov_iter *iter)

|__返回 - EINVAL

EasyWSL工具将 Linux Docker 映像转换为适用于 Linux 的

EasyWSL工具将 Linux Docker 映像转换为适用于 Linux 的

适用于 Linux 的 Windows 子系统允许管理员直接从 Windows 访问基于 Linux 的工具,但并非每个 Linux 发行版都可以通过 Microsoft Store 获得。

现在有一个名为 EasyWSL 的新工具可以将几乎任何 Linux Docker 映像转换为 WSL 发行版。

EasyWSL 由网络安全公司 Red Code Labs 创建。

“我觉得我们可以通过 WSL 以某种方式将更多的 Linux 灵魂带入 Windows,这比微软在他们的商店中提供的更多,” Red Code Labs 解释道。

EasyWSL 在从 Microsoft Store 获取图像方面也具有一些优势,因为这些图像通常由 3rd 方提供,因此可能已被更改。

“基本上,一开始尝试使用 Arch 和 Gentoo 及其存储库是一个好主意,但后来我意识到,为什么不以某种方式从 Docker Hub 获取图像,以扩大可能性。”

WSL 用户现在可以直接从原始维护者那里下载 Docker 镜像,并且知道构建没有以任何方式改变。

EasyWSL 是一个开源工具。

ld:在 /buildtools/linux/x86-32 中找不到 /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6

ld:在 /buildtools/linux/x86-32 中找不到 /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6

如何解决ld:在 /buildtools/linux/x86-32 中找不到 /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6

在 Ubuntu 20.10 上使用 GCC 10.2.0、glibc 2.32 和 binutils 2.35.1 为 Linux 64 位编译 GCC 10.2.0 Linux 32 位交叉编译器。我收到了这个错误,似乎 GCC 通过找到让我搞砸的方法来阻止我获得交叉编译器。 (我是构建它而不是从 apt 下载它,因为你不能同时安装 multilib GCC 和交叉编译器)

/projects/gcc-linux-x86-32/./gcc/xgcc -B/projects/gcc-linux-x86-32/./gcc/ -B/buildtools/linux/x86-32/usr/i686-linux-gnu/bin/ -B/buildtools/linux/x86-32/usr/i686-linux-gnu/lib/ -isystem /buildtools/linux/x86-32/usr/i686-linux-gnu/include -isystem /buildtools/linux/x86-32/usr/i686-linux-gnu/sys-include    -O2  -O3 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wno-error=format-diag -Wstrict-prototypes -Wmissing-prototypes -Wno-error=format-diag -Wold-style-deFinition  -isystem ./include  -fpic -mlong-double-80 -DUSE_ELF_SYMVER  -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector  -shared -nodefaultlibs -Wl,--soname=libgcc_s.so.1 -Wl,--version-script=libgcc.map -o ./libgcc_s.so.1.tmp -O3 -B./ _muldi3_s.o _negdi2_s.o _lshrdi3_s.o _ashldi3_s.o _ashrdi3_s.o _cmpdi2_s.o _ucmpdi2_s.o _clear_cache_s.o _trampoline_s.o __main_s.o _absvsi2_s.o _absvdi2_s.o _addvsi3_s.o _addvdi3_s.o _subvsi3_s.o _subvdi3_s.o _mulvsi3_s.o _mulvdi3_s.o _negvsi2_s.o _negvdi2_s.o _ctors_s.o _ffssi2_s.o _ffsdi2_s.o _clz_s.o _clzsi2_s.o _clzdi2_s.o _ctzsi2_s.o _ctzdi2_s.o _popcount_tab_s.o _popcountsi2_s.o _popcountdi2_s.o _paritysi2_s.o _paritydi2_s.o _powisf2_s.o _powidf2_s.o _powixf2_s.o _powitf2_s.o _mulhc3_s.o _mulsc3_s.o _muldc3_s.o _mulxc3_s.o _multc3_s.o _divhc3_s.o _divsc3_s.o _divdc3_s.o _divxc3_s.o _divtc3_s.o _bswapsi2_s.o _bswapdi2_s.o _clrsbsi2_s.o _clrsbdi2_s.o _fixunssfsi_s.o _fixunsdfsi_s.o _fixunsxfsi_s.o _fixsfdi_s.o _fixdfdi_s.o _fixxfdi_s.o _fixunssfdi_s.o _fixunsdfdi_s.o _fixunsxfdi_s.o _floatdisf_s.o _floatdidf_s.o _floatdixf_s.o _floatundisf_s.o _floatundidf_s.o _floatundixf_s.o _divdi3_s.o _moddi3_s.o _divmoddi4_s.o _udivdi3_s.o _umoddi3_s.o _udivmoddi4_s.o _udiv_w_sdiv_s.o cpuinfo_s.o tf-signs_s.o sfp-exceptions_s.o addtf3_s.o divtf3_s.o eqtf2_s.o getf2_s.o letf2_s.o multf3_s.o negtf2_s.o subtf3_s.o unordtf2_s.o fixtfsi_s.o fixunstfsi_s.o floatsitf_s.o floatunsitf_s.o fixtfdi_s.o fixunstfdi_s.o floatditf_s.o floatunditf_s.o extendsftf2_s.o extenddftf2_s.o extendxftf2_s.o trunctfsf2_s.o trunctfdf2_s.o trunctfxf2_s.o enable-execute-stack_s.o unwind-dw2_s.o unwind-dw2-fde-dip_s.o unwind-sjlj_s.o unwind-c_s.o emutls_s.o libgcc.a -lc && rm -f ./libgcc_s.so && if [ -f ./libgcc_s.so.1 ]; then mv -f ./libgcc_s.so.1 ./libgcc_s.so.1.backup; else true; fi && mv ./libgcc_s.so.1.tmp ./libgcc_s.so.1 && (echo "/* GNU ld script"; echo "   Use the shared library,but some functions are only in"; echo "   the static library.  */"; echo "GROUP ( libgcc_s.so.1 -lgcc )" ) > ./libgcc_s.so
/buildtools/linux/x86-32/usr/i686-linux-gnu/bin/ld: cannot find /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6 inside /buildtools/linux/x86-32
/buildtools/linux/x86-32/usr/i686-linux-gnu/bin/ld: cannot find /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc_nonshared.a inside /buildtools/linux/x86-32
/buildtools/linux/x86-32/usr/i686-linux-gnu/bin/ld: cannot find /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/ld-linux.so.2 inside /buildtools/linux/x86-32
collect2: error: ld returned the exit status 1
make[2]: *** [Makefile:994: libgcc_s.so] Error 1
make[2]: exiting the directory ''/projects/gcc-linux-x86-32/i686-linux-gnu/libgcc''
make[1]: *** [Makefile:13737: all-target-libgcc] Error 2
make[1]: exiting the directory ''/projects/gcc-linux-x86-32''
make: *** [Makefile:962: all] Error 2

链接器“找不到”的所有文件实际上都存在。

需要的东西是here,因为如果我把它放在这里,StackOverflow 不允许我发布它。如果您有编辑功能,请在其中进行编辑。

Linux CentOS 下安装mysql-8.0.13-linux-glibc2.12-x86_64安装

Linux CentOS 下安装mysql-8.0.13-linux-glibc2.12-x86_64安装

Linux下安装mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz

//下载 mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz
[root@root ~]# wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.16-linux-glibc2.12-x86_64.tar.xz
//解压mysql
[root@root ~]# tar -xJvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz 
……
mysql-8.0.13-linux-glibc2.12-x86_64/bin/myisamchk
mysql-8.0.13-linux-glibc2.12-x86_64/bin/myisamlog
mysql-8.0.13-linux-glibc2.12-x86_64/bin/myisampack
…… //解压完成
//重命名mysql-8.0.13-linux-glibc2.12-x86_64文件夹为mysql
[root@root ~]# mv mysql-8.0.13-linux-glibc2.12-x86_64 mysql
//将mysql移到/usr/local/ 目录下
[root@root ~]# mv /root/mysql /usr/local/
mv:是否覆盖"/usr/local/mysql"? y
//添加mysql用户组及MySQL用户
[root@root ~]# groupadd mysql
[root@root ~]# useradd -r -g mysql mysql
//设置/usr/local/mysql/文件夹的用户权限
[root@root ~]# cd /usr/local/mysql/
[root@root mysql]# chown -R mysql:mysql ./
//新建MySQL数据存储文件夹
[root@root mysql]# mkdir data
[root@root mysql]# mkdir logs
//初始化mysql数据库,生成默认密码
[root@root mysql]#  bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
2018-12-22T05:24:39.603264Z 0 [Warning] [MY-011070] [Server] ''Disablining --skip-symbolic-links (or equivalent) is the default. Consider notas it'' is deprecated and will be removed in a future release.
2018-12-22T05:24:39.603444Z 0 [System] [MY-013169] [Server] /usr/localmysqld 8.0.13) initializing of server in progress as process 27519
2018-12-22T05:24:41.891360Z 5 [Note] [MY-010454] [Server] A temporary ed for root@localhost: ePrOX&p>L52#  //这是初始默认密码
2018-12-22T05:24:43.475923Z 0 [System] [MY-013170] [Server] /usr/localmysqld 8.0.13) initializing of server has completed
[Server] A temporary password is generated for root@localhost: lqs-.d,fN1pB


[root@iZwz9ijcs0cia5xad0sewhZ mysql]#  bin/mysqld --initialize --lower-case-table-names=1 --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
2019-07-01T08:42:30.346859Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.16) initializing of server in progress as process 15888
2019-07-01T08:42:33.616199Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: lqs-.d,fN1pB
2019-07-01T08:42:35.006735Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.16) initializing of server has completed

//设置数据库存储文件夹的用户权限
[root@root mysql]# chown -R root:root ./
[root@root mysql]# chown -R mysql:mysql data
[root@root mysql]# chown -R mysql:mysql logs

 root@localhost: A+?;j7fD%o2y
## 异常安装

 bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
解决方法:

1.安装numactl软件包

复制代码
[root@testvm01 mysql]# yum -y install numactl
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package numactl.x86_64 0:2.0.9-2.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================================================================================================================================================
 Package                                     Arch                                       Version                                          Repository                                       Size
===============================================================================================================================================================================================
Installing:
 numactl                                     x86_64                                     2.0.9-2.el6                                      rhel-source                                      74 k

Transaction Summary
===============================================================================================================================================================================================
Install       1 Package(s)

Total download size: 74 k
Installed size: 171 k
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : numactl-2.0.9-2.el6.x86_64                                                                                                                                                  1/1 
  Verifying  : numactl-2.0.9-2.el6.x86_64                                                                                                                                                  1/1 

Installed:
  numactl.x86_64 0:2.0.9-2.el6                                                                                                                                                                 

Complete!

sudo yum install libaio
Last metadata expiration check: 19:59:07 ago on Wed 28 Aug 2024 02:21:06 AM CST.
Dependencies resolved.
======================================================================================================
 Package            Architecture       Version                    Repository                     Size
======================================================================================================
Installing:
 libaio             x86_64             0.3.111-13.el9             ol9_baseos_latest              24 k

Transaction Summary
======================================================================================================
Install  1 Package

[root@suven mysql]#  bin/mysqld --initialize --lower-case-table-names=1 --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
2024-08-28T14:22:28.335314Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.26) initializing of server in progress as process 13248
2024-08-28T14:22:28.374119Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-08-28T14:22:29.321054Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-08-28T14:22:31.148398Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1 is enabled for channel mysql_main
2024-08-28T14:22:31.148713Z 0 [Warning] [MY-013746] [Server] A deprecated TLS version TLSv1.1 is enabled for channel mysql_main
2024-08-28T14:22:31.235679Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: A+?;j7fD%o2y

修改etc/my.cnf配置文件,修改为以下内容:

[root@root ~]# vim /etc/my.cnf

1.第一种
[mysqld]
server-id                      = 1
port                           = 3306
bind-address                   = 0.0.0.0 
max_connections                = 5000
mysqlx_port                    = 33060
mysqlx_socket                  = /tmp/mysqlx.sock
basedir                        = /usr/local/mysql
datadir                        = /usr/local/mysql/data
socket                         = /tmp/mysql.sock
pid-file                       = /tmp/mysqld.pid
slow_query_log                 = ON
slow_query_log_file            = /usr/local/mysql/logs/slow.log
log-error                      = /usr/local/mysql/logs/error.log
long_query_time                = 0.2
log-bin                        = bin.log
relay-log                      = relay.log
binlog_format                  = ROW
relay_log_recovery             = 1
character-set-client-handshake = FALSE
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
init_connect                   =''SET NAMES utf8mb4''
innodb_buffer_pool_size        = 1G
join_buffer_size               = 128M
sort_buffer_size               = 2M
read_rnd_buffer_size           = 2M
log_timestamps                 = SYSTEM
lower_case_table_names         = 1
default-authentication-plugin  = mysql_native_password

2.第二种
[client]
port                           = 3306
#socket                         = /usr/local/mysql/mysql.sock

[mysqld]
server-id                      = 1
port                           = 3306
bind-address                   = 0.0.0.0
max_connections                = 5000
max_user_connections           = 4500
#mysqlx_port                    = 33060
basedir                        = /usr/local/mysql
datadir                        = /usr/local/mysql/data

init_connect                   =''SET NAMES utf8mb4''
innodb_buffer_pool_size        = 2048M
join_buffer_size               = 512M
sort_buffer_size               = 2M
read_rnd_buffer_size           = 2M
#log_timestamps                 = SYSTEM
sql_mode =''STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION''

保存退出。

[root@root mysql]# chmod 777 /etc/my.cnf 
//设置开机自启动
[root@root mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
[root@root mysql]# chmod +x /etc/init.d/mysql 
//注册查看服务
[root@root mysql]# chkconfig --add mysql
[root@root mysql]# chkconfig --list mysql
mysql              0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
//    /etc/ld.so.conf 这个文件记录了编译时使用的动态链接库的路径,告诉链接器去哪个路径下寻找链接时需要用到的库,如果找不到,就会提示链接错误。
如果我们安装了第三方的库,而没有将它放在链接器可以找到的目录,则运行使用这些第三方库的程序时,会提示找不到库。
[root@root mysql]# vim /etc/ld.so.cnf
添加如下内容:
include ld.so.conf.d/*.conf
/usr/local/mysql/lib

配置环境变量
[root@root mysql]# vim /etc/profile
添加如下内容:
export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
//让配置文件立马生效
[root@root mysql]# source /etc/profile
//启动MySQL服务
重启数据库,并连接数据修,修改初始账号密码
[root@root mysql]# service mysql start
//使用生成的密码登陆MySQL数据库
[root@root mysql]# mysql -u root -p
mysql: [Warning] World-writable config file ''/etc/my.cnf'' is ignored.
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.13
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ''help;'' or ''\h'' for help. Type ''\c'' to clear the current input statement.
//修改密码
mysql> alter user ''root''@''localhost'' identified by ''123456'';
Query OK, 0 rows affected (0.13 sec)
mysql>FLUSH PRIVILEGES; 
mysql> exit
重先连接数据库,添加角色账号和角色权限
//退出重登录mysql
[root@root mysql]# mysql -u root -p
mysql: [Warning] World-writable config file ''/etc/my.cnf'' is ignored.
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ''help;'' or ''\h'' for help. Type ''\c'' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
到此安装完成!
这里设置的 /etc/my.cnf 权限是777 ,就是任何人都可读可写,my.cnf 会被忽略掉,mysql的安全机制,也可以不要my.cnf配置文件。
 
下面设置一下MySQL的远程访问
简单写一下命令,自己写的时候忘了记录,网上也是一大堆。
登陆mysql
mysql -u root -p 
use mysql;
select host,user from user;
 
CREATE USER ''root''@''%'' IDENTIFIED BY ''123456'';
GRANT ALL ON *.* TO ''root''@''%'';
flush privileges;
ALTER USER ''root''@''%'' IDENTIFIED BY ''123456'' PASSWORD EXPIRE NEVER; 
ALTER USER ''root''@''%'' IDENTIFIED WITH mysql_native_password BY ''123456''; 
FLUSH PRIVILEGES; 
 
下面一定要记得关闭防火墙
service iptables stop
 
设置防火墙开机不启动
chkconfig iptables off 
 
然后关机重启,连接试一试吧!
# 不关闭防火墙的话无法使用
1、命令行界面输入命令“systemctl status firewalld.service”并按下回车键。
2、然后在下方可度以查看得到“active(running)”,此时说明防火墙已经被打开了。
3、在命令行中输入systemctl stop firewalld.service命令,进行关闭防火墙。
4、然后再使用命令systemctl status firewalld.service,在下方出现disavtive(dead),这权样就说明防火墙已经关闭。
5、再在命令行中输入命令“systemctl disable firewalld.service”命令,即可永久关闭防火墙。

systemctl stop firewalld.service #关闭
systemctl restart firewalld.service #重启
systemctl status firewalld.service #查看状态
systemctl disable firewalld.service #永久关闭

今天关于Linux 实例常用内核网络参数介绍与常见问题处理linux网络内核分析的分享就到这里,希望大家有所收获,若想了解更多关于cephfs linux kernel client 针对 linux page cache 的操作、EasyWSL工具将 Linux Docker 映像转换为适用于 Linux 的、ld:在 /buildtools/linux/x86-32 中找不到 /buildtools/linux/x86-32/usr/i686-linux-gnu/lib/libc.so.6、Linux CentOS 下安装mysql-8.0.13-linux-glibc2.12-x86_64安装等相关知识,可以在本站进行查询。

本文标签: