银河麒麟桌面版 设置开机默认进入命令行

查看和修改系统默认运行目标

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
posted @ 2025-12-18 16:50  BlackSnow  阅读(24)  评论(0)    收藏  举报