[DEPRECATED] How to partition, format ext4, and mount an SSD outside the array


Recommended Posts

UPDATE 2014 09 09: This topic is now deprecated.  The best method to mount any drive with any filesystem outside the array is to use SNAP:

 

v5.x: http://lime-technology.com/forum/index.php?topic=29519.0

v6b5a+: http://lime-technology.com/forum/index.php?topic=31594.0. 

 

I will of course leave this here for posterity and reference but I do not plan on maintaining / monitoring this thread. 

 

CONVERSION STEPS:

- Shut down all VMs

- Set "Autostart" to "No" for all VMs

- Make a copy of your current smb-extra.conf

- Edit your current smb-extra.conf to remove reference to any shares that point to the discs you plan on converting to SNAP

- Make a copy of your current GO script

- Edit your GO script to comment out or delete the lines associated with manually mounting your disk

- REBOOT the server

- Follow SNAP's install instructions and use its thread for help if needed

- Once you you have your drive visible in SNAP I'd suggest naming the share "appdisk" this will be both the mount name and the share name - Mount and Share the disk via SNAP (right-click)

- Chances are most of your unRaid internal references to the disk are as /mnt/appdisk ... you will need to change those references to /mnt/disk/appdisk because that is how SNAP does it

  -- In my case that meant modifying my VM config from the unRAID gui and modifying VMBackup.conf using nano

  -- If you have other places that reference /mnt/appdisk don't forget to change those as well

- External to unRAID you'll need to modify their reference from //tower/appshare to //tower/appdisk

  -- Of course you could have gone the other direction used "appshare" in SNAP if you didn't want to go through the effort of changing all your share references, but either way you go, just be sure to change all your internal and external references accordingly

- From the command line issue "mount" and you should see your drive mounted as expected and if it is an SSD you should see "discard"

- Restart your VM and test ... set "AutoStart" to "Yes" if all is good.

- Test all other aspects of your system that involved the disk(s) in question

- Profit!!!

*********************************************

 

This was originally part of the Plex thread but decided it was worth making its own thread for easier searching and a more logical link from the wiki.

 

The main purpose of this is so that people using Plex Media Server can avoid having their array or cache drive spinning all the time.  It just does, and trying to stop it is not within the purview of this thread or my knowledge.  In fact any discussion along those lines belongs on the Plex forums since it is their issue to deal with.

 

If you found this thread looking for more generic into on how to mount a drive outside the array it should still serve your pupose.  There is no reason not to format as ext4 unless you have a specific reason not to.  However, if you are NOT using an SSD then I would suggest you skip adding discard (aka trim) support.  I don't know if it would actually hurt anything, but it is useless non the less and I don't like doing useless stuff :)  Otherwise the rest of this thread should certainly still be useful and instructive. 

 

Why not just use S.N.A.P.?  You should ... so go do it :)S.N.A.P. is a very good plug-in with some very good features.  First off, it does not support ext4 at this time and thus discard is not supported.  If it ever does support ext4, hopefully they will also include support for enabling the discard option otherwise it would still be pointless for SSD usage.  Second is that there have been reported problems with the Plex plug-in loading before S.N.A.P. with the result that the drive is not mounted in time for Plex to see it.  When Plex tries to create the library folder on the SSD it fails.  Right now there is no way to dictate the order of precedence of plug-in load.  By mounting the drive in the Go script you can be sure it is first.

 

As time goes I'll might clean this up (I'm not 100% thrilled with the organization) and add to it if need be.  Finally, I'm hardly linux expert so my ability to help with problems will be limited.  But I'll try, and more important this is the place for those questions to be answered by the experts.

 

Ok so on to it then.

Link to comment

0. Open a command terminal via telenet, SSH, or do this from the Unraid server itself.  You're choice.

 

1. Format Drive - If you already have a partitioned and ext4 formatted drive skip to step 2.

 

1a. Find drive label - The following command will list all detected hard disks:

fdisk -l | grep '^Disk'

and this is the result

root@Tower:~#  fdisk -l | grep '^Disk'

Disk /dev/sda: 2021 MB, 2021654528 bytes

Disk identifier: 0x00000000

Disk /dev/sdc: 2000.4 GB, 2000398934016 bytes

Disk identifier: 0x00000000

Disk /dev/sdd: 2000.4 GB, 2000398934016 bytes

Disk identifier: 0x00000000

Disk /dev/sdb: 2000.4 GB, 2000398934016 bytes

Disk identifier: 0x00000000

Disk /dev/sde: 2000.4 GB, 2000398934016 bytes

Disk identifier: 0x00000000

Disk /dev/sdg: 60.0 GB, 60022480896 bytes

Disk identifier: 0x00000000

Disk /dev/sdf: 640.1 GB, 640135028736 bytes

Disk identifier: 0x00000000

Because I know my SSD is 60gb it is easy to see that my drive is /dev/sdg. 

If you have ANY doubt at all as to which drive is your target drive (read: you aren't 100% sure that it is not an array drive)

STOP, think, and post the output to the forum

 

1b. Partition drive - Now partition the drive using

fdisk -cu /dev/sdX

where "X" is the letter for your drive.  In my example above it would be "/dev/sdg"

 

Don't worry, this won't immediately do anything but instead you'll be shown the following

root@Tower:~# fdisk -cu /dev/sdg

 

Command (m for help):

 

The basic fdisk commands you need are:

 

    m - print help

    p - print the partition table

    n - create a new partition

    d - delete a partition

    q - quit without saving changes

    w - write table to disk and exit

 

If you have any existing partitions first delete them using 'd' and then 'w' to write the partition and exit.  Reissue fdisk -cu /dev/sdX and use 'n' to create a new partition.    You'll be presented with a series of questions which I've shown below with recommended answers.  For my drive I choose 1024 because I know it works and that value should work for just about any drive.  If you are unsure, you will have to do your own research to find the correct location for the start of the partition.

 

root@Tower:~# fdisk -cu /dev/sdg

 

Command (m for help): n

Command action

  e  extended

  p  primary partition (1-4) p

 

Partition number (1-4): 1

 

First sector (1-117231407, default 117230592): 1024

 

Last sector, +sectors or +size{K,M,G} (117230592-117231407, default 117231407): [hit enter for default to use full drive]

 

Using default value 117231407

 

Next select 'w' to write and exit from fdisk.  Now check that everything is ok with

fdisk -lu /dev/sdX

 

and you should see something along the lines of

root@Tower:~# fdisk -lu /dev/sdg

 

Disk /dev/sdg: 60.0 GB, 60022480896 bytes

32 heads, 32 sectors/track, 114483 cylinders, total 117231408 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

 

  Device Boot      Start        End      Blocks  Id  System

/dev/sdg1            1024  117230591    58614784  83  Linux

root@Tower:~#

 

1c. Format partition - For an SSD it would be best to format as Ext4 because it supports TRIM.  RFS does not.  To format the new partition with Ext4

mke2fs -t ext4 /dev/sdX1

Note that this time we are not referencing the drive  with "sdX" but the partition with "sdX1". 

 

You can check the partition with

 fsck -N /dev/sdg1

You should see something like this

root@Tower:~# fsck -N /dev/sdf1

fsck from util-linux-ng 2.17.2

[/sbin/fsck.ext4 (1) -- /dev/sdg1] fsck.ext4 /dev/sdg1

 

2. Determine drive by ID - Unfortunately "X" above does not help us when it comes time to mount the drive during boot because drive assignment can change.  So instead we are going to identify the drive by its ID using the following comment:

ls /dev/disk/by-id

which will show you something like this

root@Tower:~# ls /dev/disk/by-id

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX@

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX-part1@

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX@

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX-part1@

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX@

ata-Hitachi_HDS5C3020ALA632_ML0220FXXXXXXX-part1@

ata-OCZ-VERTEX2_OCZ-0E6807YCLAXXXXXXX@

ata-OCZ-VERTEX2_OCZ-0E6807YCLAXXXXXXX-part1@

ata-ST2000DL003-9VT166_5YXXXXXXX@

ata-ST2000DL003-9VT166_5YXXXXXXX-part1@

ata-WDC_WD6401AALS-00L3B2_WD-WCASYXXXXXXX@

ata-WDC_WD6401AALS-00L3B2_WD-WCASYXXXXXXX-part1@

...

Again, mine is easy to find since I know it is the only OCZ drive.  If it is not 100% immediately obvious which drive is the right one what should you do? 

STOP, think, and post the output to the forum

:)

So assuming you know which is the correct drive, you want to copy the entire line that includes "part1".  In my case that would be

ata-OCZ-VERTEX2_OCZ-0E6807YCLAXXXXXXX-part1"
Note that I excluded the "@"

 

3. Modify GO script - There are a few ways to do this, but I'm going to show you what i think is the easiest way. 

 

3a Open Flash Drive - Assuming your flash drive is exported from the Unraid GUI, open windows explorer and put the following command into the address bar

\\TOWER\flash\config

unless you've renamed your server to something else, then replace "TOWER" with that.

 

3b. Open "go" with notepad - If you've never touched your go script before, this is all you should see

#!/bin/bash

# Start the Management Utility

/usr/local/sbin/emhttp&

 

3c. Add the Code  - You want to add the following lines after "/usr/local/sbin/emhttp &"  It is the "discard" option that turns on TRIM!!!  The other options, prevent unnecessary writes related to file and directory time modification writes.

#Mount SSD as appdisk

mkdir /mnt/appdisk

mount -rw -o noatime,nodiratime,discard -t ext4 /dev/disk/by-id/ata-OCZ-VERTEX2_OCZ-0E6807YCXXXXXXWD-part1 /mnt/appdisk

NOTE 1: Of course replace "ata-OCZ-VERTEX2_OCZ-0E6807YCXXXXXXWD-part1" with the correct ID for your drive found in Step 2. 

NOTE 2: There is a space after the drive-ID and "/mnt..."

NOTE 3: You can also change "appdisk" to be whatever you want it to be.  Be sure to change it in both lines!!!

 

3d. Save and close GO script

 

4. Make it so!!! You can either reboot the server or, you can execute each of the two lines from your GO script into the command line for the same effect.  Skip the comment line of course.  In fact doing so will let you quickly confirm your commands are correct without waiting for a full reboot.  At some point I'd still recommend rebooting to confirm everything works as it should.

 

5. Test - You can test that you have correctly mounted the partition with the following command

mount

You should see

root@Tower:~# mount

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

tmpfs on /var/log type tmpfs (rw,size=128m)

/dev/sda1 on /boot type vfat (rw,noatime,nodiratime,umask=0,shortname=mixed)

/dev/sdg1 on /mnt/appdisk type ext4 (rw,noatime,nodiratime,discard)

/dev/md1 on /mnt/disk1 type reiserfs (rw,noatime,nodiratime,user_xattr,acl)

/dev/md2 on /mnt/disk2 type reiserfs (rw,noatime,nodiratime,user_xattr,acl)

/dev/md3 on /mnt/disk3 type reiserfs (rw,noatime,nodiratime,user_xattr,acl)

/dev/sdf1 on /mnt/cache type reiserfs (rw,noatime,nodiratime,user_xattr,acl)

shfs on /mnt/user0 type fuse.shfs (rw,nosuid,nodev,noatime,allow_other)

shfs on /mnt/user type fuse.shfs (rw,nosuid,nodev,noatime,allow_other)

root@Tower:~#

Then you know that you actually have a mounted partition and that it is correctly formatted as Ext4.  You should also see that it lists the "discard" option. If you get anything other than ext4 for your given device (again, /dev/sdg1 in my case) then something is amiss.  So what should you do?

 

STOP, think, and post to the forum

 

6. OPTIONAL: Export via samba

If you ever find the need to inspect the Plex library, such as for the logs, you might find it useful to export your appdisk.  To do so you must create/modify "smb-extra.conf" in \\flash\config.  You must add

[Appshare]
     path = /mnt/appdisk
     comment = Application SSD [or anything else you want here]
     browseable = yes
     public = yes
     writable = yes

 

and then at the command line issue

/etc/rc.d/rc.samba restart

If all is well you should see "appshare" listed on your PC along with your other exported shares.

 

7. Configure Plex - In the Plex config screen of the Unraid GUI you'll want to configure it using something to the effect of

Library Directory: /mnt/appdisk/plex/Library

Temp Directory: /mnt/appdisk/plex/tmp

NOTE: This will look a little different if you are now using PhAzE's Plex pluging but you should be able to figure it out.  Same if you are using.

 

8. Set User, Group, and Permissions - One last step is to ensure your new app drive is assigned nobody:users.  To do that type:

chown nobody:users /mnt/appdisk
chmod 777 /mnt/appdisk

  Now when you show a listing of all your mounts you should see something like

root@Tower:~# ls /mnt -l

total 4

drwxrwxrwx  4 nobody users 4096 May 13 20:49 appdisk/

drwxrwxrwx  6 nobody users  136 Aug 20 09:04 cache/

drwxrwxrwx 10 nobody users  264 Aug 20 10:05 disk1/

drwxrwxrwx 10 nobody users  264 Aug 20 00:06 disk2/

drwxrwxrwx 10 nobody users  264 Aug 20 00:04 disk3/

drwxrwxrwx  1 nobody users  136 Aug 20 10:05 user/

drwxrwxrwx  1 nobody users  264 Aug 20 10:05 user0/

 

If you see "root root" or anything other than "drwxrwxrwx " on the appdisk line then you didn't run the commands correctly.  If you see it anywhere else, then you probably should run the New Perms script in the Unraid GUI, but FIRST check-in on the forums to make sure you won't mess something up (unlikely but still worth it)

  • Thanks 1
Link to comment
  • 2 weeks later...
6. OPTIONAL: Export via samba

If you ever find the need to inspect the Plex library, such as for the logs, you might find it useful to export your appdisk.  To do so you must create/modify "smb-extra.conf" in \\flash\config.

 

I have added this smb-extra.conf file exactly as written above. I can mount the appshare but not write to it. I am running unraid 5.0. Does the conf file need to have something to enable read/write access?

Link to comment

Thanks for the well written tutorial jumperalex!

 

I had a quick question though. Since this drive is setup out of the array, can it be used just like a cache drive would?

 

Right now I have a SSD setup as my cache/apps drive. I am considering doing this so that I can get the TRIM functionality. I know that in this use it is solely being used as a permanent apps drive. Can it also function as a cache drive for my server as well?

 

If so, how would this be accomplished? Thanks!

Link to comment

No it can't be used as a cache drive once you've formatted and mounted it.  In fact even formatted ext4 I'm pretty sure precludes making it a cache drive because UnRaid will reformat it.  And if it is mounted, then you can ALSO mount it as the cache drive.

 

Sorry you can have your cake, but you can't eat it too ;-)

Link to comment

Add a "force user = root" to the smb-extra.conf.  This will allow writing to it.  There might be other ways but this suggestion to me by RockDawg is the only one that I've used - it works.

 

Thank You.  Instructions updated.

 

One more change needed in smb-extra.conf.  I found that the line:

 

    path = /mnt/appdisk

 

needed to be changed to /usr/mnt/appdisk in order to work correctly.

 

Link to comment

No it can't be used as a cache drive once you've formatted and mounted it.  In fact even formatted ext4 I'm pretty sure precludes making it a cache drive because UnRaid will reformat it.  And if it is mounted, then you can ALSO mount it as the cache drive.

 

Sorry you can have your cake, but you can't eat it too ;-)

 

Ha I didn't think it would work but figured I'd check.

 

Also, there is no way to run trim commands unless the drive is formatted as ext4 right?

Link to comment

Add a "force user = root" to the smb-extra.conf.  This will allow writing to it.  There might be other ways but this suggestion to me by RockDawg is the only one that I've used - it works.

 

Thank You.  Instructions updated.

 

One more change needed in smb-extra.conf.  I found that the line:

 

    path = /mnt/appdisk

 

needed to be changed to /usr/mnt/appdisk in order to work correctly.

 

I don't doubt it, but what is the impact?  Seems everything is working.

Link to comment

@jumperalex

 

The impact for me was that when I looked at the smb share which was /mnt/appdisk, I did not see the files that Plex was writing to /usr/mnt/appdisk. The problem went away when I edited samba-extra.conf file to point to /usr/mnt/appdisk.

 

Does it work differently for you?

 

Update:  Actually, I've reread your post and see where I missed something. You mounted your ssd at /mnt/appdisk where I mounted mine at /usr/mnt/appdisk. Then I copied your samba-extra.conf file which pointed to /mnt/appdisk.  The inconsistency was my mistake.

Link to comment
  • 3 weeks later...

You can check the partition with

 df -HT

and you should get ...

root@Tower:~# df -HT

Filesystem    Type    Size  Used  Avail Use% Mounted on

tmpfs        tmpfs    135M  615k  134M  1% /var/log

/dev/sda1    vfat    2.1G  103M  2.0G  6% /boot

/dev/sdg1    ext4      59G  8.1G    48G  15% /mnt/appdisk

/dev/md1  reiserfs    2.1T  1.4T  664G  67% /mnt/disk1

/dev/md2  reiserfs    2.1T  1.5T  515G  75% /mnt/disk2

/dev/md3  reiserfs    2.1T  215G  1.8T  11% /mnt/disk3

/dev/sdf1 reiserfs    641G    34M  641G  1% /mnt/cache

shfs    fuse.shfs    6.1T  3.1T  3.0T  51% /mnt/user0

shfs    fuse.shfs    6.7T  3.1T  3.7T  46% /mnt/user

 

OK, I've just built my first unRaid box and want to install Plex on an apps SSD outside the array as you've done.  When I get to the step above, my SSD isn't listed along with my other drives.

 

Here's what mine looks like:

root@Plex:~# fdisk -lu /dev/sdb

 

Disk /dev/sdb: 120.0 GB, 120034123776 bytes

75 heads, 63 sectors/track, 49617 cylinders, total 234441648 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x00000000

 

  Device Boot      Start        End      Blocks  Id  System

/dev/sdb1            2048  234441647  117219800  83  Linux

root@Plex:~# mke2fs -t ext4 /dev/sdb1

mke2fs 1.41.11 (14-Mar-2010)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

7331840 inodes, 29304950 blocks

1465247 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=0

895 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,

        4096000, 7962624, 11239424, 20480000, 23887872

 

Writing inode tables: done

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 34 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

root@Plex:~#  df -HT

Filesystem    Type    Size  Used  Avail Use% Mounted on

tmpfs        tmpfs    135M  619k  134M  1% /var/log

/dev/sda1    vfat    8.0G    87M  8.0G  2% /boot

/dev/md1  reiserfs    3.1T  1.4T  1.7T  47% /mnt/disk1

/dev/md2  reiserfs    3.1T    34M  3.1T  1% /mnt/disk2

/dev/sde1 reiserfs    4.1T    34M  4.1T  1% /mnt/cache

shfs    fuse.shfs    6.1T  1.4T  4.7T  24% /mnt/user0

shfs    fuse.shfs      11T  1.4T  8.7T  14% /mnt/user

 

What did I do wrong?

 

Link to comment

Hmmm well I'm wondering if it is because at that point in the instructions the drive isn't actually mounted?  According this http://linux.about.com/od/commands/l/blcmdl1_df.htm that might be the problem.  hmmm I must have tested the command after having mounted the drive.  I'll have to search for a way to display the device info before it is mounted.  In the mean time, in theory if you go ahead and mount the drive and then df- HT should show the info we're looking for.

 

 

 

 

 

Link to comment

First off, thanks for your help.  Never messed with linux and this is very overwhelming. 

 

ok try this

 fsck -N /dev/sdb1

 

In theory you should see something like this

root@Tower:~# fsck -N /dev/sdf1

fsck from util-linux-ng 2.17.2

[/sbin/fsck.ext4 (1) -- /dev/sdf1] fsck.ext4 /dev/sdf1

Yep, but that doesn't seem to help:

root@Plex:~# fsck -N /dev/sdb1

fsck from util-linux-ng 2.17.2

[/sbin/fsck.ext4 (1) -- /dev/sdb1] fsck.ext4 /dev/sdb1

root@Plex:~#  df -HT

Filesystem    Type    Size  Used  Avail Use% Mounted on

tmpfs        tmpfs    135M  652k  134M  1% /var/log

/dev/sda1    vfat    8.0G    90M  7.9G  2% /boot

/dev/md1  reiserfs    3.1T  1.4T  1.7T  47% /mnt/disk1

/dev/md2  reiserfs    3.1T    34M  3.1T  1% /mnt/disk2

/dev/sde1 reiserfs    4.1T    34M  4.1T  1% /mnt/cache

shfs    fuse.shfs    6.1T  1.4T  4.7T  24% /mnt/user0

shfs    fuse.shfs      11T  1.4T  8.7T  14% /mnt/user

root@Plex:~#

Link to comment

Ok first off the fsck command above worked exactly as intended.  It showed that you have indeed formatted the drive as ext4.  That was all it was intended to do.  It won't mount the drive and that is why you still don't see anything with df- HT.  The step you are missing at this point the next one.  You have to mount the drive.  I have to tweak the How-To, but all you need to do is proceed with the instructions.  The next step for you should be step 2.  Once you complete Step 4 then you can run df -HT again and you should see your drive mounted and see it shown as ext4  And in step 5 you'll see the same info and a bit more.

Link to comment

Ok first off the fsck command above worked exactly as intended.  It showed that you have indeed formatted the drive as ext4.  That was all it was intended to do.  It won't mount the drive and that is why you still don't see anything with df- HT.  The step you are missing at this point the next one.  You have to mount the drive.  I have to tweak the How-To, but all you need to do is proceed with the instructions.  The next step for you should be step 2.  Once you complete Step 4 then you can run df -HT again and you should see your drive mounted and see it shown as ext4  And in step 5 you'll see the same info and a bit more.

Worked perfectly.  I think.  Everything looks exactly the way you describe it here.  Now to install Plex and see if I can do that right, too.

 

Thanks for your help in walking me through this!

 

Edit:  Plex seems to be working perfectly now.  Was worried when it didn't run after a reboot, but re-downloaded a copy of the unRaid Plex server and tried again and it worked fine. 

 

Thanks again!

Link to comment
  • 2 months later...

Just to add my two pence  :)

 

I had a play with this today and couldn't for the life of me access or write to the share.

And then it hit me.

 

The partition / disk itself cannot be directly shared.

You will get access problems, however any folder created on the partition / disk can be.

 

Below are my GO file entries and smb-extra.conf.

smb-extra.conf is how the file is generated by S.N.A.P. on my live box and as that works perfectly fine figured why change it.

 

mkdir /mnt/xendisk
mount -rw -o noatime,nodiratime,discard -t ext4 /dev/disk/by-id/ata-SAMSUNG_HD322HJ_S17AJ9CQB09792-part1 /mnt/xendisk

 

[global]
security = USER
guest account = nobody
public = yes
guest ok = yes
map to guest = bad user

[xen]
  path = /mnt/xendisk/xen
  read only = no

 

I can read / write to the above share without any problems at all  ;D

While this does not specifically apply to plex it is an absolute boon to xen as I can have my VMs on an ssd outside the array.

 

Kudos to jumperalex for the initial guide.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.