跳到主内容

琅環笔记

有博学强记者,尝为鹅厂从事。游于洞宫,遇一人于途,问逍遥曰:“君读书几何?”遥曰:“吾之未读者,则二十年内书盖有之也,若二十年外,则吾固已尽读之矣。”其人论议超然,遥颇内服,相与欢甚。因共至一处,大石中忽然有门,引遥入数歩,则别是天地,宫室嵯峨。引入一室中,陈书满架,其人曰:“此PL史也。”又至一室,则曰:“OS志也。”毎室各有奇书,惟一室屋宇颇高,封识甚严,有二犬守之。遥问故,答曰:“此皆操作系统、编程语言、算法分析、生发正骨诸秘籍。”指二犬曰:“此龙也。”历观诸室书,皆Windows以前事,多所未闻者,如「BeOS」、「Solaris」、「FreeBSD」、「LISP」亦皆在焉。遥心乐之,欲赁住数十日,其人笑曰:“君痴矣。此岂可赁地耶?”即命小童送出,遥问地名,对曰:“琅嬛福地也。”

解决方案

问题描述

如果网页顶部元素使用 CSS fixed 固定在顶部,当点击链接的锚链时,网页会滚动到顶部,锚链元素则会被这个顶部固定元素遮挡。

解决方案一种

解决方式有多种,我认为侵入较少的方式是在元素之上插入一个用来校准位置的隐藏元素。

这里假设需要校准滚动的是脚注元素 .footnote

.footnote-target {
  position: relative;
  top: -5rem; /* negative value of the fixed html element height */
  height: 0;
  overflow: hidden;
}
$(function(){
  $('.footnote').before(function(i) {
    return '<a class="footnote-target" name="' + this.id + '"></a>';
  }).removeAttr('id');
});

不要去某云手动申请免费证书,再等待不知道多久,再下载配置证书了。

这个过程已经被 certbot 项目自动化了,ssl 作为互联网基础设施的一部分,这本该是被简单解决和处理的事。

certbot 项目由此而生。

Ubuntu 为例

sudo apt-get install certbot
sudo apt-get install python3-certbot-apache
sudo certbot --apache

如果使用的是 nginx 则:

sudo certbot --nginx

按提示输入即可,秒通,连Web服务器都不用手动重启。

问题现象

一台服务器上,有一个数据库怎么也删不掉,但可以显示。

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| xxx                |
+--------------------+
5 rows in set (0.002 sec)

MariaDB [(none)]> drop database xxx;
ERROR 1008 (HY000): Can't drop database 'xxx'; database doesn't exist

问题解决

  1. 用 ps aux 查看进程,发现 mariadbd 进程,发现未使用配置文件,则使用的默认路径配置;

  2. 查看默认配置文件

    cat /etc/mysql/mariadb.cnf
    cat /etc/mysql/mariadb.conf.d/50-server.cnf
  3. 发现默认配置文件中未指定数据路径,则进入默认数据路径,并查看文件权限,发现 xxx 的所有者是 root 用户

    cd /var/lib/mysql/
    ls -l
  4. 猜测是使用了不同的用户创建的数据库导致没有权限,执行 cat /etc/passwd 查看用户,发现 mysql 用户;

  5. 于是将 xxx 目录和下面文件的所有者修改为 mysql

    sudo chown mysql:mysql xxx/
    cd xxx/
    ls
    sudo chown mysql:mysql db.opt
  6. 执行 systemctl restart mysql 重启服务,进入 mysql 命令行客户端,再次执行 drop database xxx 即成功删除。

## 在类Unix系统上

类Unix:指 Linux macOS FreeBSD 等

环境配置文件:用来放置命令行的文件

比如在 bash,可以放在 ~/.profile,在 zsh,则是 .zshrc。

例如,以下命令用来添加GO环境变量

::bash

export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin

如果需要立刻生效,还需要执行 source 命令。

## 在 Windows 系统

可以在命令行运行::cmd

setx GOPATH $USERPROFILE%go setx path "%path%;%USERPROFILE%bin"

运行上述命令,然后关闭当前命令提示符窗口,重新打开一个新的,更改才会生效。

两种登录模式

  1. 多用户登录模式,可读写全部文件。

  2. 单用户登录模式,只可操作根目录下的文件,只能读操作。常用来检查和修复文件系统。

问题现象

当开机后,系统提示 "Cound not chdir to home directory /home/your_username No such file or directory"

此时,尝试执行 ls /home 会发现一无所获,表现为你的用户目录丢失了,非常惊悚。

产生原因

  1. 黑客获得了你的系统权限,强制删除了你的用户目录。这一般是瞎扯的。

  2. 用户创建目录和 zfs 挂载的先后顺序问题。

    详细来说,zfs 是一种高级文件系统,比如可以按需增加容量。

    通常我们会将用户目录放到 zfs 的池中管理,挂载点的对应关系在 zfs 的 dataset 中保存。

    此时,如果用户在 zfs 挂载 /usr/home 以前 (/home 是 /usr/home 的硬连接),在目录 /home 下创建了目录,再挂载 zfs 的目录时,会覆盖 /home 目录。

    这里怎么理解?就好比目录和文件是对象,挂载点可以是层叠结构,后挂载的目录会指向同样的挂载点,而系统在挂载后,只会显示最后的挂载。

    此时,先前的目录和文件并没有丢失,只是被遮蔽了。

怎么处理

进入单用户登录模式登录,尝试执行 ls /home ,一般会看到「丢失的」目录。

确认这一点后,可以重新进入多用户模式,先用 unmount 命令强制停止挂载 /home 目录

zfs unmount zroot/usr/home

问题发现和解决过程

我在 https://forums.freebsd.org/threads/lost-home-directory.89382/ 看到,问题可能与 ZFS 有关,在没有思路时,我请教了 OpenAI 的 ChatGPT 3.5,效果好的可怕。

我的提示语如下:『你是协助我工作的精通FreeBSD系统的专家,此时我遇到一个问题向你请教。我的用户名是 xyz,当我从 multiple user mode 登录系统时,/home 和 /usr/home 下找不到 xyz 目录,但当我从 Single user mode 登录系统时,/home 和 /usr/home 下存在 xyz 目录,既存在 /home/xyz 和 /usr/home/xyz,请问现在如何做才可实现,当重启进入 multiple user mode 时依然看到 xyz 目录。我不清楚导致这个现象的原因是什么,可能是因为VPC异常关机,而我的 FreeBSD 是安装在 vpc 上的。』

结果 ChatGPT 给与了初步判断,并给了我处理步骤和命令提示,我继续执行它给的命令,并将结果告诉它,它便接着提示,大约通过十多轮对话,它帮我找到了 zfs 和 mount 的原因,也让我理解了为什么会出现这样的问题。

ChatGPT 真的可以,这里它做到了。

  1. 帮助我弥补专业知识不足;

  2. 教这些专业知识,让我理解;

  3. 就问题给出解答步骤,并可以交互式推进;

所以,我说它真的不错,至少在缺少领域知识的场景下,提高了问题解决的可能性,并缩短了问题解决的时间。

但,这里应看到的时,我们有一个共识:基于 FreeBSD 的存在和表现,它并不会出现无端丢失目录和文件的问题,如果你怀疑,就是在怀疑世界上聪明人的数量,及它们为热爱事物所付出的努力。

如果遇到 FreeBSD 的类似问题,你有此怀疑,这说明,你的思维方式不在正途,你不对劲。

前提

须具有本地权限,通俗的说就是,需要肉身在服务器旁边。

步骤

  1. 启动服务器时按住 Shift 键,会进入 GNU GRUB version x.yz... 界面

  2. 在 GNU GRUB version x.yz... 界面下方至少会出现以下选项:

    • Ubuntu

    • *Advanced options for Ubuntu

    选择 Advanced options for Ubuntu,按回车键;

  3. 出现新的选项:

    • Ubuntu, with Linux ...

    • *Ubuntu, with Linux ... (recovery mode)

    选择带有 (recovery mode) 的一行,按回车键;

  4. 系统会显示一些输出并跳转到 Recovery Menu 菜单界面,选项如下:

    • resume

    • clean

    • dpkg

    • failsafeX

    • fsck

    • grub

    • network

    • root

    • system-summary

    选择 root,按回车键

  5. 重新 mount 具有写权限的 root,运行命令::

    mount -rw -o remount /
  6. 使用 ls /home 命令可以查看用户名,假设是 USER1,则使用如下命令重置密码:

    passwd USER1
  7. 根据命令提示,你可以完成密码修改,然后退出到 Recovery Menu,选择 resume 重启,然后就可以使用上一步修改的新密码进入系统了。