双系统这件事,说简单也简单——插个U盘,下一步下一步,半小时装完;说难也难,十个人装,五个人卡在分区界面不敢点,三个人装完发现Windows进不去了,还有两个人驱动装不起来对着黑屏发呆。我自己前后装过不下二十台机器,从老式MBR笔记本到现在的NVMe+UEFI台式机,踩过的坑基本能凑成一本小册子。这篇就把Windows + Ubuntu 20.04双系统的完整链路拆开讲:从磁盘怎么腾空间、U盘启动盘怎么做、分区界面每一个选项为什么这么选,到装完之后GRUB引导、时间差8小时、NVIDIA显卡驱动、主副屏设置、两个系统互访文件这一整条线。内容面向有一点动手能力但没装过的朋友,也适合装过一两次但总在引导上翻车的人对照复习。
1. 动手之前:双系统方案里最容易翻车的三个决定
1.1 先装Windows再装Ubuntu,这个顺序为什么不能颠倒
只要你打算让GRUB来统一管理启动菜单,安装顺序就只能是先Windows后Ubuntu。原因在于引导程序对磁盘引导记录的写入方式:Ubuntu的GRUB安装时会主动去扫描硬盘上已存在的操作系统,把Windows Boot Manager作为一个菜单项写进自己的配置里;反过来,Windows安装程序完全不认识ext4文件系统,它的引导修复逻辑只会覆盖MBR或ESP里的引导文件,装完Windows之后GRUB直接消失,Ubuntu的入口也就没了。
真要是已经先装了Ubuntu再想加Windows,也不是没救,只是要额外做一步引导重建,成本比顺序装高得多。我一般直接建议重装,除非那台Ubuntu里已经有大量配置好的开发环境舍不得丢。
另外有一点要提醒:如果你习惯用Windows的"系统还原"或者恢复出厂设置,那Ubuntu分区有被清掉的风险。品牌的恢复镜像很多会重写整块磁盘的分区表。真要重置Windows,先确认恢复流程里有没有"仅格式化C盘"这样的选项。
1.2 磁盘空间的规划:压缩卷、未分配空间和Ext4之间的关系
Ubuntu 20.04的桌面版装完加常用软件,60GB根分区是比较舒服的;如果你后面要装ROS Noetic + Gazebo + CUDA这一套,那就奔着100GB去。现在SSD普遍512GB起步,从Windows那边切150GB出来给Ubuntu并不算过分。
腾空间走Windows自带的磁盘管理最稳妥:Win + X→ 磁盘管理 → 右键C盘 → 压缩卷。但这里有个很多人第一次都会懵的点——你想压缩150GB,系统却只让你压30GB。
这不是玄学,是NTFS的物理布局问题。不可移动的文件(页面文件pagefile.sys、休眠文件hiberfil.sys、主文件表MFT的保留区、卷影副本)如果正好卡在磁盘中后段,压缩操作就没法越过它们把空间释放出来。
我的处理顺序是这样的:
- 先关休眠,管理员权限运行
powercfg -h off,休眠文件直接清零。 - 系统属性里关掉系统保护(还原点),释放卷影副本占用的空间。
- 虚拟内存改成"无分页文件"或者把页面文件挪到别的盘,压缩完再改回来。
- 用Windows自带的碎片整理做一次优化。
- 还不行就上DiskGenius这类工具做无损分区调整,它的移动能力比磁盘管理强,但操作前一定要备份重要数据,分区调整属于有风险的操作。
压缩完之后,你在磁盘管理里会看到一块黑色的"未分配"区域。这块区域在Windows里是看不见摸不着的,但Ubuntu安装器的分区界面会把它识别成"空闲"(free space),也就是你可以直接拿来建ext4分区的地方。
注意:别在Windows里把这块未分配空间格式化成新分区,一旦格式化成NTFS,Ubuntu安装器会把它当成一个已有分区来处理,手工分区的自由度就没了。留着不分配,交给Ubuntu安装器。
1.3 启动盘制作与固件设置:UEFI、GPT、Secure Boot三件套
Ubuntu 20.04的ISO去官网或者国内镜像站下载都行,ubuntu-20.04.x-desktop-amd64.iso,注意别下成Server版,Server版没有图形安装界面,对新手不友好。
写盘工具我用Rufus,参数这样配:
| 选项 | 取值 | 原因 |
|---|---|---|
| 分区类型 | GPT | UEFI机器必须,MBR会和现有Windows引导冲突 |
| 目标系统 | UEFI(非CSM) | 强制走纯UEFI引导,避免Legacy/UEFI混用 |
| 文件系统 | FAT32 | UEFI固件只认FAT系的ESP分区格式 |
| 簇大小 | 默认 | 不用动 |
| 写入模式 | ISO镜像模式 | 更接近光驱行为,兼容性最好 |
如果Rufus弹窗问你是用"ISO镜像模式"还是"DD镜像模式",选ISO模式。DD模式写出来的U盘在某些主板上识别不到。
写完盘进BIOS(开机狂按F2、Del、F10或者Esc,各家不一样),确认三件事:Boot Mode是UEFI、Secure Boot可以先开着(Ubuntu 20.04支持安全启动)、快速启动(Fast Boot)建议关掉。Fast Boot开着的时候,USB设备有时候在开机阶段根本没被枚举到,插着U盘也进不去启动菜单。
启动顺序里把USB设备提到最前面,保存重启。如果屏幕出现黑底白字的GRUB菜单,或者直接进了Ubuntu的图形安装向导,说明盘做对了。
2. 从U盘启动到分区界面:Ubuntu 20.04安装过程中的关键抉择
2.1 先用试用模式跑一遍,确认硬件兼容性
GRUB菜单第一项是"Ubuntu",第二项是"Ubuntu (safe graphics)",后面还有"Try Ubuntu without installing"。我的习惯永远是先进试用模式(Try Ubuntu),不着急点安装。
试用模式的意义在于:它加载的是和最终系统完全一样的内核和驱动栈,你能提前知道这块硬件在Ubuntu下的真实状态。进桌面之后重点看几个东西——无线网卡能不能扫描到热点、触控板灵不灵、屏幕分辨率对不对、外接显示器有没有识别、扬声器有没有声音。这些如果试用模式里就不正常,装完也是不正常的,不如先知道问题在哪。
尤其笔记本用户,如果试用模式进桌面直接黑屏或者花屏,八成是NVIDIA独显和开源nouveau驱动打架。这时候退出重进,在GRUB菜单上按e编辑启动参数,在linux那一行末尾加上nomodeset,Ctrl+X启动,能正常进桌面之后再装系统、再装闭源驱动。
试用模式里还有个实用的检查:打开终端敲ls /sys/firmware/efi,如果目录存在,说明当前是UEFI模式启动的;如果不报错但目录不存在,那就是Legacy模式,这时候装出来的系统引导方式会和Windows不一致,后面必然要处理。发现是Legacy,回BIOS重新确认启动项。
确认没问题,桌面上双击"Install Ubuntu 20.04 LTS"开始。
2.2 "其他选项"手工分区:/、/home、swap、ESP该怎么分
安装类型这一页有五个选项,很多人在这里就懵了。直接说结论:选最后一个"其他选项"(Something else),手工分区。
前面那些"清除整个磁盘"是不能碰的,"与Windows共存"虽然方便但它自动分配的空间往往很随意,根分区给个20GB,装两个大软件就满了。
进入分区界面之后,你会看到磁盘列表。这时候要能认出哪个是Windows的EFI分区——特征很明显:FAT32格式,大小100MB到300MB之间,通常在磁盘的最前面。
我的分区方案长这样(假设从Windows那边腾出了150GB未分配空间,机器16GB内存):
| 挂载点 | 大小 | 类型 | 说明 |
|---|---|---|---|
| /boot/efi | 复用Windows已有的ESP | fat32 | 不要格式化,只设置挂载点 |
| swap | 16GB | 交换空间 | 和内存等大,方便休眠 |
| / | 70GB | ext4 | 根分区,装系统和软件 |
| /home | 剩余约64GB | ext4 | 个人数据,重装系统时能保住 |
具体操作:选中那块free space,点左下角"+"号,依次按上面的表格创建。EFI分区那一步要注意,选中Windows原有的那个FAT32分区,点"更改",把"用于"设成EFI系统分区,挂载点填/boot/efi,格式化的勾不要打。
提示:Windows的ESP一般只有100MB。Ubuntu的内核文件放在根分区的
/boot下,不占ESP,所以100MB通常够用。但如果你的ESP里已经堆了好几个系统的引导文件,快满了,可以在Ubuntu下用sudo du -sh /boot/efi/*看一眼,把旧的EFI/ubuntu目录清理掉再重装。
swap给多大有个讲究。16GB内存的机器,如果不需要休眠(suspend to disk),给8GB也够用;如果要用休眠功能,swap必须大于等于物理内存。现在SSD便宜,我一般直接给等大,省心。也可以不建swap分区,改用swapfile,但分区方式对新手更直观。
根分区不要给太小。Ubuntu 20.04默认装完大概占8到10GB,但后面的/var、/usr会随着软件不断增长,ROS全套装下去就是十几个GB。70GB是保守值,预算够就给100GB。
/home单独分区的价值在于重装。以后你想换Ubuntu 22.04或者24.04,只要重装时把/home指向同一个分区、不勾格式化,所有个人文件、配置文件都还在。至于swap,现在很多教程建议用swapfile代替,两种都行,分区方案对虚拟机迁移更友好。
2.3 引导器安装位置选错,Windows直接失联
分区页面最下面有一行"安装启动引导器的设备"(Device for boot loader installation),默认可能是/dev/nvme0n1这样的整块磁盘,也可能是某个分区。这里必须选整块磁盘,比如/dev/nvme0n1、/dev/sda,不要选成/dev/nvme0n1p1。
为什么?UEFI模式下,GRUB的grubx64.efi文件会写到ESP分区的EFI/ubuntu/目录里,同时往主板NVRAM里注册一条启动项。选整块磁盘时,安装器会自己去找ESP;选分区的话,理论上结果一样,但某些版本安装器在识别时分不清你指的是不是ESP,容易写错位置,导致重启后BIOS里找不到Ubuntu启动项,同时Windows启动项也被覆盖得不完整。
还有更狠的一种情况:引导器被写到了U盘上。这种情况重启拔掉U盘之后,两个系统都进不去,BIOS里只剩一个"ubuntu"但指向的是不存在的设备。判断方法很简单,重启后BIOS启动菜单里如果有多个"ubuntu"条目,而其中一个在你插U盘时才出现,那就是写错地方了。重装一次最省事。
确认引导设备之后还有个弹窗,列出即将执行的操作——"格式化分区X为ext4"、"格式化分区Y为swap"等等。这一步务必逐行读完,确认里面没有出现Windows的C盘和那个100MB的ESP的格式化操作。这是最后一道闸门,看清楚了再点"现在安装"。
后面就是选时区(上海)、建用户、设密码。密码建议设复杂一点,Ubuntu默认不允许root直接登录,sudo密码就是你的用户密码,别设成123456然后连SSH上去。
整个安装过程大概15到30分钟,取决于U盘速度和SSD速度。装完提示重启,拔掉U盘,按回车。
3. 装完重启才算真正开始:GRUB、时间与引导修复
3.1 GRUB菜单瘦身与默认启动项设定
重启之后你会看到一个紫黑色的GRUB菜单,里面除了Ubuntu,还有Windows Boot Manager,以及一堆"Memory test"之类的选项。默认第一个是Ubuntu,5秒后自动进。
大多数人日常用Windows更多,每次开机都要手动按方向键选,很烦。改默认启动项就是改/etc/default/grub这一个文件。
先看一下菜单里Windows排第几。GRUB的编号从0开始,且子菜单也算一层,所以更稳的做法是用菜单项的名字来指定。Ubuntu下运行:
sudo grep menuentry /boot/grub/grub.cfg | head -20找到Windows那一行的名字,比如'Windows Boot Manager (on /dev/nvme0n1p1)'。然后编辑:
sudo nano /etc/default/grub改这几个参数:
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)" GRUB_TIMEOUT=10 GRUB_TIMEOUT_STYLE=menuGRUB_TIMEOUT_STYLE=menu很重要,Ubuntu默认是hidden,意思是开机不显示菜单,要按Shift才会出来。你设了默认项却看不到菜单,会以为没生效。改成menu之后菜单一直显示。
保存之后必须执行:
sudo update-grub这一步会重新生成/boot/grub/grub.cfg,同时调用os-prober扫描其他系统。执行过程中如果输出里能看到Found Windows Boot Manager on /dev/nvme0n1p1,说明识别成功。
想让GRUB记住你上次选的系统,可以改用GRUB_DEFAULT=saved,再加一行GRUB_SAVEDEFAULT=true。不过这种模式在双系统里容易让人产生"我明明设了默认项为什么每次不一样"的困惑,我一般不用。
3.2 双系统时间差8小时的根因与两种修法
装完双系统,最经典的病症来了:从Ubuntu重启进Windows,系统时间晚了8小时(或者反过来快8小时)。而你在任何一个系统里手动校准,重启回到另一个系统又错了。
根因是两者对硬件时钟(RTC)的理解不一样。Windows默认把RTC当成"本地时间"来读写,Ubuntu则遵循Unix传统,把RTC当成UTC来读写,两者相差的正好是时区偏移量。北京时间是UTC+8,所以差了8小时。
两种修法,我更推荐改Windows,因为它符合Linux的习惯,而且以后你连SSH或者跑服务器的时候不会因为时区问题困惑。
方法一:改Ubuntu,让RTC存本地时间
timedatectl set-local-rtc 1 --adjust-system-clock执行完用timedatectl确认输出里有RTC in local TZ: yes。这个方法改的是Ubuntu的systemd配置,效果立竿见影。缺点是timedatectl会提示不推荐这么做,因为夏令时切换的时候会出问题。国内没有夏令时,实际影响不大。
方法二:改Windows,让RTC存UTC(推荐)
在Windows里以管理员身份打开命令提示符:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /t REG_DWORD /d 1 /f然后进Windows设置里把时间同步一次,重启验证。之后Ubuntu和Windows两边都能保持正确。
如果两个系统现在都不对,先按方法二在Windows里改注册表,重启进Ubuntu,执行sudo hwclock --systohc --utc把硬件时钟按UTC写一遍,再重启,两边就一致了。
3.3 从一个系统救援另一个系统的引导:两条完整链路
这部分是热词里问得最多的,也是真正决定你会不会在关键时刻抓瞎的技能。分两个方向说。
场景A:Windows进不去,GRUB里没有Windows项
先别慌。开机狂按F12(或者F11、Esc,看主板),BIOS的临时启动菜单里一般还有"Windows Boot Manager"这一项,直接选它能进Windows。如果连这个都没有,说明ESP里的Windows引导文件坏了或丢了。
挂载ESP看一眼:
sudo mkdir -p /mnt/esp sudo mount /dev/nvme0n1p1 /mnt/esp ls /mnt/esp/EFI/正常应该看到Microsoft、Boot、ubuntu三个目录。如果Microsoft目录在,但GRUB菜单里就是没有Windows项,那就是os-prober没扫到。手动触发:
sudo os-prober扫不到的原因常见有两个:一是Windows分区是BitLocker加密的,Linux根本读不了内容;二是一些Windows更新后,WinRE(恢复分区)的布局变了,os-prober识别出错。这种情况下可以在/etc/grub.d/40_custom里手写一条菜单项,指向/boot/efi/EFI/Microsoft/Boot/bootmgfw.efi,然后sudo update-grub。
如果Microsoft目录都消失了,那就得用Windows安装U盘修:
- 从Windows安装盘启动,到安装界面时按
Shift + F10调出命令行。 diskpart→list disk→select disk 0→list partition,找到那个100MB的ESP分区。select partition 1→assign letter=S,给ESP分配一个盘符。- 退出diskpart,执行
bcdboot C:\Windows /s S: /f UEFI。
这条命令会把Windows的引导文件重新写入ESP并注册启动项。做完重启,BIOS菜单里的Windows Boot Manager就回来了。
场景B:Ubuntu进不去,GRUB被Windows覆盖了
Windows的大版本更新(比如某些功能更新)有时候会重写ESP,把EFI/ubuntu目录干掉或者覆盖GRUB的启动项。现象是开机直接进Windows,BIOS里也找不到ubuntu。
修复工具是Ubuntu的Live USB。插上安装盘,进"Try Ubuntu",打开终端,先找到自己的根分区:
sudo fdisk -l假设根分区是/dev/nvme0n1p5,ESP是/dev/nvme0n1p1,执行:
sudo mount /dev/nvme0n1p5 /mnt sudo mount /dev/nvme0n1p1 /mnt/boot/efi for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done sudo chroot /mnt进入chroot环境后,你实际上就是在操作硬盘上那个坏掉的系统:
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu update-grub exitgrub-install把GRUB的EFI文件重新写进ESP,update-grub重新生成菜单。退出chroot,卸载挂载点,重启:
sudo umount -R /mnt sudo reboot这里有个新手最容易踩的坑:for i in /dev /dev/pts /proc /sys /run这一串bind mount不能省。chroot之后如果没有这些挂载,grub-install可能报错,或者update-grub根本扫描不到任何分区。我见过有人跳过这一步,结果grub-install提示成功,重启还是进不去,白折腾一晚上。
如果ESP也被格式化了,需要先在Live环境里重新给ESP建文件系统:
sudo mkfs.vfat -F 32 /dev/nvme0n1p1然后再走上面chroot那套流程。注意这一步之后Windows的引导文件也没了,修完Ubuntu还得顺手用bcdboot把Windows也补回来,两条链路都得走一遍。
4. NVIDIA驱动、主副屏与外设:桌面能用的最后一公里
4.1 显卡驱动:apt install nvidia-driver-535的完整流程
Ubuntu 20.04用开源nouveau驱动,日常办公和写代码都够,但一旦涉及CUDA、深度学习、Blender渲染、3D游戏,就必须上NVIDIA官方驱动。
最省心的方式是让系统自己推荐:
ubuntu-drivers devices输出里会列出可用的驱动版本,带recommended的那个就是最匹配的。Ubuntu 20.04这个时间点上,nvidia-driver-535是比较稳的长期版本,性能和新卡兼容性都比470系列好。
想让它自动装:
sudo ubuntu-drivers autoinstall想指定版本:
sudo apt update sudo apt install nvidia-driver-535装之前有几个准备工作:先确保build-essential、dkms、对应内核版本的linux-headers都装了,因为驱动要通过DKMS编译内核模块。命令:
sudo apt install build-essential dkms linux-headers-$(uname -r)apt装驱动的好处是它会自动处理nouveau的屏蔽,在/etc/modprobe.d/下生成nvidia-graphics-drivers.conf之类的文件把nouveau列入黑名单,不需要你手动改。手动跑.run安装包才需要自己写blacklist配置,还容易和系统包管理器冲突,我一般不建议。
装完必须重启,重启后验证:
nvidia-smi能打出显卡型号、驱动版本、显存占用、CUDA版本,说明驱动工作正常。如果提示"command not found",先确认nvidia-driver-535真的装上去了(dpkg -l | grep nvidia),再看dmesg | grep -i nvidia有没有报错。
注意:装完驱动重启,如果卡在登录界面黑屏、花屏,或者切换不到图形界面,先切到tty(
Ctrl + Alt + F3)登录,检查是不是Secure Boot的问题。装了DKMS模块但没签名,Secure Boot会拒绝加载,图形界面起不来。解决方式见下一节。
4.2 Secure Boot开启时的DKMS签名与黑屏排查
Ubuntu 20.04支持安全启动,安装系统本身不会有问题,因为Canonical的shim和GRUB都是签过名的。但NVIDIA驱动属于第三方内核模块,DKMS编译出来之后需要一个机器所有者密钥(MOK)来签名,Secure Boot才允许加载。
用apt装驱动的时候,安装脚本会弹出MOK注册提示,让你设一个一次性密码(8到16位,字母数字都行,虽然提示说要有特殊字符,实际可以随便设)。设置完之后重启,屏幕上会出现蓝底的MOK Manager界面:
- 选
Enroll MOK。 - 选
Continue。 - 选
Yes。 - 输入刚才设的密码。
- 选
Reboot。
这套流程走完,驱动模块就被信任了。如果手快按过了,或者当时没设密码,驱动会加载失败。补的方法是在Ubuntu里重新触发:
sudo dpkg-reconfigure nvidia-dkms-535再重启走一遍MOK流程。
如果你不打算用BitLocker、也不装任何需要安全启动验证的系统,最直接的办法是进BIOS把Secure Boot关掉,省掉这一整套流程。代价是Windows 11对安全启动有要求,有些机器关了之后Windows会提示不符合要求,看你自己权衡。
笔记本用户还要额外注意双显卡。带Intel核显+NVIDIA独显的机器装完驱动后,通常会用prime-select来切换:
prime-select query # 看当前用哪块 sudo prime-select nvidia # 切到独显 sudo prime-select on-demand # 混合模式切完要重新登录才生效。如果用on-demand模式,跑程序时加__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia前缀,才能强制走独显。
还有一个经典问题:外接显示器接在独显的接口上(很多游戏本HDMI口直连NVIDIA),如果系统当前用的是核显模式,外接屏就没信号。这时候切成nvidia或on-demand模式就好了。
4.3 主副屏设置、分辨率异常与高分屏缩放
双屏办公是刚需,Ubuntu 20.04的GNOME桌面在"设置 → 显示"里能直接拖拽排列显示器,也能设主副屏。但有时候界面里只有一块屏,或者分辨率选项不全,那就得回到命令行。
先看系统识别到了哪些输出接口:
xrandr输出里带connected的那几个才是真实接上的显示器,比如笔记本内屏是eDP-1,外接是HDMI-1或者DP-1。带disconnected的忽略。
设置HDMI为主屏、放在内屏右侧:
xrandr --output HDMI-1 --primary --mode 1920x1080 --right-of eDP-1如果分辨率选项里没有你显示器的最佳分辨率,比如2K屏只有1024x768可选,那多半是EDID读取异常,或者是线材问题(HDMI 1.4的线跑不满2K 60Hz)。可以先试着手动加模式:
cvt 2560 1440 60它会输出一段Modeline,复制出来:
xrandr --newmode "2560x1440_60" 312.25 2560 2752 3024 3488 1440 1443 1448 1493 -hsync +vsync xrandr --addmode HDMI-1 "2560x1440_60" xrandr --output HDMI-1 --mode "2560x1440_60"这套操作是临时的,重启就没了。要持久化,得写进~/.xprofile或者做成systemd服务。
高分屏(2K、4K)还有缩放问题。GNOME 20.04默认只提供100%和200%两档缩放,4K屏上设100%字太小,200%又太大。可以开实验性的分数缩放:
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"重启后设置里会多出125%、150%、175%这些档位。代价是开启分数缩放之后,有些基于X11的老程序会字体发虚,因为X11的位图缩放本来就不是无损的。写代码用VSCode的话,可以在设置里把window.zoomLevel调一下,比系统缩放更清晰。
登录后桌面的显示器排列(谁在左谁在右、主屏是谁)会被GNOME记在~/.config/monitors.xml里,所以设置一次之后一般不用重复操作。但如果你经常插拔外接屏,每次都要重设,建议写个脚本丢到启动项里。
5. 系统装好之后的开发环境与数据互通
5.1 换源、更新与基础工具的批量装法
新装好的Ubuntu第一件事就是换源。默认的archive.ubuntu.com在国外,apt更新动辄几分钟。
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update sudo apt upgrade -y阿里云、清华TUNA、中科大这几个源都可以,谁的线路对你快就用谁。换完之后apt update从几十秒变成几秒。
然后是基础工具一把梭:
sudo apt install -y build-essential cmake git curl wget vim htop \ net-tools openssh-server gcc g++ make pkg-configopenssh-server装上之后,你就能从Windows那边用SSH连进来,命令复制粘贴方便很多。Windows 10/11自带OpenSSH客户端,ssh username@ip直接连,ip用ip addr查。
Git的配置别忘:
git config --global user.name "你的名字" git config --global user.email "你的邮箱" git config --global core.editor vim ssh-keygen -t ed25519 -C "你的邮箱"生成的公钥~/.ssh/id_ed25519.pub贴到代码托管平台上,之后推代码就不用输密码了。
写代码的编辑器,VSCode在Ubuntu上体验很好,官方有.deb包:
sudo apt install ./code_*_amd64.debPython环境我强烈建议用Miniconda而不是系统自带的Python。Ubuntu 20.04自带的Python 3.8是系统的命脉,apt、GNOME都依赖它,往里乱装包迟早把系统搞坏。Miniconda装完,自己的项目环境全在conda里,互不干扰:
bash Miniconda3-latest-Linux-x86_64.sh # 一路回车,最后yes让conda初始化进.bashrc conda config --set auto_activate_base false5.2 ROS Noetic、Docker、conda的安装节奏
Ubuntu 20.04是ROS Noetic的官方对应版本,这也是很多人选20.04而不是更新的24.04的原因——Noetic是ROS 1的最后一个长期版本,一大堆机器人和SLAM的项目(ORB-SLAM3这类)都是基于它做的。
装ROS Noetic:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install -y ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrcdesktop-full包含RViz、Gazebo、导航栈,装完大概5到8GB。之后还要初始化rosdep:
sudo apt install -y python3-rosdep python3-rosinstall python3-rosinstall-generator \ python3-wstool build-essential sudo rosdep init rosdep updaterosdep update这一步在网络条件不好的时候会反复超时,多试几次,或者换个时段跑。国内有不少镜像方案,可以按需折腾。
Docker的装法,追求省事直接apt:
sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker $USER最后一行是把当前用户加进docker组,免得每条命令都敲sudo。加完要重新登录(或者newgrp docker)才生效。验证:
docker run hello-world装Docker的时候会顺带拉一堆依赖,磁盘占用不小,小容量分区要注意。另外Docker默认把镜像存在/var/lib/docker,如果根分区紧张,可以改到/home下的大分区,在/etc/docker/daemon.json里配>sudo blkid | grep ntfs
拿到UUID之后,建挂载点、写入fstab实现开机自动挂载:
sudo mkdir -p /mnt/windows sudo nano /etc/fstab加一行:
UUID=1234ABCD5678EFGH /mnt/windows ntfs-3g defaults,uid=1000,gid=1000,umask=022,nofail 0 0uid和gid填你自己的(id -u查),这样挂载后普通用户能读写。umask=022让权限是755,文件所有者可写。nofail很关键——万一哪天这个分区被删了或者UUID变了,没有nofail的话系统会卡在启动的紧急模式里。
然后是那个几乎人人都会踩的坑:挂载报错。
The disk contains an unclean file system (0, 0). Metadata kept in Windows cache, refused to mount.原因就是Windows的快速启动。开了快速启动的Windows,关机时其实是"混合休眠",NTFS分区里会留一个休眠映像,文件系统处于"脏"状态。Linux为了防止数据损坏,拒绝以读写方式挂载,只能只读。
解决方式是在Windows里彻底关掉快速启动:控制面板 → 电源选项 → 选择电源按钮的功能 → 更改当前不可用的设置 → 取消勾选"启用快速启动",保存。然后从Windows里真正关机(不是重启,重启不走快速启动)。
如果一时半会改不了,Linux这边可以强制清理脏标志:
sudo ntfsfix /dev/nvme0n1p3ntfsfix只做最小化的修复,清掉日志和脏标志,让分区能挂载。它不是chkdsk的替代品,别指望它修真实的文件系统错误。真有问题还是回Windows跑chkdsk /f。
提示:如果你打算在Ubuntu里写Windows分区的文件,最安全的做法是让Windows那边真的关机而不是休眠。同时建议在Ubuntu挂载时加
noatime选项,减少不必要的写入,对移动硬盘和SSD都友好。
还有BitLocker的问题。现在的笔记本很多默认开着"设备加密",也就是BitLocker。装Ubuntu之后,Windows可能因为检测到启动配置变化而进入恢复模式,要求输入48位恢复密钥。密钥在你微软账户的"设备"页面里能找到。为了避免麻烦,装双系统之前先在Windows里查一下加密状态:
manage-bde -status如果显示"保护已开启",要么把恢复密钥备份好,要么干脆先关掉加密(manage-bde -off C:,解密过程可能要一两个小时),装完再考虑开不开。
最后补一个实际使用中的经验:不要把Windows的分区直接当成日常工作的存放地点。跨系统的文件写入性能不如原生分区,而且一旦哪个系统崩了需要重装,数据纠缠在一起处理起来很麻烦。我自己的习惯是另接一块移动SSD,格式化成exFAT——Windows、Ubuntu、macOS都能读写,作为两个系统之间的中转站和数据备份盘,省心得多。启用nofail挂载选项,插上就自动出现,拔下来不影响开机,这套配置用了两年多,没出过一次问题。