银河麒麟桌面版 设置开机默认进入命令行
查看和修改系统默认运行目标
1. 查看当前默认运行目标
# 查看系统当前的默认启动目标
systemctl get-default
# 输出示例:
# multi-user.target # 命令行界面
# graphical.target # 图形界面
2. 修改默认运行目标
选项A:设置为图形界面 (Graphical Mode)
# 设置为图形界面启动
sudo systemctl set-default graphical.target
# 验证设置
systemctl get-default
选项B:设置为命令行界面 (Command Line Mode)
# 设置为命令行界面启动
sudo systemctl set-default multi-user.target
# 验证设置
systemctl get-default
3. 立即切换运行目标(无需重启)
从命令行切换到图形界面:
# 立即启动图形界面(当前会话)
sudo systemctl start graphical.target
# 或者使用启动管理器
sudo systemctl isolate graphical.target
从图形界面切换到命令行:
# 立即切换到命令行(当前会话)
sudo systemctl isolate multi-user.target
4. 完整脚本(带交互选择)
创建一个脚本 change_runlevel.sh:
#!/bin/bash
# 系统运行模式切换脚本
# 修复权限问题,增加用户友好性
# 颜色定义(可选,增强可读性)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 检查命令是否存在
check_command() {
if ! command -v systemctl &> /dev/null; then
echo -e "${RED}错误:此脚本需要systemctl命令,但未找到。${NC}"
echo -e "${YELLOW}请确保您正在使用systemd系统。${NC}"
exit 1
fi
}
# 检查sudo权限
check_sudo() {
# 检查是否需要sudo密码
echo -e "${YELLOW}检查权限...${NC}"
# 尝试获取当前用户
CURRENT_USER=$(whoami)
if [ "$CURRENT_USER" = "root" ]; then
echo -e "${GREEN}当前为root用户,无需sudo。${NC}"
SUDO_CMD=""
else
echo -e "${YELLOW}当前用户: $CURRENT_USER${NC}"
# 测试是否有sudo权限而不要求密码
if sudo -n true 2>/dev/null; then
echo -e "${GREEN}用户 $CURRENT_USER 有免密码sudo权限。${NC}"
SUDO_CMD="sudo"
else
echo -e "${YELLOW}需要sudo权限来修改系统设置。${NC}"
# 测试sudo是否需要密码
if sudo -v 2>/dev/null; then
echo -e "${GREEN}sudo可用,但可能需要输入密码。${NC}"
SUDO_CMD="sudo"
else
echo -e "${RED}错误:无法获取sudo权限。${NC}"
echo -e "${YELLOW}请确保您有sudo权限,或使用root用户运行此脚本。${NC}"
exit 1
fi
fi
fi
}
# 创建日志文件(用户友好的方式)
create_log() {
local log_dir="$HOME/.system_mode_logs"
local log_file=""
# 1. 创建目录
if [ ! -d "$log_dir" ]; then
echo -e "${YELLOW}创建日志目录: $log_dir${NC}"
if ! mkdir -p "$log_dir" 2>/dev/null; then
echo -e "${YELLOW}警告:无法创建日志目录,跳过日志记录。${NC}"
return 1
fi
fi
# 2. 检查可写权限
if [ ! -w "$log_dir" ]; then
echo -e "${YELLOW}警告:无法写入日志目录,跳过日志记录。${NC}"
return 1
fi
# 3. 生成文件名
log_file="$log_dir/system_target_change_$(date +%Y%m%d_%H%M%S).log"
# 4. 实际创建文件
if ! touch "$log_file" 2>/dev/null; then
echo -e "${YELLOW}警告:无法创建日志文件,跳过日志记录。${NC}"
return 1
fi
# 5. 设置权限
chmod 600 "$log_file" 2>/dev/null || true
# 6. 返回路径
echo "$log_file"
return 0
}
# 记录日志
log_message() {
local message="$1"
local log_file="$2"
if [ "$log_file" != "/dev/null" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$log_file"
fi
}
# 显示当前状态
show_current_status() {
echo -e "${BLUE}=== 当前系统状态 ===${NC}"
# 尝试获取当前目标,如果失败则退出
if ! CURRENT_TARGET=$($SUDO_CMD systemctl get-default 2>/dev/null); then
echo -e "${RED}错误:无法获取当前系统启动目标。${NC}"
echo -e "${YELLOW}请检查systemd服务是否正常运行。${NC}"
exit 1
fi
if [ "$CURRENT_TARGET" = "graphical.target" ]; then
echo -e "${GREEN}当前模式: 图形界面${NC}"
CURRENT_MODE="图形界面"
OTHER_MODE="命令行界面"
OTHER_TARGET="multi-user.target"
else
echo -e "${GREEN}当前模式: 命令行界面${NC}"
CURRENT_MODE="命令行界面"
OTHER_MODE="图形界面"
OTHER_TARGET="graphical.target"
fi
}
# 主函数
main() {
# 检查必要命令
check_command
# 检查权限
check_sudo
# 创建日志文件
LOG_FILE=$(create_log)
# 显示当前状态
show_current_status
echo ""
echo -e "${BLUE}=== 选择要设置的模式 ===${NC}"
echo "1) 图形界面 (graphical.target)"
echo "2) 命令行界面 (multi-user.target)"
echo "3) 仅查看当前状态"
echo "4) 退出"
echo ""
read -p "请选择 [1-4]: " choice
case $choice in
1)
echo -e "${YELLOW}正在设置为图形界面...${NC}"
if $SUDO_CMD systemctl set-default graphical.target; then
NEW_TARGET="graphical.target"
NEW_MODE="图形界面"
echo -e "${GREEN}设置完成!下次启动将进入图形界面。${NC}"
log_message "设置默认启动目标为: graphical.target" "$LOG_FILE"
else
echo -e "${RED}设置失败!请检查权限或系统状态。${NC}"
exit 1
fi
;;
2)
echo -e "${YELLOW}正在设置为命令行界面...${NC}"
if $SUDO_CMD systemctl set-default multi-user.target; then
NEW_TARGET="multi-user.target"
NEW_MODE="命令行界面"
echo -e "${GREEN}设置完成!下次启动将进入命令行界面。${NC}"
log_message "设置默认启动目标为: multi-user.target" "$LOG_FILE"
else
echo -e "${RED}设置失败!请检查权限或系统状态。${NC}"
exit 1
fi
;;
3)
echo -e "${GREEN}当前默认目标: $CURRENT_TARGET${NC}"
exit 0
;;
4)
echo "退出。"
exit 0
;;
*)
echo -e "${RED}无效选择!${NC}"
exit 1
;;
esac
# 显示最终状态
echo ""
echo -e "${BLUE}=== 最终状态 ===${NC}"
FINAL_TARGET=$($SUDO_CMD systemctl get-default)
echo -e "${GREEN}默认启动目标: $FINAL_TARGET${NC}"
# 询问是否立即切换
echo ""
echo -e "${BLUE}=== 立即切换选项 ===${NC}"
if [ "$CURRENT_TARGET" != "$NEW_TARGET" ]; then
echo "当前运行在 $CURRENT_MODE,已设置为下次启动进入 $NEW_MODE。"
echo "您可以选择立即切换到 $NEW_MODE,但请注意:"
echo " - 如果从图形界面切换到命令行,所有图形程序将关闭"
echo " - 如果从命令行切换到图形界面,需要图形服务支持"
echo " - 切换过程中可能会断开当前连接"
echo ""
read -p "是否立即切换到 $NEW_MODE? [y/N]: " immediate_choice
if [[ "$immediate_choice" =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}正在切换到 $NEW_MODE...${NC}"
# 记录切换前的状态
log_message "开始切换: 从 $CURRENT_TARGET 到 $NEW_TARGET" "$LOG_FILE"
# 执行切换
if $SUDO_CMD systemctl isolate "$NEW_TARGET"; then
echo -e "${GREEN}切换成功!${NC}"
log_message "切换成功完成" "$LOG_FILE"
else
echo -e "${RED}切换失败,请检查系统日志。${NC}"
echo -e "${YELLOW}您可以尝试手动执行: $SUDO_CMD systemctl start $($SUDO_CMD systemctl get-default)${NC}"
log_message "切换失败" "$LOG_FILE"
fi
else
echo -e "${YELLOW}保持当前运行模式,下次启动时将进入 $NEW_MODE。${NC}"
log_message "用户选择不立即切换,保持当前模式" "$LOG_FILE"
fi
else
echo -e "${YELLOW}当前已在 $CURRENT_MODE 模式,无需立即切换。${NC}"
fi
# 显示提示信息
echo ""
echo -e "${BLUE}=== 使用提示 ===${NC}"
echo -e "${GREEN}1.${NC} 要恢复之前的设置,可以重新运行此脚本"
echo -e "${GREEN}2.${NC} 要立即切换模式,可执行: $SUDO_CMD systemctl isolate multi-user.target 或 graphical.target"
echo -e "${GREEN}3.${NC} 要查看当前运行级别: $SUDO_CMD systemctl get-default"
echo -e "${GREEN}4.${NC} 要查看所有正在运行的服务: $SUDO_CMD systemctl list-units --type=service"
if [ "$LOG_FILE" != "/dev/null" ] && [ -f "$LOG_FILE" ]; then
echo -e "${GREEN}5.${NC} 操作日志保存在: $LOG_FILE"
fi
echo ""
echo -e "${GREEN}脚本执行完成!${NC}"
}
# 错误处理
trap 'echo -e "${RED}脚本被中断!${NC}"; exit 1' INT TERM
# 运行主函数
main
5. 使用说明
设置脚本权限并运行:
# 创建脚本文件
nano change-runlevel.sh
# 粘贴上面的脚本内容
# 按 Ctrl+X,然后 Y,回车保存
# 设置执行权限
chmod +x change-runlevel.sh
# 运行脚本
./change-runlevel.sh
其他有用的系统控制命令:
# 查看当前运行级别
runlevel
# 查看所有可用目标
systemctl list-units --type=target --all
# 查看服务状态
systemctl status display-manager # 显示管理器(GDM/LightDM等)
# 重启显示管理器(图形界面相关)
sudo systemctl restart gdm3 # GNOME
sudo systemctl restart lightdm # LightDM
sudo systemctl restart sddm # KDE
6. 故障排除
如果设置后图形界面不启动:
# 检查显示管理器状态
sudo systemctl status display-manager
# 启用显示管理器(如果被禁用)
sudo systemctl enable gdm3
# 重新安装显示管理器(如果需要)
sudo apt install --reinstall gdm3 ubuntu-desktop
恢复默认设置:
# 重置为发行版默认(Ubuntu通常是图形界面)
sudo systemctl set-default graphical.target
7. 常用场景
服务器环境(无图形界面):
# 设置为命令行模式
sudo systemctl set-default multi-user.target
# 禁用所有图形服务
sudo systemctl disable gdm3
sudo systemctl disable graphical.target
桌面环境(需要图形界面):
# 确保图形界面设置正确
sudo systemctl set-default graphical.target
sudo systemctl enable gdm3
sudo systemctl start gdm3

浙公网安备 33010602011771号