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系统中创建用户是一个常见的系统管理任务。以下是创建新用户的步骤:
- 使用
useradd
命令:- 打开终端。
- 输入命令
sudo useradd -m 用户名
,其中“用户名”是你想要创建的新用户的名称。-m
选项表示创建用户的主目录。
以上添加完用户后,默认的shell可能不是bash,而是sh,具体要创建完,查看/etc/passwd 才知道。
linuxmint下默认应该是sh,不是bash,创建后要修改/etc/passwd的值,要么在创建前明确指定:
sudo useradd -m -s /bin/bash username
设置密码:
创建用户后,你需要为新用户设置密码。使用命令
sudo passwd 用户名
,然后按照提示输入密码。添加用户到用户组(可选):
如果你需要将新用户添加到特定的用户组,可以使用
sudo usermod -aG 组名 用户名
命令,其中“组名”是目标组的名称。配置用户的主目录(可选):
如果你想要自定义用户的主目录,可以在创建用户时使用
-d
选项指定路径,例如:sudo useradd -m -d /home/新目录 用户名
。设置默认shell(可选):
默认情况下,新用户的shell是
/bin/bash
。如果你想要更改它,可以使用-s
选项指定shell,例如:sudo useradd -m -s /bin/zsh 用户名
。复制或创建用户的配置文件(可选):
有时你可能需要复制一个现有用户的配置文件到新用户的主目录,可以使用
cp -R /home/原用户目录/. /home/新用户目录/
命令。sudo chown -R 新用户:新用户 /home/新用户/
实际上有不少配置会写死硬编码,尤其是涉及到当前用户的路径,需要注意更改,比如bashrc vimrc profile 等等锁定或解锁用户(可选): 如果你需要锁定用户,使其无法登录,可以使用
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