Important
This project is in maintenance mode.
Active development has been consolidated at Ubuntu Desktop Provision.
Ubuntu Desktop Installer
License: GNU General Public License v3.0
Important
This project is in maintenance mode.
Active development has been consolidated at Ubuntu Desktop Provision.
The design for screen n°9, Choose a Security Key
Design details https://people.canonical.com/~platform/desktop/installer/9.%20Choose%20a%20Security%20Key/
Trying install from ISO in https://cdimage.ubuntu.com/daily-canary/current/ dated 2021-07-03 10:30 the window -select keyboard- is empty and if i click on continue also the window -allocate disk space- is empty. can not continue with install.
Currently, to install Ubuntu with an encrypted /boot is necessary to run this before the bootloader is installed:
while [ ! -d /target/etc/default/grub.d ]; do sleep 1; done; echo "GRUB_ENABLE_CRYPTODISK=y" > /target/etc/default/grub
Otherwise, the installation will crash.
Will the new installer be usable by sight-impaired users ? Just raising the issue, since articles online say that Flutter doesn't produce HTML that adheres to accessibility standards. I'm not impaired myself, and I don't know what kind of "reader" a person could use to handle doing an install. How do sight-impaired people do an Ubuntu install today ? Use a char-mode installer ?
Hi, I want to contribute to this project, is there any guide or a roadmap?
"installThirdPartyTitle": "Install third-party software for graphics and Wi-Fi hardware and additional media formats",
Generally we try not to this and that and the other
in English, but prefer commas. So, this would be preferable.
"installThirdPartyTitle": "Install third-party software for graphics, Wi-Fi hardware, and additional media formats",
The design for screen n°1, Choose Language
Design details https://people.canonical.com/~platform/desktop/installer/1.%20Choose%20Language/
The design for screen n°14, Who Are You
Design details https://people.canonical.com/~platform/desktop/installer/14.%20Who%20Are%20You/
══╡ EXCEPTION CAUGHT BY GESTURE
╞═══════════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
Could not find a generator for route RouteSettings("/tryubuntu", null) in the
_WidgetsAppState.
Make sure your root app widget has provided a way to generate
this route.
Generators for routes are searched for in the following order:
1. For the "/" route, the "home" property, if non-null, is used.
2. Otherwise, the "routes" table is used, if it has an entry for the route.
3. Otherwise, onGenerateRoute is called. It should return a non-null value for
any valid route not
handled by "home" and "routes".
4. Finally if all else fails onUnknownRoute is called.
Unfortunately, onUnknownRoute was not set.
When the exception was thrown, this was the stack:
#0 _WidgetsAppState._onUnknownRoute.<anonymous closure>
(package:flutter/src/widgets/app.dart:1219:9)
#1 _WidgetsAppState._onUnknownRoute
(package:flutter/src/widgets/app.dart:1234:6)
#2 NavigatorState._routeNamed
(package:flutter/src/widgets/navigator.dart:4148:37)
#3 NavigatorState.pushNamed
(package:flutter/src/widgets/navigator.dart:4190:20)
#4 Navigator.pushNamed (package:flutter/src/widgets/navigator.dart:1726:34)
#5 TryOrInstallPageState.continueWithSelectedOption
(package:ubuntu_desktop_installer/tryorinstallpage.dart:153:17)
#6 _InkResponseState._handleTap
(package:flutter/src/material/ink_well.dart:991:20)
#7 GestureRecognizer.invokeCallback
(package:flutter/src/gestures/recognizer.dart:182:24)
#8 TapGestureRecognizer.handleTapUp
(package:flutter/src/gestures/tap.dart:607:11)
#9 BaseTapGestureRecognizer._checkUp
(package:flutter/src/gestures/tap.dart:296:5)
#10 BaseTapGestureRecognizer.handlePrimaryPointer
(package:flutter/src/gestures/tap.dart:230:7)
#11 PrimaryPointerGestureRecognizer.handleEvent
(package:flutter/src/gestures/recognizer.dart:475:9)
#12 PointerRouter._dispatch
(package:flutter/src/gestures/pointer_router.dart:93:12)
#13 PointerRouter._dispatchEventToRoutes.<anonymous closure>
(package:flutter/src/gestures/pointer_router.dart:138:9)
#14 _LinkedHashMapMixin.forEach
(dart:collection-patch/compact_hash.dart:397:8)
#15 PointerRouter._dispatchEventToRoutes
(package:flutter/src/gestures/pointer_router.dart:136:18)
#16 PointerRouter.route
(package:flutter/src/gestures/pointer_router.dart:122:7)
#17 GestureBinding.handleEvent
(package:flutter/src/gestures/binding.dart:381:19)
#18 GestureBinding.dispatchEvent
(package:flutter/src/gestures/binding.dart:361:22)
#19 RendererBinding.dispatchEvent
(package:flutter/src/rendering/binding.dart:278:11)
#20 GestureBinding._handlePointerEventImmediately
(package:flutter/src/gestures/binding.dart:316:7)
#21 GestureBinding.handlePointerEvent
(package:flutter/src/gestures/binding.dart:280:5)
#22 GestureBinding._flushPointerEventQueue
(package:flutter/src/gestures/binding.dart:238:7)
#23 GestureBinding._handlePointerDataPacket
(package:flutter/src/gestures/binding.dart:221:7)
#27 _invoke1 (dart:ui/hooks.dart:180:10)
#28 PlatformDispatcher._dispatchPointerDataPacket
(dart:ui/platform_dispatcher.dart:276:7)
#29 _dispatchPointerDataPacket (dart:ui/hooks.dart:96:31)
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer:
TapGestureRecognizer#84574
════════════════════════════════════════════════════════════════════════════════
════════════════════
Could we eventually create some kind of indicator for the page index or some sort of orb indicator like so
?
Easy code snippet
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: snapshot.data!.map((url) {
int index = snapshot.data!.indexOf(url);
return Container(
width: 10,
height: 10,
margin: EdgeInsets.symmetric(
vertical: 10.0, horizontal: 10.0),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: _current == index
? Theme.of(context)
.primaryColor
.withAlpha(180)
: Theme.of(context)
.primaryColor
.withAlpha(60),
),
);
}).toList(),
)
It could be either be put into the wizard page, or into the AppBar - or? Any other suggestions? :)
@madsrh @long-chung
Idea by @Muqtxdir
The AppBar looks kind of too prominent for a desktop app and also different to the design slides.
Muq's idea was to reduce the shadow for the AppBar in all WizardPages, which is doable with setting elevation: 1
WDYT @long-chung @jpnurmi @oSoMoN ?
The design for screen n°8, Installation Type
Design details https://people.canonical.com/~platform/desktop/installer/8.%20Installation%20Type/
The design for screen n°10, Turn Off BitLocker
Design details https://people.canonical.com/~platform/desktop/installer/10.%20Turn%20Off%20BitLocker/
The design for screen n°13, Where Are You
Design details https://people.canonical.com/~platform/desktop/installer/13.%20Where%20Are%20You/
Currently, /etc/crypyttab is not automatically configured when Ubuntu is installed (through manual partitioning) on a LVM scheme that was previously set up.
With the current (old) installer, Ubuntu creates /swapfile
even when during installation the drive is formatted as BTRFS.
But this will show an error in syslog and the swapfile will not be used since btrfs does not allow a swapfile.
This means swap is disabled when Ubuntu is installed with btrfs filesystem.
As far as I know, all best practices around swapfile and btrfs point to:
@
and @home
subvolumes and properly configures them in /etc/fstab
chattr +c
.With the new installer, please at least prevent the /swapfile
from being created if filesystem is btrfs. Also please consider configuring swap for btrfs.
Full disk encryption with LUKS (2004) became the privacy solution after eCryptfs (2006) was removed in Ubuntu 18.04 for reasons. fscrypt
(2017) was recommended in the Ubuntu 18.04 release notes, although it was not ready yet at the time. From kernel v5.4 onwards, it is ready.
Not everyone agrees that encrypting the entire disk is the best alternative. Some have families and like to share a laptop, perhaps even with an unprivileged password-less guest account, and family members want to encrypt their home with a personal password for privacy reasons and data protection against theft. Others simply prefer a more lightweight solution than encrypting an entire system just to protect their documents. Or some people might want to use Wake On Lan or Automatically Restart After Power Loss, which would not work using LUKS and the requirement to enter a boot password.
I recommend we re-introduce (the option to choose) home-only encryption using fscrypt
. The Ubuntu-Desktop-Installer is making use of the Google-maintained Flutter SDK, so I don't think there is any objection against using the Google-maintained fscrypt
.
Encryption options:
Steps that would need to be scripted:
apt install fscrypt libpam-fscrypt
fscrypt setup
fscrypt setup /
fscrypt setup /home ## only if home is on a separate partition
fscrypt encrypt /home/$USERNAME
Keep in mind that the fscrypt packages on the Ubuntu repositories are outdated. For testing an fscrypt
, for now you need to compile a recent version yourself. See: https://bugs.launchpad.net/ubuntu/+source/fscrypt/+bug/1882993
Fscrypt ext4 native encryption documented on Kernel.org
https://www.kernel.org/doc/html/v5.4/filesystems/fscrypt.html
Build instructions
https://github.com/google/fscrypt#fscrypt-
Fscrypt on Arch Linux
https://wiki.archlinux.org/index.php/Fscrypt
Ubiquity bug report
https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1842417
I have read some of the code and I can see that the old technique is being used for localization. whereas the new technique is much easier to use and it will reduce the overall complexity.
I propose to implement localization (using a new technique). If you approve this proposal then do comment so I will create a PR.
Hello,
I'd like to translate the brand new installer but I'm not confident with the way translations are handled.
Would it be possible to use an interface like launchpad or a weblate instance?
I was able to find out that it is based on some Ubuntu server installer. And build with Flutter, but that is it.
Articles suggest people can try it out in 21.10. Is this true? Is there a compiled version shipped with the daily build? Can I try this with 21.04? What is the difference between "run" and "live run" the readme on how to run it is incomplete and confusing.
I have seen some things that suggest the fucked up manual partitioning has finally been fixed with options disk space to be free for other partitions or something like that. I just tried installing Kubuntu and the installer got ever worse. I had issues for years with the "partion for encrytion" or whatever that option is called. It's not working AT ALL. Going back gives an error about not being able to tot create keyfile or something. I have bad memories of this thing for years as it always had issues. But at least after retries, I was able to manually install a more sane installation without the LVM and swap ...
Also curious about, will it be able to deal with the completely outdated install structure for full disk encryption? Why is Ubuntu still creating a separate /boot partition that is NOT encrypted? I currently have SUSE installed and Grub is able to decrypt the partition it boots from, for years now. And the installer simply creates a SINGLE partition fully encrypted, the way it should be! Ubuntu not only creates a stupid unencrypted boot and has no option for free space and manual was always a pain if it even works at all, it also creates a stupid LVM and swap partition. First nobody with a desktop PC or a good laptop with 16 or 32 gigs of ram even needs swap. Also there is swap files that are not slower for many years also and much simpler. Apparently, everyone says that LVM is great for resizing. Funny thing is I just tried to resize with KDE partition tool and Gparted and they both are NOT able to resize the LVM BS Ubuntu created. Yet I know I used one GUI tool to dead simple resize an ext4 inside LUKS created with a manual installation.
I hope this installer brings a more modern install structure to Ubuntu, at least manually in a non-annoying easy way.
Also what about LUKS 2? Will it use LUKS 2 by default? I read about Grub being able to handle it now. So the installation should simply create a single partition in a single LUKS container and optionally create a swap FILE. And of course you should simply enter the size you want your Ubuntu install to take on the disk and the installer should simply leave empty space in the disk for you to partition to your liking. It's really mind-boggling how horrible the Ubuntu installer is. I really like (K)ubuntu and want to move back to it, but my test install on an HDD already made me angry.
This server installer can I use it to install a Desktop system?
The design for screen n°17, Installation Complete
Design details https://people.canonical.com/~platform/desktop/installer/17.%20Installation%20Complete/
Everybody loves the "new" settings option where the user can switch between the default, light or dark theme.
I think it would be great if this option was presented to the user during the install.
The design for screen n°15, Configure Active Directory
Design details https://people.canonical.com/~platform/desktop/installer/15.%20Configure%20Active%20Directory/
This is useful for:
Currently is possible to do this, but the user needs to choose the "manual partitioning" option: https://askubuntu.com/a/1247047
With an option in the Installation Type screen, an inexperienced user could achieve this without having to manually create the partition scheme.
I know it's a little silly to land an issue of a UI problem this early, but it comes with thte intention to land a PR(using url_launcher already includeded in the dependencies) to fix it.
And to ask for guidelines or roadmap to help this project (#8 ), as this would be a huge success to flutter if accomplished.
Problem:
In the try or install screen the release notes link does not change mouse cursor on hover:
It feels like those 200 warnings will eventually never be fixed - so is it really needed to include this warning mechanism?
The design for screen n°16, Installation Slides
Design details https://people.canonical.com/~platform/desktop/installer/16.%20Installation%20Slides/
I wanted to remove the installer but I can't find any tutorial about removing it.
I don't know if this should be in installer or welcome or after first boot of new system, but:
Ask if other users will use the machine, and either create those users or give pointer to how to create them.
Ask about things that will used with machine: smartphone, printer, Bluetooth devices, etc.
Ask what DE user wants, if multiple are available.
Let user choose apps to install. Show the defaults already checked, but let the user un-check them and select others if desired.
Ask if user is coming from Windows, and if so, try to offer mappings of Windows apps to Linux apps. E.g. if you used Photoshop on Windows, maybe try GIMP on Linux.
If user is coming from Windows, install NTFS and exFAT utilities.
Ask if user wants to use only FOSS software, or all kinds of software. Configure repos and software manager accordingly.
Ask if user wants to enable use of Flatpaks, Snaps, Docker. Configure repos and software manager accordingly, install any packages needed.
Thanks.
The design for screen n°14, Who Are You
Design details https://people.canonical.com/~platform/desktop/installer/14.%20Who%20Are%20You/
The design for screen n°3, Turn Off RST
Design details https://people.canonical.com/~platform/desktop/installer/3.%20Turn%20Off%20RST/
I followed the guide step by step and this happens.
Are there any instructions missing?
The design for screen n°4, Keyboard
Design details https://people.canonical.com/~platform/desktop/installer/4.%20Keyboard/
I run all of the commands to checkout and run on the README, but once I run flutter run
, it gives me an error:
CMake Error at flutter/generated_plugins.cmake:12 (add_subdirectory):
add_subdirectory given source
"flutter/ephemeral/.plugin_symlinks/url_launcher_linux/linux" which is not
an existing directory.
Call Stack (most recent call first):
CMakeLists.txt:59 (include)
Building Linux application...
Exception: Unable to generate build files
My OS: Ubuntu Focal 20.04.2 LTS
Since subiquity is also used in the WSL setup wizard and the UI design is similar it makes sense to host is as part of the installer, as another binary maybe though?
The design for those pages is on https://people.canonical.com/~platform/desktop/installer/WSL
The design for screen n°7, Turn Off Secure Boot
Design details https://people.canonical.com/~platform/desktop/installer/7.%20Turn%20Off%20Secure%20Boot/
The design for screen n°6, Updates and other software
Design details https://people.canonical.com/~platform/desktop/installer/6.%20Updates%20and%20Other%20Software/
The proposal is to move routing logic out of wizard pages so that individual pages wouldn't have to care about what comes next.
Requirements:
Example: flutter_wizard_example
Wizard.of(context).next()
to request the next page.Any thoughts?
The design for screen n°2, installation type
Design details https://people.canonical.com/~platform/desktop/installer/2.%20Installation%20Type/
The design for screen n°12, Write Changes to Disk
Design details https://people.canonical.com/~platform/desktop/installer/12.%20Write%20Changes%20to%20Disk/
The design for screen n°5, Connect to Internet
Design details https://people.canonical.com/~platform/desktop/installer/5.%20Connect%20to%20Internet/
First of all thanks for trying Flutter as the new Ubuntu Desktop Installer. Really cool to see Canonical choosing an "hype" framework for a product which most Linux users trash about being bloat.
Looking into the UI code, it seems that there are missing commas on the end of widget declaration, which is a standard on code quality, embraced by the Flutter community. Also some widget files declare constant UI property values and others don't, which is a bummer when updating the code, when in need.
The analysis_options.yaml
file also seems to be lacking linter rules, is there a reason for this?
Also, the UI code seems to be growing for an all in one folder pattern. Why not prepare guidelines for structuring folders and files for the UI?
'Ubuntu Desktop installer smoke tests' is currently failing due to the following deprecation:
https://api.flutter.dev/flutter/widgets/BuildContext/inheritFromWidgetOfExactType.html
Output:
00:06 +0: loading /home/marcustomlinson/Projects/flutter/ubuntu-desktop-installer/ubuntu_desktop_installer/test/widget_test.dart ../../../../snap/flutter/common/flutter/.pub-cache/hosted/pub.dartlang.org/chewie_audio-1.1.1/lib/src/chewie_player.dart:99:17: Error: The method 'inheritFromWidgetOfExactType'
isn't defined for the class 'BuildContext'.
- 'BuildContext' is from 'package:flutter/src/widgets/framework.dart' ('../../../../snap/flutter/common/flutter/packages/flutter/lib/src/widgets/framework.dart').
Try correcting the name to the name of an existing method, or defining a method named 'inheritFromWidgetOfExactType'.
context.inheritFromWidgetOfExactType(_ChewieAudioControllerProvider) as _ChewieAudioControllerProvider;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
../../../../snap/flutter/common/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.19.2+1/lib/src/picture_provider.dart:57:59: Error: No named parameter with the name
'nullOk'.
context != null ? Localizations.localeOf(context, nullOk: true) : null,
^^^^^^
../../../../snap/flutter/common/flutter/packages/flutter/lib/src/widgets/localizations.dart:413:17: Context: Found this candidate, but the arguments don't match.
static Locale localeOf(BuildContext context) {
^^^^^^^^
00:09 +0 -1: loading /home/marcustomlinson/Projects/flutter/ubuntu-desktop-installer/ubuntu_desktop_installer/test/widget_test.dart [E]
Failed to load "/home/marcustomlinson/Projects/flutter/ubuntu-desktop-installer/ubuntu_desktop_installer/test/widget_test.dart":
Compilation failed
Test: /home/marcustomlinson/Projects/flutter/ubuntu-desktop-installer/ubuntu_desktop_installer/test/widget_test.dart
Shell: /home/marcustomlinson/snap/flutter/common/flutter/bin/cache/artifacts/engine/linux-x64/flutter_tester
00:09 +0 -1: Some tests failed.
The design for screen n°11, Allocate Disk Space
Design details https://people.canonical.com/~platform/desktop/installer/11.%20Allocate%20Disk%20Space/
Allow to set-up an Unattended Installation config file. In the example below you will find some Idea for the new Installation manager.
It should be possible to place a config file into root of certain partition of any drive attached to the computer
This config File should allow to set-up the whole Installation and some additionals
e.g.
[SystemHardware]
\\ how to choose the disks - [SATA, IDE, HD, SSD, NVME, NETWORK]
\\ add seperated by ; ]MIN, MAX, BOOT] as additonal help for choosing the disk
BootDisk: \\ e.g. SSD;BOOT
EFIDisk: \\ e.g. SSD;BOOT (Special case AUTO)
SystemDisk: \\ e.g. SSD;MAX
HomeDisk: \\ e.g. SSD;MAX
[System]
TimeDate: \\ IP or Hostname to an NTP to set Bios Time and Date correctly
Swap: \\ [AutoPartition, AutoFile, /Path/to/file.swap]
BootSize: \\ [AutoSize, nn [GB, GiB, MB, MiB]
\\ MIN = recomended Size, MAX = maximal possible diskspace (respecting recomended and auto sizes),
SystemSize: \\ [AutoSize, MIN,MAX, nn [GB, GiB, MB, MiB]
HomeSize: \\ [AutoSize, MIN,MAX, nn [GB, GiB, MB, MiB]
[Customize System]
UnattendedUpdate: \\ [YES,NO,IMPORTANT]
RootScript: \\ run after installation
InstallAdd: \\ apt or snap name to install package separated by space
InstallPurge:\\ apt or snap name to remove separated by space
[RootUser]
\\ With UserProfile (optional) you could setup root-acces by a home Image (Systemd-homed) or by a config file
\\ Otherwise set basic information here
\\ UserProfile:
Name: root
TimeZone: Europe/Zurich
Language: de_CH
Keyboard: de_DE
\\ Path to an encrypted file (PGP, Veracrypt, Luks) or Webressource (imaps:// , ssh:// , smb:// LDAP://)
\\ e.g. ssh:// user:Hostname
\\ On first login as root this ressource get checked. If login is sucessfull the password you used will be set as root password.
\\ Use ; to add fallback ressources
Password:
\\ check rootpassword against this ressource continously: NO [NO, YES,]
AutoUpdatePassword:
[Home]
UserHome: \\ Directory containing the Userdata (Direcories or encrypted Images) If var HomeDisk is set, It get mounted as this directory
UserHomeSkel: \\Preset home for new Users (Directory or Script)
Coming from Ubiquity, we couldn't set the strength level required for the disk encryption (LUKS). I need to be able to bring this from a documentation policy to a hard policy set in the preseed if possible.
It would be useful to have an optional preview of the partition content (files, directories) within the partition dialog.
From the partition content you can quickly see whether it is really the desired partition (for deletion, formatting, etc.) and you have not mixed up something.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.