标签: ubuntu

  • 增加 Swap 解决 Sentry 频繁死机的问题

    增加 Swap 解决 Sentry 频繁死机的问题

    我厂 Code.fun 近期进步不小,产品力顺应民意,需求导向,收获了不错的效果。欢迎有大量页面需求的朋友联系试用。

    但是随之而来产生一个问题:Sentry 不定时死机。通过腾讯云的日志分析,死机前多半会有大量的 IO 读操作,除此之外也没找到别的信息。Sentry 跑在 docker compose 里,很多组件我都不熟悉,docker 里面调试的技能我也不会,除了 docker compose logs 看日志以外,我也没有更好的办法。所以问题一直没有定位到。

    于是,最近几周就变成要查问题 -> sentry 挂了 -> 重启 -> 又要查问题 -> sentry 又挂了 -> 又重启……这样的状态。中间我试着降低 Kafka 的定时清理频率,也没有收到效果。

    后来有一天我挂着 ServerCat 看服务器状态,突然发现 Sentry 的内存好高,在 95%~98% 之间摇摆。我想起来默认的 ubuntu 好像没有配置虚拟内存,那么如果内存满了,会不会就死了呢?虽然想不到和磁盘 IO 有什么关系,不过我决定试一试。

    还好我之前搞 Sentry 磁盘优化比较成功,现在 80G 的硬盘占用基本稳定在 40G~50G 之间,有 30G 左右的富余,可以用作 swap。

    首先,使用 sudo swapon --show 查看已经挂在的 swap,果然为空。

    接着,创建一个 5G 的 swap 文件(我记得我用的不是这个命令,但是现在只能搜到这个,我周末再试一下):

    sudo fallocate -l 5G /swapfile

    改变它的权限为 600,仅供系统使用:

    sudo chmod 600 /swapfile

    将其配置为 swap:

    sudo mkswap /swapfile

    启动为 swap

    sudo swapon /swapfile

    再次使用 sudo swapon --show 即可查看使用情况:

    NAME       TYPE SIZE USED PRIO
    /swapfile1 file   5G 2.1G   -2

    配置 swap 之后几次查看,内存用量逐步降低到 80% 附近,swap 可以用满。但是死机的情况彻底消失,基本可以断定是内存的问题。之前买服务器的时候,可着最低系统要求,4C8G,看来生产环境用起来的确不太够。群里有同学还说可以偷偷改最低要求的配置,在更小的服务器上安装,那就真的只能是自己开发试着玩了。

    准备周日上午趁着人最少的时候再把 swap 调大到 8G,应该足够未来一段时间的使用。不知道将来人更多的时候会不会更挤,看来有必要把大家的取样率都下降到 2%。说不定将来都用 Sentry SaaS 会更经济呢,欢迎有经验的同学来分享。

    希望上面的内容对大家有帮助。如果你遇到其它使用 Sentry 的问题,不妨发出来,我们一起讨论,共同学习。

  • Ubuntu 22.04 部署 Sentry 笔记

    Ubuntu 22.04 部署 Sentry 笔记

    Sentry 可能是目前最流行的缺陷管理软件,它可以帮我收集线上产品的问题,帮我们发现各种缺陷。除了 SaaS 服务以外,它还提供独立部署版本,相信大多数用户跟我一样,都觉得独立部署比较安全,这里就分享下前阵子帮我厂搭建 Sentry 的经验。

    0. 准备

    Sentry 号称需要 4核 8G 以及 20G 硬盘,但 20G 其实完全不够,我厂产品接入一半,一周就产生 20+G 的数据量。建议至少准备 100G。

    1. 安装 Docker + Compose 插件

    Sentry 私有部署版使用 docker compose 作为部署方案,所以我们要先安装 Docker 和 Compose 插件。建议先阅读上面的文档,然后可以配合下面的步骤操作。

    卸载旧版本

    sudo apt-get remove docker docker-engine docker.io containerd runc

    配置 Docker 预编译包仓库

    推荐用这种方式来安装,方便日后升级。

    $ sudo apt-get update
    
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
    $ sudo mkdir -p /etc/apt/keyrings
    
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    安装 Docker 和 Compose 插件

     $ sudo apt-get update
     $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    测试 Docker

    此时,正常来说,Docker 和 Compose 插件均安装完毕,我们可以跑个 hello-world 测试一下:

    $ sudo service docker start # 启动 docker engine 服务
    $ sudo docker run hello-world

    安装 Sentry

    下载

    https://github.com/getsentry/self-hosted/releases/latest

    下载完成后,解压到安装目录。以后所有操作都在这个目录完成,建议修改下目录名,并且放在公共目录里,方便大家管理。

    我用的目录名是 ~/sentry

    安装

    执行 sudo ./install.sh。如果你的当前用户不是 root,那么 sudo 就非常重要,否则可能会报告各种奇奇怪怪的错误。

    注意:以后的 sudo 也都是必须的。

    安装过程会比较久,要拉很多个镜像并生成容器。这个过程建议保持网络畅通,或者使用 screentmux 等工具保活,否则不小心断联就可能会前功尽弃。

    启动

    安装完成之后,执行 sudo docker compose up -d 启动服务即可。

    配置 Nginx 反向代理 9000 端口

    这段不详细解释了,有人提问的话再补充。总之:

    1. Nginx 反向代理 9000 端口
    2. 使用 Certbot 启动 https
    3. 或者申请个免费证书然后启动 https

    配置邮箱

    修改 ~/sentry/sentry/config.yml,完成邮箱配置。我们用的是腾讯企业邮箱,配置不复杂,就按照 SMTP 教程即可。需要注意的是,mail.from 要跟用户名一致,否则会发不出去。

    修改配置之后,都要重启整个 compose 集群才能生效。

    配置项目

    进入 Sentry,完成首次登录配置。

    然后创建项目,选好项目类型,就能看到配置教程,非常方便。


    总结

    Sentry 开源搞得很好,文档健全,基本能解决大部分问题。

    可惜版本比较多,互联网上有很多内容已经过期,大家阅读时要稍加分辨。

    有其它部署和使用的问题,可以留言交流。

  • Windows 10 配置 WSL2 以及图形界面

    Windows 10 配置 WSL2 以及图形界面

    前阵子把台式机的 WSL 升级到了 WSL2,顺便配置好图形界面,写篇博客记录一下。

    0. 卸载 WSL,开启 CPU 虚拟化功能

    如果之前安装过 WSL,需要先备份重要数据,然后卸载,再安装 WSL2。

    重启,在 BIOS 设置里开启 CPU 虚拟化支持。

    1. 简单安装:利用 Windows Insider

    加入 Windows Insider 计划,升级到预览版本(>=20262),直接安装。好处是方便,而且可以安装最新版本,可以访问 Linux 分区。

    坏处是不太稳定,预览版嘛。我觉得不太放心,决定还是在稳定版上安装。

    2. 手动在 Windows 10 标准版上安装

    2.1 检查 Windows 10 版本

    需 >= 1903(18362)。我每周更新,没有问题。

    2.2 启动虚拟化支持

    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

    2.3 下载 WSL2 升级包并安装

    WSL2 Linux kernel update package for x64 machines

    2.4 配置 WSL 默认版本为 2

    # 设置 WSL 默认版本
    wsl --set-default-version 2
    
    # 列出所有 WSL 版本
    wsl --list --verbose
    
    # 将特定发行版设置为指定版本
    wsl --set-version <distribution name> <versionNumber>  

    2.5 在 Microsoft 商店里安装 Linux 发行版

    我安装的是 Ubuntu 20.04。安装后需要进行一些配置工作,此处不再赘述。

    至此,WSL2 配置完成,接下来配置图形界面。

    3. 配置 WSL2 的图形界面

    3.0 更新系统

    按照惯例先把能更新的系统组件更新到最新:

    sudo apt update
    sudo apt upgrade

    3.1 安装 GUI 组件

    sudo apt install -y tasksel
    sudo tasksel install xubuntu-desktop
    sudo apt install gtk2-engines

    WSL2 目前并不支持图形界面,所以这里计划让 Ubuntu 使用 Windows X-server 来绕过。安装的过程会比较久,因为要下载很多东西,请耐心等待。

    3.2 配置显示器信息

    接下来要配置显示器信息,方便 Linux 使用:

    export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
    export LIBGL_ALWAYS_INDIRECT=1
    sudo /etc/init.d/dbus start &> /dev/null

    把上面这段配置加入 ~/.bashrc,当我们登入 WSL 时,就会自动完成配置。不过这样一来,每次登入都要敲密码,也有点麻烦,所以可以自己取舍一下。或者把上面的配置单独存放一个脚本文件,需要使用 GUI 的时候再运行启动。

    3.3 在 Windows 10 安装 X-server

    参考文档中推荐了两个软件:VcXsrv(免费)和 x410(收费)。我本来想花钱点,可是后者不支持国区购买,所以只好选用 VcXsrv。

    下载,安装,启动 VcXsrv。接下来 VcXsrv 会要求我们配置使用方式,依次选择“Multiple Windows”、“Start no client”,并且勾选“Disable access control”,然后保存配置文件到本地,完成启动。以后可以通过双击配置文件启动 VcXsrv。

    此时,在系统托盘里可以看到 VcXsrv 服务。

    3.4 启动 GUI 程序

    接下来正常启动 GUI 程序即可,比如 Firefox:

    sudo apt install firefox
    
    # 安装完成后,启动 firefox
    # 注意,这里必须用 sudo
    sudo firefox 

    总结&参考文档

    至此,安装配置完成。安装配置中我参考了以下文章:

    遗留问题

    涉及到硬盘操作的功能会非常慢,比如打开目录,到目录内容完全呈现出来,需要数分钟之久。我记得当年初用 WSL 的时候也遇到过这个问题,后来通过关闭安全扫描解决了,不知道这次是不是同样的问题。(这次没找到关闭安全扫描的位置……)

  • Ubuntu 配置 Nginx + Ghost

    Ubuntu 配置 Nginx + Ghost

    按照惯例,买好机器,登录进去。建议是境外服务器,可以省掉备案环节。但是不要干坏事哦。

    1. 更新系统

    apt-get update
    apt-get upgrade

    2. 创建 ssh-key

    ssh-keygen -t rsa -b 4096 -C "my-email@meathill.com"

    3. 添加 authorized_keys

    使用 ssh key 登录可以大大提升服务器的安全性。

    首先,将你的电脑上的公 key 添加到服务器 ~/.ssh/authorized_keys。接着编辑服务器上的 /etc/ssh/sshd_config,禁用密码登录。

    ChallengeResponseAuthentication no
    PasswordAuthentication no

    最后重启 ssh 服务:service ssh restart

    4. 安装 Node.js

    按照 NodeSource Node.js Binary Distributions 的指引,安装对应版本的 Node.js—— Ghost 要求 LTS,所以目前只能用 v12。

    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
    sudo apt-get install -y nodejs

    5. 安装 MySQL/MariaDB

    Ghost 默认使用 SQLite 作为数据库,不过生产环境中 SQLite 性能不够,因此建议直接安装并使用成熟可靠的数据库软件。这里建议使用 MariaDB,开源免费。不同版本的 MariaDB 源可以在 MariaDB Repositories 找到,我一般使用清华的源:

    sudo apt-get install software-properties-common
    sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
    sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://mirrors.ustc.edu.cn/mariadb/repo/10.5/ubuntu focal main'
    
    # 添加完仓库和 key 之后,就可以安装了
    sudo apt update
    sudo apt install mariadb-server

    MariaDB 的安装过程没有配置密码的环节,可以使用 重置 MariaDB root 密码 一文中介绍的方法先重置 root 密码,然后创建需要的用户和数据库。

    create user 'ghost'@'localhost' identified by 'ghost';
    create database `ghost`;
    grant all on `ghost`.* to 'ghost'@'localhost';

    6. 安装 ghost-cli

    ghost-cli 是 ghost 提供的命令行管理工具,可以大大减少我们管理 Ghost 实例的时间。

    # 安装
    npm i ghost-cli -g
    
    # 创建一个目录安装 ghost
    cd /var/www
    mkdir ghost
    cd ghost

    Ghost 要求我们不能用 root 用户维护实例,所以这时可能需要创建一个新用户,并赋予其 sudo 权限(方便操作目录权限之类的),我习惯命名为 ghost-admin:

    adduser ghost-admin
    usermod -aG sudo ghost-admin

    接着,切换到 ghost-admin,安装 ghost

    su ghost-admin
    cd /var/www
    # 改变权限
    sudo chown -R ghost-admin:ghost-admin ghost
    cd /var/www/ghost
    ghost install

    安装完成之后,执行 ghost ls,可以看到正在运行的 Ghost 实例,就是一切正常了:

    + sudo systemctl is-active ghost_fav-meathill-com
    ┌──────────────────┬────────────────┬─────────┬──────────────────────┬─────────────────────────┬──────┬─────────────────┐
    │ Name             │ Location       │ Version │ Status               │ URL                     │ Port │ Process Manager │
    ├──────────────────┼────────────────┼─────────┼──────────────────────┼─────────────────────────┼──────┼─────────────────┤
    │ my-ghost │ /var/www/ghost │ 3.31.5  │ running (production) │ http://my-ghost.com │ 2368 │ systemd         │
    └──────────────────┴────────────────┴─────────┴──────────────────────┴─────────────────────────┴──────┴─────────────────┘

    接下来,编辑 config.production.json,把数据库配置和域名配置都写进去,就基本可用了。

    7. 安装并配置 Nginx

    首先,配置源。目前 Ubuntu 20.04,代号 focal,命令如下:

    deb https://nginx.org/packages/ubuntu/ focal nginx
    deb-src https://nginx.org/packages/ubuntu/ focal nginx
    sudo apt update
    sudo apt install nginx

    增加配置文件,并进行反向代理,即把外来的访问反向代理给 Ghost 服务:

    
    cp /etc/nginx/site-available/default /etc/nginx/site-available/ghost.conf
    ln -s /etc/nginx/site-available/ghost.conf /etc/nginx/site-enabled/ghost.conf

    配置文件大体如下:

    server {
        listen 80;
        listen [::]:80;
    
        server_name my-ghost.com;
        root /var/www/ghost/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)
    
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:2368;
    
        }
    
        location ~ /.well-known {
            allow all;
        }
    
        client_max_body_size 50m;
    }

    最后重启 nginx 服务或者重新加载配置即可:

    # 一般建议先检查一下配置有没有问题
    nginx -t
    service nginx restart

    总结

    这次主要更新了使用 ghost-cli 安装和配置的内容,服务器也改用 MariaDB,新的技术使得安装配置都更简单了。

  • 解决 WSL Ubuntu 20.04 下使用 apt 源安装 node.js 的问题

    解决 WSL Ubuntu 20.04 下使用 apt 源安装 node.js 的问题

    随着 Ubuntu 20.04 发布,各大平台都适配发布了对应版本的系统,Windows WSL 也不例外。如果你是新系统,直接在 Microsoft Store 里搜索并安装 Ubuntu 即可;如果你是老系统,已经装过以前的版本,那么需要先卸载再安装,如果直接安装 Ubuntu 20.04 会有多个不同版本的 Ubuntu 共存。

    装完系统后,接着安装其它软件。我现在比较喜欢用包管理工具安装软件,因为容易更新,而我又是更新爱好者。所以按图索骥,找到 node.js 的二进制包安装指引,复制执行:curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - ,结果报错:gpg: can't connect to the agent: IPC connect call failed

    经过搜索,得知这是 WSL 版 Ubuntu 20.04 的问题,与 WSL1 有一些不兼容,在 WSL2 上就没这个问题了。解决方案是装一些工具:

    sudo add-apt-repository ppa:rafaeldtinoco/lp1871129
    sudo apt update
    sudo apt install libc6=2.31-0ubuntu8+lp1871129~1 libc6-dev=2.31-0ubuntu8+lp1871129~1 libc-dev-bin=2.31-0ubuntu8+lp1871129~1 -y --allow-downgrades
    sudo apt-mark hold libc6

    然后问题就解决了。

    这个 issue 里还记录了一些别的方案,包括上面方案的修正版,不过我用起来没问题,也就没继续往下看。感兴趣的同学可以研究一下。

  • 解决 Ubuntu 20.04 下无法打开蓝牙的问题

    解决 Ubuntu 20.04 下无法打开蓝牙的问题

    我的 Ubuntu 20.04 启动之后经常丢掉蓝牙。表现是设置里能看到蓝牙,状态是关闭,但是无法打开,每次点击开关过一会儿就恢复了,也没有报错。

    因为要连接音箱,没有蓝牙很不方便,就搜索了一下,最后发现下面的解决方案。虽然没理解问题根源,但是解决了就好。

    sudo rmmod btusb
    sleep 1
    sudo modprobe btusb

    参考链接:

    1. Bluetooth firmware upload failing after ‘suspend’
    2. Bluetooth used to be enabled, now disabled and won’t enable. Ubuntu 16.04
  • 重置 MariaDB root 密码

    重置 MariaDB root 密码

    以我最常用的 Ubuntu 为例,记录如何重置 MariaDB root 密码。MariaDB 是 MySQL 原作者在 MySQL 闭源之后的再起之作,基本能完全兼容 MySQL。在我的 Ubuntu 上,它的大部分命名都沿用 MySQL。

    1. 停掉 mysql 服务

    $ service mysql stop

    2. 以特殊方式启动 mysql

    使用 --skip-grant-tables 可以跳过用户权限检查,让你没有密码也能连接。此时为了避免安全问题,可以加上 --skip-networking,防止有人此时通过网络连接你的数据库。在本地环境下差别不大。

    $ sudo mysqld_safe --skip-grant-tables --skip-networking &

    这一步可能会启动失败,导致下一步连接时报错:ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ’/var/run/mysqld/mysqld.sock’ (2),此时,可以这样修正:

    $ sudo mkdir /var/run/mysqld
    $ sudo chown mysql /var/run/mysqld

    3. 连接数据库

    $ mysql -u root

    正常情况下就连上了。

    4. 重置密码

    mysql> FLUSH PRIVILEGES;
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

    5. 重启 mysql

    按照参考文档里介绍的做法,需要

    $ sudo kill `cat /var/run/mysqld/mysqld.pid`
    # 或
    $ sudo kill `/var/run/mariadb/mariadb.pid`

    不过我实际操作的时候只要把(2)开启的进程关掉就好了。然后重启 mysql 服务:

    $ service mysql restart

    6. 完成

    尝试一下连接,应该可以成功了:

    $ mysql -uroot -p

    7. Ghost 连接

    虽然命令行连接成功,但是 ghost start 仍然报错,经查,是 Ghost 的数据库连接方式有点问题,修改 config.production.json,加入一行配置即可,大体如下:

    {
      "client": "mysql",
      "connection": {
        ....
        "socketPath": "/var/run/mysqld/mysqld.sock",
      }
    }
    (更多…)
  • Ubuntu 20.04 科学上网

    Ubuntu 20.04 科学上网

    闲言少叙,直奔主题。

    0. 服务器

    首先,你得先准备个服务器。本文不讨论如何制备科学上网服务器。

    如果你用 Mac 或者 iPhone,想玩 Clubhouse,可以考虑买个现成,比如链接里这个(其实只要你有 AnyConnect,任何系统都可以用)。

    1. 客户端

    接下来,下载客户端。

    我用的是 shadowsocks-qt5,先在 https://github.com/shadowsocks/shadowsocks-qt5/releases 这个页面下载打包好的 AppImage 文件。

    右键点击文件,在“权限”选项卡里勾选“允许文件作为程序执行”,然后双击运行,配置服务器信息。配置完成,点击“连接”,顺利的话,就会显示连接成功。

    在命令行里输入 gnome-session-properties,会启动如下图所示的“启动应用程序首选项”,把刚才下载的 AppImage 路径添加进来,这样每次启动 ss 客户端都会自动启动了。

    启动应用程序首选项

    2. 生成 pac

    安装genpac

    pip install genpac

    Ubuntu 20.04 默认 python版本是 3,所以可以使用 pip3 替代上面的 pip。

    使用在线的 gfwlist

    genpac --pac-proxy "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" --gfwlist-url=https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt --output="autoproxy.pac"

    使用离线的 gfwlist

    如果你的机器没有完成配置,暂时无法访问到 gfwlist,也可以先想办法下载到这个文件,然后离线生成。

    genpac --pac-proxy "SOCKS5 127.0.0.1:1080" --gfwlist-proxy="SOCKS5 127.0.0.1:1080" --gfwlist-local=你的路径/gfwlist.txt --output="autoproxy.pac"

    3. 配置服务器

    Ubuntu 安装时就集成了 Apache2,并且默认也会启动它,所以直接把刚才生成的 pac 文件放在 /var/www/html/ 目录下,就能通过 http://localhost/autoproxy.pac 访问到。

    不过我不喜欢用 apache,一般都会用 nginx 或者 openresty 取代之。好在默认情况下,nginx 的 web 服务目录也是 /var/www/html,所以只要卸载 apache 然后重新安装 nginx 即可。另外因为这个服务只为使用 pac 文件,所以可以不用换源。

    sudo apt remove apache2
    sudo apt update
    # 安装 openresty 需要的系统依赖
    sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates
    # 添加 key
    wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
    # 添加 openresty 官方源
    echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" 
        | sudo tee /etc/apt/sources.list.d/openresty.list
    # 在更新一次,然后安装
    sudo apt update
    sudo apt install openresty
    sudo service openresty start

    然后访问 http://localhost/autoproxy.pac,如果能打开,就说明配置成功。

    4. 启动全局配置

    如果,打开“设置”,找到“网络”,打开“网络代理”,选择“自动”,然后填入上面说的 pac 地址即可。

    5. 在其它应用里完成配置

    比如,打开 Firefox,在“首选项”里找到“网络设置”,然后选择“使用系统代理设置”即可。

    (更多…)
  • Ubuntu 20.04 配置 TP-WDN5200H 无线网卡

    Ubuntu 20.04 配置 TP-WDN5200H 无线网卡

    前情提要:朋友赞助了 AMD 2950x + 技嘉 x399 MEG Creation,我配上其它组件,装了台新电脑。接下来把老电脑收拾一下,装上 Ubuntu 20.04,打算补齐 x86 64 Linux 平台。

    结果卡在无线网卡配置上,Ubuntu 无法识别和使用。我的无线网卡是 TP-Link 的 WDN5200H 免驱 USB 网卡,我直接用型号搜索,很容易就找到介绍安装教程

    原来这个网卡同时集成了一块小 U 盘,里面是驱动程序,方便没有网络的人安装。但是在 Ubuntu 下,会优先把它识别成 U 盘(但是我也没找到盘符),所以无线网络不工作。解决方案就是先安装驱动,然后用 usb_modeswitch 切换工作模式,然后系统就会把它识别成无线网卡,然后就可以了。

    但在我这里,这套操作行不通,切换设备的时候,上面都一样,但最后会报错:

    Use interface number 0
     with class 255
    Error: can't use storage command in MessageContent with interface 0; interface class is 255, expected 8. Abort.

    我用上面的错误信息作为关键词搜索,只能找到各种关于 huawei modem 的讨论,解决不了问题。折腾很久,我突然注意到,我的网卡 ID 似乎和教程里不太一样,我的是 obda:c811,而教程里是 obda:1a2b(分号前是设备id,分号后是产品id),是不是这个原因呢?我以 0bda:c811 作为关键词,很快找到这个答案

    原来核心原因在于原先的驱动是基于 4.x 内核的,从 19.04 开始,Ubuntu 内核已经升级到 5.x,所以要用新驱动。所以我按照帖子里的指示,安装了新驱动。一番折腾之后,还是不行……

    眼看周末过去,没时间继续折腾了,我只有到京东下单了一款 m2 接口的 Intel AX200 无线网卡(含蓝牙)——据说 Intel 网卡都是免驱的,而且 m2 接口肯定没有集成 U 盘这种幺蛾子。

    周一,拿到新网卡,插上。果然,Intel 网卡就是免驱,工作正常;但是,我没买天线,而这个鬼网卡没有天线是绝对不能工作的(客服告诉我可以试试,不行再买天线,我……),于是我只好再下单了一套天线。然后我无意打开 Wi-Fi 一看,WTF,这是啥,Rtl8821CU?不就是我的 TP-WDN5200H 么?原来我昨天其实就弄好了,只是没有重启,没有生效……

    至此,问题解决。

    (更多…)
  • 解决 PHP 7.2.8 + MySQL 8.0.12 连接失败的问题

    解决 PHP 7.2.8 + MySQL 8.0.12 连接失败的问题

    这两天又反复遇到这个问题,先写解决方案:

    1. 使用 caching_sha2_password  插件

    修改用户密码,并且用插件生成,可以解决 WordPress 的问题。

    ALTER USER 'user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

    2. 修改 my.cnf,使用原生密码

    使用 Laravel + MySQL 8.0 的时候,遇到

    SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

    修改 /etc/mysql/my.cnf (我是 Ubuntu 16.04),添加下面一行:

    [mysqld]
    default_authentication_plugin= mysql_native_password

    然后重置密码:

    ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    (更多…)