105

Running bash on windows 10, the simple syntax below works when I SSH to my webserver, but not when I exit out and am on my local machine. It doesn't give me an error, but I can see permissions are unchanged. I have to checked that I am set up as an administrator on my computer. Is this an error or is this just a consequence of the local operating system being windows? IF the later, it makes me question the value of using bash on windows if common operations such as this won't work.

$chmod 644 filename 
9
  • 7
    What's the path of the file you're trying to modify? Is it on a drvfs mount such as "/mnt/c"? If so, Unix permissions hardly apply to a file in a Windows filesystem. All it can control is the read-only file attribute, which can be set by removing write access for everyone, e.g. chmod 555 filename. Implicitly everyone will always have read and execute access, since no Windows file attributes correspond to that.
    – Eryk Sun
    Commented Oct 6, 2017 at 17:43
  • MINGW32:/c/Users/joe/working2
    – joe5
    Commented Oct 6, 2017 at 18:16
  • 1
    Have you also tried using sudo?
    – ifconfig
    Commented Oct 7, 2017 at 21:02
  • 1
    @ifconfig I am on windows using the bash that comes with GIT.
    – joe5
    Commented Oct 9, 2017 at 17:32
  • 5
    The MSYS environment is bash plus the typical command-line programs found in Unix, built over the user-mode Windows API. In contrast, the Linux subsystem in Windows 10 uses a kernel driver and pico processes that directly execute ELF binaries, including sudo. Still, it can't enable an NTFS volume mounted via drvfs to work like a native Linux filesystem. System calls such as chmod work as well as can be expected. Native Linux filesystem support is provided by the lxfs filesystem used for "/", which is persisted to disk in the user's %LocalAppData%\lxss folder, but not for use in Windows.
    – Eryk Sun
    Commented Oct 9, 2017 at 21:09

3 Answers 3

174

To enable changing file owners & permissions, you need to edit /etc/wsl.conf and insert the below config options:

[automount]
options = "metadata"

Do this inside the WSL shell, potentially needing sudo to edit/create the file.

This may require restarting WSL (such as with wsl --shutdown which is a Windows command, not one within WSL) or the host machine to take effect. This has been possible since 2018:

You can now set the owner and group of files using chmod/chown and modify read/write/execute permissions in WSL. You can also create special files like fifos, unix sockets, and device files. We’re introducing new mounting options with DrvFs for projecting permissions onto files alongside providing new Linux metadata on files and folders.

[cite: Microsoft Dev Blog]


You can also temporarily re-mount a drive with the following commands:

sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata

...but please note, the command only takes effect in session scope. If you exit current bash, you'll lose your settings (credit: answerer Amade).


Reference:

Automatically Configuring WSL

8
  • 5
    "enabled" is superfluous. This option is "true" by default
    – HA3IK
    Commented Jan 28, 2019 at 22:56
  • 6
    I had to restart my machine after saving /etc/wsl.conf in order for the changes to take place. Commented Feb 19, 2020 at 15:31
  • 8
    Need to run wsl --shutdown
    – alex
    Commented Nov 24, 2020 at 0:42
  • 2
    Thanks @alex and @HA3IK; have edited this essential context into the answer.
    – iono
    Commented Jan 26, 2021 at 7:49
  • 7
    The file /etc/wsl.conf did not exist, so I created it, and it worked after restart. Thanks!
    – PJ127
    Commented Jan 21, 2022 at 10:48
52

There was an update to WSL recently (source), which lets you change permissions to files (Insider Build 17063).

All you have to do is to run:

sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata
2
  • 1
    Remember to check your os version before sudo umount. My computer is managed by my organization and locked on 1709(16299.402). When remount it says wrong fs type, bad option, bad superblock on D:. Luckily, a restart of bash fixes it.
    – Weekend
    Commented May 9, 2018 at 12:14
  • 2
    The problem with this solution is that it mounts the c drive as root. To have files owned by me instead of root I had to do sudo mount -t drvfs C: /mnt/c -o metadata,gid=1000,uid=1000.
    – Jean Paul
    Commented Aug 12, 2021 at 14:34
5

Both Amades and Chaos answers are correct. But it only works for local drives not for mapped network drives. Z: is one of my network drives. Same operation on /mnt/c/Users/xxx/ works fine.

$sudo mount -t drvfs Z: /mnt/z -o metadata
$touch test
$chmod +w test
 chmod: changing permissions of 'test': Operation not permitted

This is a known issue, see drvfs: metadata (chmod\chown) possible for mounted SMB drives?

Not the answer you're looking for? Browse other questions tagged or ask your own question.