Linux:NFS 无法挂载异常案例 (1)

文章目录

  • 1. 前言
  • 2. 问题
  • 3. 分析和解决

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 问题

由于开发的嵌入式板的 NOR FLASH 剩余空间过小,仅剩 65 MB,也没有接口外挂存储设备,且无法通过删减来增大空间,于是打算通过 NFS 远程挂载,于是执行下面命令进行挂载:

# mount -t nfs -o nolock 192.168.0.36:/home/XXX/nfs-share /test/nfs-remote
mount: /test/nfs-remote: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program.

可以看到,mount 程序报错了。笔者有点懵逼,因为这条挂载命令,在一款 Linux 4.19 内核的设备上,曾使用无数次,一直没有任何问题。现在测试的环境,内核版本为 Linux 5.10

3. 分析和解决

mount 命令本身,不是笔者的第一怀疑对象,毕竟是个老牌应用,在常规操作上出错的可能性不高;更大的可能是 NFS 在高版本内核上的实现差异,先用 strace 大概跟了一下,看有没有什么地方出错了:

# strace mount -t nfs -o nolock 192.168.0.36:/home/XXX/nfs-share /test/nfs-remote
[...]
mount("192.168.0.36:/home/XXX/nfs-share", "/test/nfs-remote", "nfs", 0, "nolock") = -1 EINVAL (Invalid argument)
[...]

可以看到,mount() 系统调用报错,错误码为 EINVAL。再用 ftrace 跟一下 do_mount() 函数(系统调用 mount() 调用了 do_mount()),看哪里出错了(追踪内容有删减,只展示了出错调用的主干流程):

# cd /sys/kernel/debug/tracing
# echo 0 > tracing_on
# echo > trace
# echo function_graph > current_tracer
# echo do_mount > set_graph_function
# echo 1 > tracing_on
# mount -t nfs -o nolock 192.168.0.36:/home/XXX/nfs-share /test/nfs-remote
# cat trace
# tracer: function_graph
#
# CPU  DURATION                  FUNCTION CALLS
# |     |   |                     |   |   |   |2)               |  do_mount() {2)               |    user_path_at_empty() {2)               |      getname_flags() {2)               |        kmem_cache_alloc() {2)   4.667 us    |          should_failslab();2) + 14.875 us   |        }2) + 23.917 us   |      }2)               |      filename_lookup() {2)   4.375 us    |        set_nameidata();2)               |        path_lookupat() {2)               |          path_init() {2)   5.250 us    |            __rcu_read_lock();2)               |            nd_jump_root() {2)   4.375 us    |              set_root();2) + 14.000 us   |            }2) + 32.667 us   |          }2)               |          link_path_walk() {2)               |            inode_permission() {2)   4.375 us    |              generic_permission();2) + 14.000 us   |            }2)               |            walk_component() {2)               |              lookup_fast() {2)   5.833 us    |                __d_lookup_rcu();2) + 14.291 us   |              }2)   4.667 us    |              step_into();2) + 31.791 us   |            }2)               |            inode_permission() {2)   4.083 us    |              generic_permission();2) + 14.292 us   |            }2) + 77.875 us   |          }2)               |          walk_component() {2)               |            lookup_fast() {2)   5.833 us    |              __d_lookup_rcu();2) + 14.292 us   |            }2)   4.375 us    |            step_into();2) + 35.583 us   |          }2)               |          complete_walk() {2)               |            try_to_unlazy() {2)   4.375 us    |              legitimize_links();2)               |              __legitimize_path() {2)   5.834 us    |                __legitimize_mnt();2) + 14.584 us   |              }2)   4.375 us    |              legitimize_root();2)   4.083 us    |              __rcu_read_unlock();2) + 52.500 us   |            }2)   4.083 us    |            success_walk_trace();2) + 71.750 us   |          }2)               |          terminate_walk() {2)   4.084 us    |            drop_links();2)               |            path_put() {2)   4.375 us    |              dput();2)   4.375 us    |              mntput();2) + 23.625 us   |            }2) + 40.834 us   |          }2) ! 285.833 us  |        }2)   4.375 us    |        restore_nameidata();2)               |        putname() {2)   4.958 us    |          kmem_cache_free();2) + 14.875 us   |        }2) ! 331.041 us  |      }2) ! 368.084 us  |    }2)               |    path_mount() {2)               |      ns_capable() {2)               |        ns_capable_common() {2)   4.375 us    |          cap_capable();2) + 13.125 us   |        }2) + 23.333 us   |      }2)               |      get_fs_type() {2)               |        __get_fs_type() {2)               |          _raw_read_lock() {2)   4.375 us    |            preempt_count_add();2) + 14.583 us   |          }2) + 18.083 us   |          find_filesystem();2)   4.958 us    |          try_module_get();2)               |          _raw_read_unlock() {2)   4.375 us    |            preempt_count_sub();2) + 13.125 us   |          }2) + 73.208 us   |        }2) + 84.292 us   |      }2)               |      fs_context_for_mount() {2)               |        alloc_fs_context() {2)               |          kmem_cache_alloc_trace() {2)   4.084 us    |            should_failslab();2) + 15.167 us   |          }2)               |          get_filesystem() {2)   ==========> |2)               |            gic_handle_irq() {2)               |              __handle_domain_irq() {2)   1.750 us    |                irq_find_mapping();2)   5.833 us    |                irq_to_desc();2)               |                irq_enter() {2)               |                  irq_enter_rcu() {2)   1.750 us    |                    preempt_count_add();2)   5.250 us    |                  }2)   8.167 us    |                }2)               |                handle_percpu_devid_irq() {2)               |                  arch_timer_handler_phys() {2)               |                    hrtimer_interrupt() {2)               |                      _raw_spin_lock_irqsave() {2)   1.750 us    |                        preempt_count_add();2)   4.666 us    |                      }2)               |                      ktime_get_update_offsets_now() {2)   1.459 us    |                        arch_counter_read();2)   4.958 us    |                      }2)               |                      __hrtimer_run_queues() {2)   1.750 us    |                        __remove_hrtimer();2)               |                        _raw_spin_unlock_irqrestore() {2)   1.459 us    |                          preempt_count_sub();2)   4.667 us    |                        }2)               |                        tick_sched_timer() {2)               |                          ktime_get() {2)   1.459 us    |                            arch_counter_read();2)   4.667 us    |                          }2)               |                          tick_sched_do_timer() {2)               |                            tick_do_update_jiffies64() {2)               |                              _raw_spin_lock() {2)   1.459 us    |                                preempt_count_add();2)   4.667 us    |                              }2)               |                              do_timer() {2)   2.042 us    |                                calc_global_load();2)   4.667 us    |                              }2)               |                              _raw_spin_unlock() {2)   1.458 us    |                                preempt_count_sub();2)   4.666 us    |                              }2)               |                              update_wall_time() {2)               |                                timekeeping_advance() {2)               |                                  _raw_spin_lock_irqsave() {2)   1.750 us    |                                    preempt_count_add();2)   4.667 us    |                                  }2)   1.750 us    |                                  arch_counter_read();2)   1.458 us    |                                  ntp_tick_length();2)   1.458 us    |                                  ntp_tick_length();2)               |                                  timekeeping_update() {2)   1.750 us    |                                    ntp_get_next_leap();2)   1.750 us    |                                    update_vsyscall();2)               |                                    raw_notifier_call_chain() {2)   1.750 us    |                                      notifier_call_chain();2)   4.667 us    |                                    }2)   1.750 us    |                                    update_fast_timekeeper();2)   1.459 us    |                                    update_fast_timekeeper();2) + 21.000 us   |                                  }2)               |                                  _raw_spin_unlock_irqrestore() {2)   1.458 us    |                                    preempt_count_sub();2)   4.666 us    |                                  }2) + 46.083 us   |                                }2) + 49.000 us   |                              }2) + 70.875 us   |                            }2) + 73.792 us   |                          }2)               |                          tick_sched_handle() {2)               |                            update_process_times() {2)               |                              account_process_tick() {2)               |                                account_system_time() {2)               |                                  account_system_index_time() {2)   1.458 us    |                                    __rcu_read_lock();2)   1.750 us    |                                    __rcu_read_unlock();2)               |                                    cpufreq_acct_update_power() {2)               |                                      _raw_spin_lock_irqsave() {2)   1.459 us    |                                        preempt_count_add();2)   4.667 us    |                                      }2)               |                                      _raw_spin_unlock_irqrestore() {2)   1.459 us    |                                        preempt_count_sub();2)   4.375 us    |                                      }2) + 14.292 us   |                                    }2) + 24.500 us   |                                  }2) + 27.417 us   |                                }2) + 30.625 us   |                              }2)               |                              run_local_timers() {2)   1.750 us    |                                hrtimer_run_queues();2)   4.958 us    |                              }2)               |                              rcu_sched_clock_irq() {2)   1.750 us    |                                rcu_is_cpu_rrupt_from_idle();2)   1.458 us    |                                rcu_preempt_need_deferred_qs();2)   1.459 us    |                                rcu_qs();2)   2.042 us    |                                rcu_stall_kick_kthreads();2)   1.750 us    |                                rcu_is_cpu_rrupt_from_idle();2)   3.208 us    |                                rcu_segcblist_ready_cbs();2) + 23.333 us   |                              }2)               |                              scheduler_tick() {2)   1.750 us    |                                topology_scale_freq_tick();2)               |                                _raw_spin_lock() {2)   1.750 us    |                                  preempt_count_add();2)   4.666 us    |                                }2)   1.750 us    |                                update_rq_clock();2)               |                                update_thermal_load_avg() {2)   1.750 us    |                                  decay_load();2)   1.750 us    |                                  decay_load();2)   1.458 us    |                                  decay_load();2) + 11.083 us   |                                }2)               |                                task_tick_fair() {2)               |                                  update_curr() {2)   1.750 us    |                                    update_min_vruntime();2)   1.459 us    |                                    __rcu_read_lock();2)   1.458 us    |                                    __rcu_read_unlock();2) + 10.792 us   |                                  }2)               |                                  __update_load_avg_se() {2)   1.458 us    |                                    decay_load();2)   1.750 us    |                                    decay_load();2)   1.750 us    |                                    decay_load();2)               |                                    __accumulate_pelt_segments() {2)   1.750 us    |                                      decay_load();2)   1.459 us    |                                      decay_load();2)   7.583 us    |                                    }2) + 20.125 us   |                                  }2)               |                                  __update_load_avg_cfs_rq() {2)   1.750 us    |                                    decay_load();2)   1.458 us    |                                    decay_load();2)   1.750 us    |                                    decay_load();2)               |                                    __accumulate_pelt_segments() {2)   1.458 us    |                                      decay_load();2)   1.750 us    |                                      decay_load();2)   7.875 us    |                                    }2) + 20.417 us   |                                  }2)   1.750 us    |                                  update_cfs_group();2)   1.750 us    |                                  hrtimer_active();2)               |                                  update_curr() {2)   2.042 us    |                                    __calc_delta();2)   1.459 us    |                                    update_min_vruntime();2)   7.875 us    |                                  }2)               |                                  __update_load_avg_se() {2)   1.459 us    |                                    decay_load();2)   1.458 us    |                                    decay_load();2)   1.750 us    |                                    decay_load();2)               |                                    __accumulate_pelt_segments() {2)   1.459 us    |                                      decay_load();2)   1.750 us    |                                      decay_load();2)   7.583 us    |                                    }2) + 19.834 us   |                                  }2)               |                                  __update_load_avg_cfs_rq() {2)   1.750 us    |                                    decay_load();2)   1.458 us    |                                    decay_load();2)   1.459 us    |                                    decay_load();2)               |                                    __accumulate_pelt_segments() {2)   1.459 us    |                                      decay_load();2)   1.750 us    |                                      decay_load();2)   7.292 us    |                                    }2) + 19.542 us   |                                  }2)               |                                  update_cfs_group() {2)               |                                    reweight_entity() {2)   1.458 us    |                                      update_curr();2)   4.958 us    |                                    }2)   7.584 us    |                                  }2)   1.750 us    |                                  hrtimer_active();2)   1.750 us    |                                  capacity_of();2) ! 131.250 us  |                                }2)   1.458 us    |                                calc_global_load_tick();2)               |                                _raw_spin_unlock() {2)   1.750 us    |                                  preempt_count_sub();2)   4.667 us    |                                }2)   1.459 us    |                                idle_cpu();2)               |                                trigger_load_balance() {2)   1.458 us    |                                  nohz_balance_exit_idle();2)   1.458 us    |                                  __rcu_read_lock();2)   1.458 us    |                                  __rcu_read_unlock();2) + 11.375 us   |                                }2) ! 185.792 us  |                              }2)   1.750 us    |                              run_posix_cpu_timers();2) ! 255.500 us  |                            }2)   1.458 us    |                            profile_tick();2) ! 261.625 us  |                          }2)               |                          hrtimer_forward() {2)   1.458 us    |                            ktime_add_safe();2)   1.459 us    |                            ktime_add_safe();2)   7.875 us    |                          }2) ! 356.125 us  |                        }2)               |                        _raw_spin_lock_irq() {2)   1.458 us    |                          preempt_count_add();2)   4.666 us    |                        }2)   1.459 us    |                        enqueue_hrtimer();2) ! 378.000 us  |                      }2)               |                      hrtimer_update_next_event() {2)               |                        __hrtimer_get_next_event() {2)   1.750 us    |                          __hrtimer_next_event_base();2)   4.667 us    |                        }2)               |                        __hrtimer_get_next_event() {2)   1.750 us    |                          __hrtimer_next_event_base();2)   4.375 us    |                        }2) + 13.709 us   |                      }2)               |                      _raw_spin_unlock_irqrestore() {2)   1.458 us    |                        preempt_count_sub();2)   4.667 us    |                      }2)               |                      tick_program_event() {2)               |                        clockevents_program_event() {2)               |                          ktime_get() {2)   1.459 us    |                            arch_counter_read();2)   4.667 us    |                          }2)   1.458 us    |                          arch_timer_set_next_event_phys();2) + 10.792 us   |                        }2) + 14.000 us   |                      }2) ! 431.083 us  |                    }2) ! 434.292 us  |                  }2)   1.750 us    |                  gic_eoimode1_eoi_irq();2) ! 441.000 us  |                }2)               |                irq_exit() {2)   1.750 us    |                  preempt_count_sub();2)   1.750 us    |                  idle_cpu();2)   8.458 us    |                }2) ! 475.125 us  |              }2) ! 478.625 us  |            }2)   <========== |2)   5.250 us    |            __module_get();2) ! 498.458 us  |          }2)   4.375 us    |          __mutex_init();2)               |          nfs_init_fs_context() {2)               |            kmem_cache_alloc_trace() {2)   5.542 us    |              should_failslab();2) + 16.625 us   |            }2)               |            nfs_alloc_fhandle() {2)               |              kmem_cache_alloc_trace() {2)   4.083 us    |                should_failslab();2) + 14.584 us   |              }2) + 22.750 us   |            }2) + 53.083 us   |          }2) ! 598.208 us  |        }2) ! 606.958 us  |      }2)               |      put_filesystem() {2)   4.375 us    |        module_put();2) + 13.125 us   |      }2)               |      vfs_parse_fs_string() {2)               |        kmemdup_nul() {2)               |          __kmalloc_track_caller() {2)   4.083 us    |            kmalloc_slab();2)   4.375 us    |            should_failslab();2) + 21.875 us   |          }2) + 30.625 us   |        }2)               |        vfs_parse_fs_param() {2)   6.125 us    |          lookup_constant();2)   5.250 us    |          lookup_constant();2)               |          nfs_fs_context_parse_param() {2)               |            __fs_parse() {2)   4.375 us    |              fs_param_is_string();2) + 19.833 us   |            }2) + 30.917 us   |          }2) + 62.417 us   |        }2)   5.250 us    |        kfree();2) ! 116.959 us  |      }2)               |      parse_monolithic_mount_data() {2)               |        nfs_fs_context_parse_monolithic() {2)               |          generic_parse_monolithic() {2)               |            vfs_parse_fs_string() {2)               |              vfs_parse_fs_param() {2)   4.375 us    |                lookup_constant();2)   4.375 us    |                lookup_constant();2)               |                nfs_fs_context_parse_param() {2) + 10.209 us   |                  __fs_parse();2) + 19.250 us   |                }2) + 48.125 us   |              }2)   4.667 us    |              kfree();2) + 66.500 us   |            }2) + 77.875 us   |          }2) + 87.209 us   |        }2) + 95.667 us   |      }2)               |      mount_capable() {2)               |        capable() {2)               |          ns_capable() {2)               |            ns_capable_common() {2)   5.541 us    |              cap_capable();2) + 14.000 us   |            }2) + 22.750 us   |          }2) + 31.209 us   |        }2) + 41.125 us   |      }2)               |      vfs_get_tree() { // error2)               |        nfs_get_tree() {2)   4.375 us    |          nfs_verify_server_address();2) + 14.000 us   |        }2) + 22.750 us   |      }2)               |      put_fs_context() {2)               |      }

结合 mount() 系统调用代码路径:

sys_mount()do_mount()path_mount()do_new_mount()static int do_new_mount(struct path *path, const char *fstype, int sb_flags,int mnt_flags, const char *name, void *data)
{...type = get_fs_type(fstype);...fc = fs_context_for_mount(type, sb_flags);put_filesystem(type);...if (!err && name)err = vfs_parse_fs_string(fc, "source", name, strlen(name));if (!err)err = parse_monolithic_mount_data(fc, data);...if (!err && !mount_capable(fc))err = -EPERM;if (!err)err = vfs_get_tree(fc);if (!err)err = do_new_mount_fc(fc, path, mnt_flags);put_fs_context(fc);return err;
}

mount() 系统调用代码路径了解到,函数 vfs_get_tree() 调用后,没出错的情况应该调用 do_new_mount_fc() ,但 ftrace 跟踪到的流程是在 vfs_get_tree() 后接着调用了 put_fs_context(),这表示 vfs_get_tree() 调用出错了。为什么?看一下 vfs_get_tree() 的实现:

int vfs_get_tree(struct fs_context *fc)
{...error = fc->ops->get_tree(fc); /* NFS: nfs_get_tree() */...
}
static int nfs_get_tree(struct fs_context *fc)
{struct nfs_fs_context *ctx = nfs_fc2context(fc);int err = nfs_fs_context_validate(fc);...
}static int nfs_fs_context_validate(struct fs_context *fc)
{struct nfs_fs_context *ctx = nfs_fc2context(fc);...struct sockaddr *sap = (struct sockaddr *)&ctx->nfs_server.address;...if (!nfs_verify_server_address(sap))goto out_no_address;...
out_no_address:return nfs_invalf(fc, "NFS: mount program didn't pass remote address");	// 返回 EINVAL 错误码...
}static int nfs_verify_server_address(struct sockaddr *addr)
{switch (addr->sa_family) {case AF_INET: {struct sockaddr_in *sa = (struct sockaddr_in *)addr;return sa->sin_addr.s_addr != htonl(INADDR_ANY);}case AF_INET6: {struct in6_addr *sa = &((struct sockaddr_in6 *)addr)->sin6_addr;return !ipv6_addr_any(sa);}}dfprintk(MOUNT, "NFS: Invalid IP address specified\n");return 0;
}

原因是 nfs_verify_server_address() 没有检查到合法的地址协议簇,导致出错,返回错误码 EINVAL 。那谁设置了 addr->sa_family ?在挂载期间,nfs_init_fs_context()addr->sa_family 的初始值为 0

sys_mount()do_mount()path_mount()do_new_mount()fs_context_for_mount()alloc_fs_context()init_fs_context = fc->fs_type->init_fs_context; /* NFS: nfs_init_fs_context() */nfs_init_fs_context()
static int nfs_init_fs_context(struct fs_context *fc)
{struct nfs_fs_context *ctx;/** 整个 nfs_fs_context 初始为 0,包括* nfs_fs_context::nfs_server::address::sa_family,* 即 nfs_verify_server_address() 调用中的 addr->sa_family 。*/ctx = kzalloc(sizeof(struct nfs_fs_context), GFP_KERNEL);...
}

mount 时想设置 addr->sa_family 参数,可以通过挂载选项 addr=<IP地址> 来完成:

static int nfs_fs_context_parse_param(struct fs_context *fc,struct fs_parameter *param)
{...opt = fs_parse(fc, nfs_fs_parameters, param, &result);...switch (opt) {...case Opt_addr:len = rpc_pton(fc->net_ns, param->string, param->size,&ctx->nfs_server.address,sizeof(ctx->nfs_server._address));if (len == 0)goto out_invalid_address;ctx->nfs_server.addrlen = len;break;...}...
}

按代码分析,按如下重新调整命令行选项:

# mount -t nfs -o addr=192.168.0.36,nolock 192.168.0.36:/home/XXX/nfs-share /test/nfs-remote

挂载成功。对比前面的挂载命令,这里增加了 addr=192.168.0.36 挂载选项,来显式的指定 NFS 服务端IPv4 地址。当然这个也可通过 addr= 选项指定 IPv6 风格地址。

最后,值得一提的是,可以通过内核配置项 CONFIG_SUNRPC_DEBUG,启用 NFS 的调试信息。需要通过操作 /proc/sys/sunrpc/nfs_debug 来指定输出的调试信息类型,如通过下面命令启用 NFS 挂载相关的调试信息:

echo 0x0400 > /proc/sys/sunrpc/nfs_debug

0x0400NFSDBG_MOUNT,这些值定义在 include/uapi/linux/nfs_fs.h 中:

/** NFS debug flags*/
#define NFSDBG_VFS		0x0001
#define NFSDBG_DIRCACHE		0x0002
#define NFSDBG_LOOKUPCACHE	0x0004
#define NFSDBG_PAGECACHE	0x0008
#define NFSDBG_PROC		0x0010
#define NFSDBG_XDR		0x0020
#define NFSDBG_FILE		0x0040
#define NFSDBG_ROOT		0x0080
#define NFSDBG_CALLBACK		0x0100
#define NFSDBG_CLIENT		0x0200
#define NFSDBG_MOUNT		0x0400
#define NFSDBG_FSCACHE		0x0800
#define NFSDBG_PNFS		0x1000
#define NFSDBG_PNFS_LD		0x2000
#define NFSDBG_STATE		0x4000
#define NFSDBG_ALL		0xFFFF

当然,自然也少不了 NFS 定义的 tracepoint 等一些其他调试接口,对这些细节感兴趣的读者可自行查阅相关资料和源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/467210.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

qt QHttpMultiPart详解

1. 概述 QHttpMultiPart是Qt框架中用于处理HTTP多部分请求的类。它类似于RFC 2046中描述的MIME multipart消息&#xff0c;允许在单个HTTP请求中包含多个数据部分&#xff0c;如文件、文本等。这种多部分请求在上传文件或发送带有附件的邮件等场景中非常有用。QHttpMultiPart类…

2-148 基于matlab的铣削动力学仿真

基于matlab的铣削动力学仿真&#xff0c;推导出指导加工的稳定性叶瓣图&#xff0c;并得到各主轴转速下对应的极限切深。输入不同方向刚度和切入角、切削力系数等参数&#xff0c;进行铣削动力学仿真。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-14…

使用STM32F407xx的GPIO引脚实现跑马灯效果的详细步骤

1、使用Keil创建一个新工程 2、在弹出的对话框&#xff0c;填写工程的名字&#xff0c;例如工程名字为demo_led 3、为保存的工程&#xff0c;选择对应的芯片 4、为当前工程&#xff0c;添加相应的库函数 5、若库函数添加成功&#xff0c;则显示当前工程目录树 6、在当前工程目录…

_浅谈单片机的gcc优化级别__以双音频信号发生器为例

一、简介 gcc有多种优化级别&#xff0c;一般不选择的情况下&#xff0c;IDE默认是按照-Og或这-O2优化的。 以gcc编译器为例&#xff0c;浅谈一下优化级别&#xff0c;我们常见的优化一般是指gcc的-O2、-Og。除此之外&#xff0c;gcc还有-Os等一系列优化&#xff0c;链接器也有…

用JavaScript、Nodejs写一个本地tcp服务,用于前端WebSocket调试

效果&#xff1a; 准备工作&#xff1a; 新建一个文件夹&#xff0c;在根目录安装依赖&#xff1a; npm install ws express 依赖介绍&#xff1a; WS是一个轻量级、高效的WebSocket库&#xff0c;适用于Node.js环境。 express 是一个流行的Node.js Web应用程序框架。 新…

企业常见的主数据管理挑战及解决方案

在当今高度数字化的商业环境中&#xff0c;数据已成为企业决策、运营和战略规划的核心。主数据管理&#xff08;MDM&#xff09;作为管理核心业务数据的一种方式&#xff0c;帮助企业确保其关键数据在整个组织中保持一致、准确和可信。然而&#xff0c;许多企业在实施主数据管理…

Python http打印(http打印body)flask demo(http调试demo、http demo、http printer)

文章目录 代码解释 代码 # flask_http_printer.pyfrom flask import Flask, request, jsonify import jsonapp Flask(__name__)app.route(/printinfo, methods[POST]) def print_info():# 分隔符separator "-" * 60# 获取请求头headers request.headers# 获取 JS…

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

用 Python 从零开始创建神经网络(二)

用 Python 从零开始创建神经网络&#xff08;二&#xff09; 引言1. Tensors, Arrays and Vectors&#xff1a;2. Dot Product and Vector Additiona. Dot Product &#xff08;点积&#xff09;b. Vector Addition &#xff08;向量加法&#xff09; 3. A Single Neuron with …

python爬虫自动库DrissionPage保存网页快照mhtml/pdf/全局截图/打印机另存pdf

目录 零一、保存网页快照的三种方法二、利用打印机保存pdf的方法 零 最近星球有人问如何使用页面打印功能&#xff0c;另存为pdf 一、保存网页快照的三种方法 解决方案已经放在星球内&#xff1a;https://articles.zsxq.com/id_55mr53xahr9a.html当然也可以看如下代码&…

现代Web开发:WebSocket 实时通信详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebSocket 实时通信详解 现代Web开发&#xff1a;WebS…

Hadoop完全分布式环境搭建步骤

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 大数据与数据分析_夏天又到了的博客-CSDN博客 本文介绍Hadoop完全分布式环境搭建方法&#xff0c;这个Hadoop环境用于安装配置Spark。假设读者已经安装好Visual Box 7.0.6虚拟环境与一个CentOS 7虚拟机&#xff08;如果…

133.鸿蒙基础01

鸿蒙基础 1.自定义构建函数1. 构建函数-[Builder ](/Builder )2. 构建函数-传参传递(单向)3. 构建函数-传递参数(双向)4. 构建函数-传递参数练习5. 构建函数-[BuilderParam ](/BuilderParam ) 传递UI 2.组件状态共享1. 状态共享-父子单向2. 状态共享-父子双向3. 状态共享-后代组…

如何保证kafka生产者数据可靠性

ack参数的设置&#xff1a; 0&#xff1a;生产者发送过来的数据&#xff0c;不需要等数据落盘应答 假如发送了Hello 和 World两个信息&#xff0c;Leader直接挂掉&#xff0c;数据就会丢失 生产者 ---> Kafka集群 一放进去就跑 数据可靠性分析&#xff1a;丢数 1&#…

业务模块部署

一、部署前端 1.1 window部署 下载业务模块前端包。 &#xff08;此包为耐威迪公司发布&#xff0c;请联系耐威迪客服或售后获得&#xff09; 包名为&#xff1a;业务-xxxx-business &#xff08;注&#xff1a;xxxx为发布版本号&#xff09; 此文件部署位置为&#xff1a;……

后台管理系统窗体程序:文章管理 > 文章列表

目录 文章列表的的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;文章表格 &#xff08;2&#xff09;删除按钮 &#xff08;3&#xff09;编辑按钮 &#xff08;4&#xff09;发表文章按钮 &#xff08;5&#xff09;所有分类下拉框 &a…

Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式

Windows10/11开启卓越性能模式 windows开启卓越性能电源模式 工作电脑开启卓越性能模式 电脑开启性能模式 1、所要用到的激活工具2、开启电脑卓越性能模式Windows11Windows10在电源模式中选择卓越性能模式 3、将系统版本切换为 工作站版本 1、所要用到的激活工具 KMS激活工具(…

D62【python 接口自动化学习】- python基础之数据库

day62 SQL 基础 学习日期&#xff1a;20241108 学习目标&#xff1a;MySQL数据库-- 131 SQL基础和DDL 学习笔记&#xff1a; SQL的概述 SQL语言的分类 SQL的语法特征 DDL - 库管理 DDL - 表管理 总结 SQL是结构化查询语言&#xff0c;用于操作数据库&#xff0c;通用于绝大…

计算机图形学 实验二 三维模型读取与控制

目录 一、实验内容 二、具体内容 (在实验2.3的基础上进行修改) 1、OFF格式三维模型文件的读取 2、三维模型的旋转动画 3、键盘鼠标的交互 4、模型的修改 三、代码 一、实验内容 读取实验提供的off格式三维模型&#xff0c;并对其赋色。利用鼠标和键盘的交互&#xff0…