跳转到内容

Linux环境配置

node与npm

关于node与npm的配置,以linuxmint为示例

bash
sudo apt update
sudo apt install -y nodejs
sudo apt install -y npm

之前nodejs安装完成后npm就自带了,现在比较新的发行版貌似是要单独安装npm才行。

查看是否正确安装:

bash
node -v
npm -v

临时指定registry,安装cnpm与pnpm:

bash
sudo npm i -g cnpm --registry=https://registry.npmmirror.com/
sudo npm i -g pnpm --registry=https://registry.npmmirror.com/

nrm 是一个 npm 源管理器,允许你快速地在 npm 源间切换:

bash
sudo npm i nrm -g --registry=https://registry.npmmirror.com/

n是node版本管理工具:

bash
sudo npm i n -g --registry=https://registry.npmmirror.com/

更新n:

bash
n stable

更新node:

bash
n latest

终端中执行命令报SSL错误

有时在终端中执行curl某个url的命令,或者类似的请求命令,会出现报错:

The SSL connection could not be established, see inner exception.

或者类似的报错,解决方式参考:

bash
export GITHUB_ACTIONS_RUNNER_TLS_NO_VERIFY=1

home目录中英文切换

打开终端,在终端下输入命令:

bash
sudo apt-get install xdg-user-dirs-gtk
export LANG=en_US
xdg-user-dirs-gtk-update
export LANG=zh_CN.UTF-8

更改export LANG实现切换,可能需要注销重启生效。

安装java openjdk

java环境jdk的安装,以linuxmint和centos为示例。

linuxmint

安装最新稳定的openjdk:

bash
sudo apt update
sudo apt install default-jdk -y

验证:

bash
java --version

或者指定openjdk版本:

bash
sudo apt install openjdk-11-jdk
sudo apt install openjdk-17-jdk

centos

指定版本安装java-11-openjdk:

bash
sudo yum install -y java-11-openjdk-devel

参考:

linuxmint删除缓存

apt缓存路径

查看大小:

bash
sudo du -sh /var/cache/apt/archives`

删除:

bash
sudo apt clean

重新查看就变小了。

删除不再依赖的组件

bash
sudo apt  autoremove --purge

清理工具如bleachbit

bash
sudo apt install bleachbit

谨慎使用,这款软件包含有很多的缓存,如果不是特别熟悉,别乱使用。

linuxmint禁止升级内核

apt-mark hold锁定内核

bash
sudo apt-mark hold linux-image-generic linux-headers-generic linux-firmware linux-generic
sudo apt update
sudo apt upgrade

apt-mark unhold解除锁定

bash
sudo apt-mark unhold linux-image-generic linux-headers-generic linux-firmware linux-generic
sudo apt update

总结

在linuxmint下,总共需要禁用四项,这样upgrade的时候就不会升级系统内核。

CentOS系统变化

centos与centos stream关联

fedora -> 红帽收费(企业版) -> centos

改版后变成:

fedora -> centos stream -> 红帽收费(企业版)

参考:

Linux禁用谷歌登录密钥环

删除以下两个文件的可执行权限,重启桌面:

bash
sudo chmod -x /usr/bin/gnome-keyring
sudo chmod -x /usr/bin/gnome-keyring-daemon

参考:

Linux与Windows产生EOF

Linux

输入后先按回车,然后ctrl +d;也可以不回车,直接两次ctrl + d。

Windows

输入后先回车,然后ctrl + z; 不回车,直接两次ctrl + z 无法起到跟linux下的作用,所以统一记住前者。先回车再ctl+d/z 也可以保证输出的换行

linuxmint安装clang

linuxmint下安装,直接使用apt:

bash
sudo apt update && sudo apt upgrade
sudo apt install clang

验证是否成功,查看版本:

bash
clang --version

使用:

bash
clang hello.c -o hello

参考:https://zhuanlan.zhihu.com/p/647388977

centos yum epel-release

bash
sudo yum -y install epel-release
sudo yum clean all
sudo yum makecache

EPEL 代表 Extra Packages for Enterprise Linux,由 Fedora Special Interest Group 创建和维护。该存储库因为 Enterprise Linux 提供一组高质量的附加软件包而闻名。EPEL 的特点是它基于 Fedora 对应版本,因此它永远不会与企业 Linux 发行版中的任何软件包发生冲突或替换。它如此受欢迎的主要原因是它捆绑的一系列功能。

  • EPEL 使您能够免费获得大量的包裹。
  • 它由 Fedora 小组管理,100% 开源且安全。
  • 永远不会冲突或替换现有的软件包,因为它的核心使用 Fedora 对应的软件包。
  • 您可以放心只获得高质量的企业级软件包。

sudo免输入账号密码

sudo 执行命令的时候配置免输入密码,此方式并不推荐,只适合懒人和并不知道某用户密码的场景。

通过编辑修改/etc/sudoers实现,需要root权限

配置某用户sudo(全局,不安全,慎用)不用输入密码:

username    ALL=(ALL)       NOPASSWD: ALL

配置某用户特定权限组(特定类型的命令)不用输入密码:

username    ALL=(ALL)       NOPASSWD: NETWORKING, SOFTWARE, SERVICES, TOOLS, PROCESSES

配置某用户特定命令不用输入密码:

username    ALL=(ALL)	NOPASSWD: /usr/sbin/nginx

Terminal常用快捷键

移动光标到行首

Ctrl-a

移动光标到行尾

Ctrl-e

清屏

Ctrl-l == clear命令

在单词之间跳转

Ctrl+左右键

删除当前光标前面所有字符

Ctrl+u

更确切地说法是剪切

删除当前光标后面所有字符

Ctrl+k

也是剪切

粘贴Ctrl+u或Ctrl+k剪切

Ctrl + y

Terminal使用系统代理

除了浏览器使用系统代理,Terminal里面执行命令也可以使用,解决像brew和git等网络代理问题。

配置proxy

bash
export ALL_PROXY="socks5://127.0.0.1:2080"

或者更简洁的:

bash
export ALL_PROXY=127.0.0.1:2080

去掉代理:

bash
export ALL_PROXY=""

socks5h代表使用远程DNS而不是本地DNS,这在本地DNS混乱的情况下尤其有效。

配置git

vim ~/.gitconfig

[user]
	email = xxx@xxx
	name = username
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge -- %f
	process = git-lfs filter-process
	required = true
[http]
        proxy = socks5h://127.0.0.1:2080
        sslVerify = false

sslVerify需要配置,不然可能会报错ssl相关。

curl使用代理

bash
vim ~/.bashrc
export ALL_PROXY="socks5://127.0.0.1:2082"
source ~/.bashrc
curl --proxy $ALL_PROXY -I https://www.reddit.com

linuxmint安装中文输入法

bash
sudo apt-get install fcitx fcitx-bin fcitx-pinyin  fcitx-googlepinyin

重启虚拟机 或者 注销重新登录。

如果没有切换成功,手动运行fcitx-configtool 或者手动查找fcitx菜单打开配置。

如果fcitx框架不是默认,则通过系统自带的设置菜单,先切换到fcitx然后再进行以上操作菜单的配置。

centos9设置国内源与epel

centos9设置中科大源

yum源目录:/etc/yum.repos.d 目录下所有的*.repo文件都移动到bak,用不到暂时备份。 只需要保留Centos.repo一个源文件即可。

文件内容:

[baseos]
name=CentOS Stream $releasever - BaseOS
baseurl=https://mirrors.ustc.edu.cn/centos-stream/9-stream/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[appstream]
name=CentOS Stream $releasever - AppStream
baseurl=https://mirrors.ustc.edu.cn/centos-stream/9-stream/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

更新缓存:

bash
dnf clean all
dnf makecache
dnf update

阿里源参考:https://www.cnblogs.com/LandWind/p/centos-stream-9-repo-set-aliyun.html

centos9启用epel

bash
sudo dnf config-manager --set-enabled crb
sudo dnf install epel-release epel-next-release

参考:https://www.redhat.com/sysadmin/install-epel-linux

epel.repo

[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/$basearch/debug/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/$releasever/Everything/source/tree/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

epel-next.repo

[epel-next]
name=Extra Packages for Enterprise Linux $releasever - Next - $basearch
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/next/$releasever/Everything/$basearch/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-next-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever

[epel-next-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - Next - $basearch - Debug
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/next/$releasever/Everything/$basearch/debug/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-next-debug-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

[epel-next-source]
name=Extra Packages for Enterprise Linux $releasever - Next - $basearch - Source
# It is much more secure to use the metalink, but if you wish to use a local mirror
# place its address here.
#baseurl=https://download.example/pub/epel/next/$releasever/Everything/source/tree/
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-next-source-$releasever&arch=$basearch&infra=$infra&content=$contentdir
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1

su - sudo su - sudo -i 的区别

关于su和sudo的命令很容易记错用错,在此总结。

关于su

[su username]表示切换到username用户模式,需要输入该用户密码。如果是root用户使用该命令,则不需要输入密码,因为root权限最高。

[su]只输入su后面不加账户名称时,系统默认切换到root账户,密码也为root的密码。没有时间限制。

[su -]表示申请切换root用户,需要申请root用户密码。有些Linux发行版,例如ubuntu,默认没有设置root用户的密码,所以需要我们先使用sudo passwd root设置root用户密码。

[su]和[su -]区别:

[su]只是切换了root身份,但Shell环境仍然是普通用户的Shell;而[su -]连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误,报command not found的错误。

[su]切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用[su -]命令切换以后,工作目录变成root的工作目录了。

用echo $PATH命令看一下su和su - 后的环境变量已经变了。

su与sudo的区别

su密码输入的是root的密码,sudo密码输入是当前用户的密码。

[sudo su] 切换root身份,不携带当前用户环境变量。

[sudo su -]切换root身份,携带当前用户环境变量。

带-切换以后,当前目录是/root,不带-切换以后pwd是原来用户的~目录。

sudo -i 等于 sudo su -

参考资料

man路径

man文件存放路径

man命令通过环境变量$MANPATH知道:

bash
echo $MANPATH

手动存放man文件

知道man路径后,手动存放,比如:

/usr/local/share/man/man1

然后二进制命令xxx存放:

/usr/local/bin

man xxx就有文档了。

crontab基本使用

查看当前:

bash
crontab -l

修改:

bash
crontab -e

查看系统信息neofetch

Neofetch 是一个简单但有用的命令行系统信息工具,它用 Bash 编写。它会收集有关系统软硬件的信息,并在终端中显示结果。

默认情况下,系统信息将与操作系统的 logo 一起显示。但是,你可以进一步地自定义使用 ascii 图像或其他任何图片。

你还可以配置 Neofetch 显示的信息、信息的显示位置和时间。

Neofetch 主要用于系统信息的截图。它支持 Linux、BSD、Mac OS X、iOS 和 Windows 操作系统。

Neofetch 可在大多数 Linux 发行版的默认仓库中找到。

在 Debian(Stretch / Sid)上安装:

bash
sudo apt-get install neofetch

在 Fedora/CentOS 上安装:

bash
sudo yum install epel-relase
sudo yum install neofetch

mint编译apue.3e源码

目的是要生成apue.h头文件和静态链接库libapue.a

qpue.h是所有函数的声明以及宏定义,gcc在搜索头文件的时候默认会去搜索/usr/include/中的文件。

libapue.a是apue.h头文件中包含的所有函数及宏定义的具体实现,是一个静态链接库,gcc在搜索链接库的时候默认会去搜索/usr/local/lib/中的文件。

gcc 如何使用静态库和动态库

编译时可以直接带上完整路径的链接库进行编译,如 g++ main.cpp lib/libmyfun.so -o main ,但更多的是使用下面的方法。

gcc 使用 -l 参数来指定链接库,如链接 libtest.a 或 libtest.so,使用 -ltest。使用 -l 链接时去除 lib 前缀和后缀即可。

编译时,默认的链接库目录为 /usr/lib && /usr/local/lib ,如果是64位系统,还有 /usr/lib64;否则就需要通过 -L 参数来指定自定义链接库目录。(注:有的LINUX发行版好像不支持 /usr/local/lib 和 /usr/local/lib64,所以最好是使用 /usr/lib)

静态库链接后,是将代码直接嵌入到可执行文件中,所以运行时,不需要再指定静态库;而动态库则不然。如果动态库位于系统默认的库目录,则可直接运行。

以上说明参考:https://www.cnblogs.com/tianyajuanke/p/3359100.html

下面是编译过程记录:

bash
sudo apt-get install libbsd-dev

解压官网下载的源码,进入文件夹make

碰到错误1:

make[1]: 进入目录“/media/sf_share/src3e/apue.3e/db”
gcc -fPIC -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  -c db.c
gcc -shared -Wl,-dylib -o libapue_db.so.1 -L../lib -lapue -lc db.o
/usr/bin/ld: Error: unable to disambiguate: -dylib (did you mean --dylib ?)
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:32:libapue_db.so.1] 错误 1
make[1]: 离开目录“/media/sf_share/src3e/apue.3e/db”
make: *** [Makefile:6:all] 错误 1

解决:

修改db/Makefile

bash
gcc -shared -Wl,-dylib -o libapue_db.so.1 -L../lib -lapue -lc db.o

改成

bash
gcc -shared libapue_db.so.1 -L../lib -lapue -lc db.o

然后报错找不到libapue_db.so.1

直接删除db文件夹,再去掉根目录下Makefile中db目录,重新make

碰到错误2:

gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  devrdev.c -o devrdev  -L../lib -lapue
devrdev.c: In function ‘main’:
/usr/bin/ld: /tmp/cc40xX6i.o: in function `main':
devrdev.c:(.text+0xcb): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0xe1): undefined reference to `major'
/usr/bin/ld: devrdev.c:(.text+0x131): undefined reference to `minor'
/usr/bin/ld: devrdev.c:(.text+0x147): undefined reference to `major'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:18:devrdev] 错误 1
make[1]: 离开目录“/media/sf_share/src3e/apue.3e/filedir”
make: *** [Makefile:6:all] 错误 1

解决:在出错的文件devrdev.c,加入以下代码

#include <sys/types.h>
#include <sys/sysmacros.h>

碰到错误3:

make[1]: 进入目录“/media/sf_share/src3e/apue.3e/stdio”
gcc -ansi -I../include -Wall -DLINUX -D_GNU_SOURCE  buf.c -o buf  -L../lib -lapue
buf.c: In function ‘is_unbuffered’:
buf.c:90:15: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?
buf.c: In function ‘buffer_size’:
buf.c:92:15: error: ‘FILE’ has no member named ‘__pad’; did you mean ‘__pad5’?

参考:https://blog.csdn.net/hp_cpp/article/details/110330825

stdio/but.c 将这两处的_flag改成_flags,但这种方案测试无法解决;最后直接删除stdio/buf stdio/buf.c 修改stdio/Makefile 去掉buf后重新编译,有警告但是成功了。

编译成功后:

bash
cp ./include/apue.h /usr/include/
cp ./lib/error.c /usr/include
cp ./lib/libapue.a /usr/local/lib/

在apue.h最后加一行代码

#include "error.c"

其他参考:

sudo cp ./include/apue.h /usr/include/
sudo cp ./lib/libapue.a /usr/local/lib/

上面这两行实际在mint上执行过;如果文件权限有问题,可以修改修复。

bash
sudo chmod 644 apue.h
sudo chmod 644 libapue.a

Macos上,clang路径不一样。make顺利通过编译,然后.a可以直接像linux那样复制过去。

bash
sudo cp ./lib/libapue.a /usr/local/lib/

但mac上面没有/usr/include,然后试了网上说的路径:

bash
sudo cp apue.h /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/

也不行,所以直接复制apue.h 头文件到本地项目文件就可以了,跟源码放一起,不必放到系统默认库的路径下。使用示例:

bash
gcc filename.c -lapue

Linux新增用户一般流程

内容基于Kimi修改

基于linuxmint实操记录

使用root创建一个能登录bash的用户test:

bash
useradd -m -s /bin/bash test

修改密码:

bash
passwd test

复制一个用户的home目录过去test用户的home目录:

bash
cp -R /home/w/.  /home/test/
chown -R test:test /home/test

注意.*的区别,前者包括隐藏的文件和目录,后者只包括非隐藏的,这里的复制主要是要复制一些配置文件,所以只能使用前者。

加入sudoers:

vim  /etc/sudoers
test  ALL=(ALL) NOPASSWD: ALL

加入一些用户组:

bash
usermod -aG vboxsf test
usermod -aG docker test
usermod -aG  www-data test

修改一些硬编码,bashrc vimrc profile 等。

安装或修改conda(miniforge),参考:https://github.com/conda-forge/miniforge

测试conda是否正常:

bash
source ~/.bashrc
conda deactivate

以上基本就创建了一个跟之前大致不差的新用户了。

一般通用流程

在Linux系统中创建用户是一个常见的系统管理任务。以下是创建新用户的步骤:

  1. 使用useradd命令
    • 打开终端。
    • 输入命令 sudo useradd -m 用户名,其中“用户名”是你想要创建的新用户的名称。-m选项表示创建用户的主目录。

以上添加完用户后,默认的shell可能不是bash,而是sh,具体要创建完,查看/etc/passwd 才知道。

linuxmint下默认应该是sh,不是bash,创建后要修改/etc/passwd的值,要么在创建前明确指定:

sudo useradd -m -s /bin/bash username
  1. 设置密码

    创建用户后,你需要为新用户设置密码。使用命令 sudo passwd 用户名,然后按照提示输入密码。

  2. 添加用户到用户组(可选):

    如果你需要将新用户添加到特定的用户组,可以使用 sudo usermod -aG 组名 用户名 命令,其中“组名”是目标组的名称。

  3. 配置用户的主目录(可选):

    如果你想要自定义用户的主目录,可以在创建用户时使用 -d 选项指定路径,例如:sudo useradd -m -d /home/新目录 用户名

  4. 设置默认shell(可选):

    默认情况下,新用户的shell是/bin/bash。如果你想要更改它,可以使用 -s 选项指定shell,例如:sudo useradd -m -s /bin/zsh 用户名

  5. 复制或创建用户的配置文件(可选):

    有时你可能需要复制一个现有用户的配置文件到新用户的主目录,可以使用 cp -R /home/原用户目录/. /home/新用户目录/ 命令。sudo chown -R 新用户:新用户 /home/新用户/实际上有不少配置会写死硬编码,尤其是涉及到当前用户的路径,需要注意更改,比如bashrc vimrc profile 等等

  6. 锁定或解锁用户(可选): 如果你需要锁定用户,使其无法登录,可以使用 sudo passwd -l 用户名 命令。 如果需要解锁用户,可以使用 sudo passwd -u 用户名 命令。

请记得,创建用户和修改系统配置通常需要管理员权限,所以你可能需要使用sudo来执行上述命令。此外,确保你了解每个命令的用途和潜在的安全影响,以免不小心锁定了错误的用户或创建了不安全的账户。

SSH非交互式的登录方式

SSH终端登录时默认使用的是非交互式的登录方式(non-interactive login),这可能导致无法自动执行source ~/.bashrc

如果使用的是SSH密钥进行登录,可以尝试在登录命令中添加-i参数以使用交互式登录方式(interactive login),例如:

bash
ssh -i /path/to/private_key user@host

这样可以确保在登录时自动执行source ~/.bashrc。

服务器时间同步chronyc

chronyc 命令:设置时间与时间服务器同步。

chronyc 命令来自英文词组 chrony command-line 的缩写,其功能是设置时间与时间服务器同步。

chrony 是一个用于保持系统时间与 NTP 时间服务器同步的服务,其守护进程 chronyd 更为常见,而 chronyc 命令则是用户的配置工具

Chrony通常比传统的NTP更稳定,因为它可以更快地适应网络条件的变化,并且对时间的估计更加精确。

如果您的CentOS系统需要更精确的时间同步,可以考虑使用Chrony。

以下是一些基本的chronyc命令:

sudo yum install chrony

sudo systemctl start chronyd

sudo systemctl enable chronyd

#查看同步状态
chronyc tracking

#手动同步时间 这个命令会立即将系统时间调整到与NTP服务器同步
chronyc makestep

#查看NTP源 显示当前的NTP源和它们的同步状态
chronyc sources

#查看时间服务器的统计信息
chronyc sourcestats

#查看日志
chronyc log

添加或更改NTP源,修改配置:

编辑/etc/chrony.conf文件,添加或更改NTP服务器地址。

#在文件中添加或更改如下行
server ntp1.aliyun.com iburst

sudo systemctl restart chronyd