diff --git a/Install.ps1 b/Install.ps1 index dd76e0a..f18ed52 100644 --- a/Install.ps1 +++ b/Install.ps1 @@ -1,8 +1,8 @@ param ( - [Parameter(Mandatory=$true)] + [Parameter(Mandatory=$false)] [string]$DistroName = "Arch", - [Parameter(Mandatory=$true)] + [Parameter(Mandatory=$false)] [string]$Username = "user" ) @@ -11,7 +11,7 @@ Write-Host "Distribution: $DistroName" -ForegroundColor Yellow Write-Host "Username: $Username" -ForegroundColor Yellow Write-Host "" -# Check if the specified distro exists - improved detection +# Check if the specified distro exists $wslDistros = (wsl --list) -replace "`0", "" | ForEach-Object { $_.Trim() } $distroExists = $false foreach ($line in $wslDistros) { @@ -29,6 +29,29 @@ if (-not $distroExists) { # Path to current repository $RepoPath = Get-Location +# Function to replace placeholder values in configuration files +function Update-ConfigFile { + param ( + [string]$SourcePath, + [string]$DestinationPath, + [hashtable]$Replacements + ) + + if (-not (Test-Path $SourcePath)) { + Write-Warning "Source file not found: $SourcePath" + return + } + + $content = Get-Content -Path $SourcePath -Raw + + foreach ($key in $Replacements.Keys) { + $content = $content -replace $key, $Replacements[$key] + } + + Set-Content -Path $DestinationPath -Value $content -Force + Write-Host "Updated configuration in: $DestinationPath" -ForegroundColor Green +} + Write-Host "Step 1: Initial Setup..." -ForegroundColor Green wsl -d $DistroName -u root bash -c "/usr/lib/wsl/first-setup.sh" wsl -d $DistroName -u root bash -c "pacman -Syu --noconfirm" @@ -58,7 +81,12 @@ wsl -d $DistroName -u root bash -c "echo '$Username ALL=(ALL) ALL' > /etc/sudoer # Configure WSL default user Write-Host "Configuring WSL default user..." -ForegroundColor Yellow -Copy-Item -Path "$RepoPath\wsl\etc\wsl.conf" -Destination "\\wsl$\$DistroName\etc\wsl.conf" -Force +$wslConfReplacements = @{ + "default=user" = "default=$Username" +} +$tempWslConf = Join-Path $env:TEMP "wsl.conf" +Update-ConfigFile -SourcePath "$RepoPath\wsl\etc\wsl.conf" -DestinationPath $tempWslConf -Replacements $wslConfReplacements +Copy-Item -Path $tempWslConf -Destination "\\wsl$\$DistroName\etc\wsl.conf" -Force wsl -d $DistroName -u root bash -c "dos2unix /etc/wsl.conf" Write-Host "Step 3: AUR helper and SSH bridge setup..." -ForegroundColor Green @@ -71,9 +99,61 @@ wsl -d $DistroName -u $Username bash -c "paru -S --noconfirm wsl2-ssh-agent" # Create .ssh directory wsl -d $DistroName -u $Username bash -c "mkdir -p ~/.ssh" -Write-Host "Step 4: Copying configuration files..." -ForegroundColor Green -# Copy all configuration files from the repository to WSL -Get-ChildItem -Path "$RepoPath\wsl" -Exclude "etc" | ForEach-Object { +Write-Host "Step 4: Copying and updating configuration files..." -ForegroundColor Green + +# Create temp directory for modified configs +$tempConfigDir = Join-Path $env:TEMP "wsl-configs" +if (Test-Path $tempConfigDir) { + Remove-Item -Path $tempConfigDir -Recurse -Force +} +New-Item -Path $tempConfigDir -ItemType Directory -Force | Out-Null + +# Process and copy WezTerm config if it exists +$weztermSourcePath = "$RepoPath\windows\.wezterm.lua" +if (Test-Path $weztermSourcePath) { + $weztermDestPath = Join-Path $tempConfigDir ".wezterm.lua" + $weztermReplacements = @{ + 'default_domain = "WSL:Arch"' = "default_domain = `"WSL:$DistroName`"" + } + Update-ConfigFile -SourcePath $weztermSourcePath -DestinationPath $weztermDestPath -Replacements $weztermReplacements + Copy-Item -Path $weztermDestPath -Destination "$HOME\.wezterm.lua" -Force +} + +# Process and copy all other configuration files from the repository to WSL +# First copy to temp directory with replacements +Get-ChildItem -Path "$RepoPath\wsl" -Exclude "etc" -Recurse -File | ForEach-Object { + $relativePath = $_.FullName.Substring("$RepoPath\wsl".Length) + $destPath = Join-Path $tempConfigDir $relativePath + $destDir = Split-Path -Parent $destPath + + if (-not (Test-Path $destDir)) { + New-Item -Path $destDir -ItemType Directory -Force | Out-Null + } + + # Check and replace content if needed based on file type/path + $content = Get-Content -Path $_.FullName -Raw -ErrorAction SilentlyContinue + $needsReplacement = $false + + # Check if content contains references to default user or distro name + if ($content -match "user" -or $content -match "Arch") { + $needsReplacement = $true + # Replace username in configuration files + $content = $content -replace "\buser\b", $Username + # Replace distro name in configuration files + $content = $content -replace "\bArch\b", $DistroName + } + + if ($needsReplacement) { + Set-Content -Path $destPath -Value $content -Force + Write-Host "Updated configuration in: $relativePath" -ForegroundColor Green + } else { + Copy-Item -Path $_.FullName -Destination $destPath -Force + } +} + +# Now copy everything to WSL +Write-Host "Copying updated configuration files to WSL..." -ForegroundColor Yellow +Get-ChildItem -Path $tempConfigDir | ForEach-Object { Copy-Item -Path $_.FullName -Destination "\\wsl$\$DistroName\home\$Username" -Recurse -Force } @@ -97,4 +177,6 @@ wsl --shutdown Write-Host "===== Setup Complete! =====" -ForegroundColor Cyan Write-Host "You can now launch your WSL instance with: wsl -d $DistroName" -ForegroundColor Green -Write-Host "Remember to install Tmux plugins by pressing Ctrl+Space, Shift+I when in Tmux" -ForegroundColor Green \ No newline at end of file +Write-Host "Remember to install Tmux plugins by pressing Ctrl+Space, Shift+I when in Tmux" -ForegroundColor Green +Write-Host "Edit tmux.conf (~/.config/tmux/tmux.conf) to specify which disk will be displayed in the status bar." +Write-Host "The recommended way to use this WSL setup is through WezTerm. After all configurations are complete, launch WezTerm and you should see tmux running with 3 panes automatically." \ No newline at end of file diff --git a/README.md b/README.md index 48c1988..2af7139 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ My minimal setup for Arch Linux development environment optimized for WSL2, desi ## Features -Rice Showcase +Rice Showcase ### Core Components @@ -36,11 +36,6 @@ My minimal setup for Arch Linux development environment optimized for WSL2, desi > Note: WSL2 is configured to use up to 16GB of RAM in this setup (can be adjusted in [.wslconfig](./windows/.wslconfig)) -> Note: Throughout this guide, we'll use: -> -> - Distribution name: `Arch` (if you choose a different name, update it in WezTerm config under `default_domain = "WSL:Arch"`) -> - Username: `user` (if you want a different username, update relevant configs like `./wsl/etc/wsl.conf`) - ### 1. Windows Host Setup ```powershell @@ -51,7 +46,7 @@ winget install wezterm git clone https://github.com/xzeldon/dotfiles-wsl2 cd dotfiles-wsl2 -# Copy Windows configs (THIS OVERWRITE IF FILES EXISTS!) +# Copy Windows configs (THIS WILL OVERWRITE FILES IF THEY EXIST!) Copy-Item -Path ".\windows\*" -Destination $HOME -Force -Recurse ``` @@ -79,108 +74,126 @@ wsl --import Arch D:\wsl\Arch "D:\Downloads\archlinux-latest.wsl" ### 3. System Configuration -
-Initial Setup +#### Automatic Setup Script (Recommended) -```bash -# Run first-time setup -/usr/lib/wsl/first-setup.sh - -# Update system -pacman -Syu - -# Install dependencies -pacman -S sudo git vim neovim openssh wget binutils less debugedit fakeroot \ - fastfetch starship exa fish tmux htop python base-devel go dos2unix -``` - -
- -
-User Configuration - -```bash -# Set root user password -passwd - -# Configure locale -echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen -locale-gen - -# Create user -useradd -m user -# Set user password -passwd user - -# Configure sudo -echo "user ALL=(ALL) ALL" >> /etc/sudoers.d/user - -# Configure WSL default user - -# On Windows (PowerShell): -# Assuming: -# - You're in the repository root directory -# - Your WSL distribution is named "Arch" (from section 2.2) -# Copy WSL configuration file from host to guest -cp .\wsl\etc\wsl.conf \\wsl.localhost\Arch\etc\wsl.conf - -# In WSL (Arch Linux): -# Convert line endings from Windows (CRLF) to Unix (LF) format -dos2unix /etc/wsl.conf - -# On Windows (PowerShell): -# Restart WSL to apply changes -wsl --shutdown -``` - -
- -
-Aur helper and ssh bridge - -```bash -# Install AUR helper -git clone https://aur.archlinux.org/paru-bin.git -cd paru-bin -makepkg -si - -# Install agent for ssh bridge (see: https://wiki.archlinux.org/title/Install_Arch_Linux_on_WSL#Bridge_the_ssh-agent_service_from_Windows) -paru -S wsl2-ssh-agent - -# Create .ssh directory (this not exists by default, but required for wsl2-ssh-agent) -mkdir ~/.ssh -``` - -
- -
-Copy Configuration Files - -You need to copy all configuration files from the repository to your WSL environment: - -From powershell: +The repository includes an automated setup script that performs all the configuration steps described in the manual setup. ```powershell -# Assuming you're in the repo directory, `Arch` is a WSL distribution name (from 2.2) and arch username is `user` -Copy-Item -Path .\wsl\* -Destination \\wsl.localhost\Arch\home\user -Recurse -Force -Exclude "etc" +# Run the setup script with default values (Distribution: "Arch", Username: "user") +.\Install.ps1 + +# Or specify your own distribution name and username +.\Install.ps1 -DistroName "YourDistroName" -Username "yourusername" ``` -
+#### ⚠️ Important Notes About Automatic Setup -
-Tmux configuration +- **Error Handling**: The script does not comprehensively handle all possible errors. If something goes wrong (e.g., incorrect password confirmation, package installation failures), the script will continue execution regardless. +- **Network Requirements**: A stable internet connection is required. Using VPNs or proxies is not recommended due to WSL networking limitations. +- **User Interaction**: You will need to enter passwords for the root and user accounts during script execution. -```bash -# Install Tmux Plugin Manager -git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm +After the script completes: -# Start tmux and install plugins -tmux # Then press Ctrl+Space, Shift+I -``` +1. Start your WSL distribution: `wsl -d YourDistroName` +2. Open tmux and install plugins by pressing `Ctrl+Space` followed by `Shift+I` +3. Edit [tmux.conf](./wsl/.config/tmux/tmux.conf) to specify which disk will be displayed in the status bar. +4. The recommended way to use this WSL setup is through WezTerm. After all configurations are complete, launch WezTerm and you should see tmux running with 3 panes automatically. -
+#### Manual Setup -> Tip: edit [tmux.conf](./wsl/.config/tmux/tmux.conf) to change disk in status bar +> ⚠️ Note: Throughout this guide, we'll use: +> +> - Distribution name: `Arch` (if you choose a different name, update it in WezTerm config under `default_domain = "WSL:Arch"`) +> - Username: `user` (if you want a different username, update relevant configs like `./wsl/etc/wsl.conf`) + +If you prefer a manual setup or need more control over the installation process, follow these steps: + +1. **Initial System Setup** + + ```bash + # Run first-time setup + /usr/lib/wsl/first-setup.sh + + # Update system + pacman -Syu + + # Install dependencies + pacman -S sudo git vim neovim openssh wget binutils less debugedit fakeroot \ + fastfetch starship exa fish tmux htop python base-devel go dos2unix + ``` + +2. **User Configuration** + + ```bash + # Set root user password + passwd + + # Configure locale + echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen + locale-gen + + # Create user + useradd -m user + + # Set user password + passwd user + + # Configure sudo + echo "user ALL=(ALL) ALL" >> /etc/sudoers.d/user + ``` + +3. **WSL Configuration** + + ```bash + # On Windows (PowerShell): + # Assuming: + # - You're in the repository root directory + # - Your WSL distribution is named "Arch" (from section 2.2) + # Copy WSL configuration file from host to guest + cp .\wsl\etc\wsl.conf \\wsl.localhost\Arch\etc\wsl.conf + + # In WSL (Arch Linux): + # Convert line endings from Windows (CRLF) to Unix (LF) format + dos2unix /etc/wsl.conf + + # On Windows (PowerShell): + # Restart WSL to apply changes + wsl --shutdown + ``` + +4. **AUR Helper and SSH Bridge Setup** + + ```bash + # Install AUR helper + git clone https://aur.archlinux.org/paru-bin.git + cd paru-bin + makepkg -si + + # Install agent for ssh bridge + # (see: https://wiki.archlinux.org/title/Install_Arch_Linux_on_WSL#Bridge_the_ssh-agent_service_from_Windows) + paru -S wsl2-ssh-agent + + # Create .ssh directory (this does not exist by default, but is required for wsl2-ssh-agent) + mkdir ~/.ssh + ``` + +5. **Copy Configuration Files** + + ```powershell + # From Windows PowerShell: + # Assuming you're in the repo directory, `Arch` is your WSL distribution name and username is `user` + Copy-Item -Path .\wsl\* -Destination \\wsl.localhost\Arch\home\user -Recurse -Force -Exclude "etc" + ``` + +6. **Tmux Setup** + + ```bash + # Install Tmux Plugin Manager + git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm + + # Start tmux and install plugins + tmux # Then press Ctrl+Space, Shift+I + ``` ## Configuration