canonical / microceph

MicroCeph is snap-deployed Ceph with built-in clustering
https://snapcraft.io/microceph
GNU Affero General Public License v3.0
213 stars 33 forks source link

squid release radosgw-admin not working for account creation #431

Open abasu0713 opened 1 week ago

abasu0713 commented 1 week ago

Issue report

Squid release on Arm64 doesn't support User Account Management. I am unable to create Accounts as described in Squid's documentation for Account Creation. The radosgw-admin binary included in the Snap package doesn't even have the account option (please refer to errors below)

alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin account create --account-name=test-account --email=contactme@arkobasu.space
ERROR: invalid flag --account-name=test-account
alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin account create --account-name=alphaduriendur --email=contactme@arkobasu.space
ERROR: invalid flag --account-name=alphaduriendur
alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin -h
usage: radosgw-admin <cmd> [options...]
commands:
  user create                      create a new user
  user modify                      modify user
  user info                        get user info
  user rename                      rename user
  user rm                          remove user
  user suspend                     suspend a user
  user enable                      re-enable user after suspension
  user check                       check user info
  user stats                       show user stats as accounted by quota subsystem
  user list                        list users
  caps add                         add user capabilities
  caps rm                          remove user capabilities
  subuser create                   create a new subuser
  subuser modify                   modify subuser
  subuser rm                       remove subuser
  key create                       create access key
  key rm                           remove access key
  bucket list                      list buckets (specify --allow-unordered for faster, unsorted listing)
  bucket limit check               show bucket sharding stats
  bucket link                      link bucket to specified user
  bucket unlink                    unlink bucket from specified user
  bucket stats                     returns bucket statistics
  bucket rm                        remove bucket
  bucket check                     check bucket index by verifying size and object count stats
  bucket check olh                 check for olh index entries and objects that are pending removal
  bucket check unlinked            check for object versions that are not visible in a bucket listing 
  bucket chown                     link bucket to specified user and update its object ACLs
  bucket reshard                   reshard bucket
  bucket rewrite                   rewrite all objects in the specified bucket
  bucket sync checkpoint           poll a bucket's sync status until it catches up to its remote
  bucket sync disable              disable bucket sync
  bucket sync enable               enable bucket sync
  bucket radoslist                 list rados objects backing bucket's objects
  bi get                           retrieve bucket index object entries
  bi put                           store bucket index object entries
  bi list                          list raw bucket index entries
  bi purge                         purge bucket index entries
  object rm                        remove object
  object put                       put object
  object stat                      stat an object for its metadata
  object unlink                    unlink object from bucket index
  object rewrite                   rewrite the specified object
  object reindex                   reindex the object(s) indicated by --bucket and either --object or --objects-file
  objects expire                   run expired objects cleanup
  objects expire-stale list        list stale expired objects (caused by reshard)
  objects expire-stale rm          remove stale expired objects
  period rm                        remove a period
  period get                       get period info
  period get-current               get current period info
  period pull                      pull a period
  period push                      push a period
  period list                      list all periods
  period update                    update the staging period
  period commit                    commit the staging period
  quota set                        set quota params
  quota enable                     enable quota
  quota disable                    disable quota
  ratelimit get                    get ratelimit params
  ratelimit set                    set ratelimit params
  ratelimit enable                 enable ratelimit
  ratelimit disable                disable ratelimit
  global quota get                 view global quota params
  global quota set                 set global quota params
  global quota enable              enable a global quota
  global quota disable             disable a global quota
  global ratelimit get             view global ratelimit params
  global ratelimit set             set global ratelimit params
  global ratelimit enable          enable a ratelimit quota
  global ratelimit disable         disable a ratelimit quota
  realm create                     create a new realm
  realm rm                         remove a realm
  realm get                        show realm info
  realm get-default                get default realm name
  realm list                       list realms
  realm list-periods               list all realm periods
  realm rename                     rename a realm
  realm set                        set realm info (requires infile)
  realm default                    set realm as default
  realm pull                       pull a realm and its current period
  zonegroup add                    add a zone to a zonegroup
  zonegroup create                 create a new zone group info
  zonegroup default                set default zone group
  zonegroup delete                 delete a zone group info
  zonegroup get                    show zone group info
  zonegroup modify                 modify an existing zonegroup
  zonegroup set                    set zone group info (requires infile)
  zonegroup rm                     remove a zone from a zonegroup
  zonegroup rename                 rename a zone group
  zonegroup list                   list all zone groups set on this cluster
  zonegroup placement list         list zonegroup's placement targets
  zonegroup placement get          get a placement target of a specific zonegroup
  zonegroup placement add          add a placement target id to a zonegroup
  zonegroup placement modify       modify a placement target of a specific zonegroup
  zonegroup placement rm           remove a placement target from a zonegroup
  zonegroup placement default      set a zonegroup's default placement target
  zone create                      create a new zone
  zone rm                          remove a zone
  zone get                         show zone cluster params
  zone modify                      modify an existing zone
  zone set                         set zone cluster params (requires infile)
  zone list                        list all zones set on this cluster
  zone rename                      rename a zone
  zone placement list              list zone's placement targets
  zone placement get               get a zone placement target
  zone placement add               add a zone placement target
  zone placement modify            modify a zone placement target
  zone placement rm                remove a zone placement target
  metadata sync status             get metadata sync status
  metadata sync init               init metadata sync
  metadata sync run                run metadata sync
  data sync status                 get data sync status of the specified source zone
  data sync init                   init data sync for the specified source zone
  data sync run                    run data sync for the specified source zone
  pool add                         add an existing pool for data placement
  pool rm                          remove an existing pool from data placement set
  pools list                       list placement active set
  policy                           read bucket/object policy
  log list                         list log objects
  log show                         dump a log from specific object or (bucket + date + bucket-id)
                                   (NOTE: required to specify formatting of date to "YYYY-MM-DD-hh")
  log rm                           remove log object
  usage show                       show usage (by user, by bucket, date range)
  usage trim                       trim usage (by user, by bucket, date range)
  usage clear                      reset all the usage stats for the cluster
  gc list                          dump expired garbage collection objects (specify
                                   --include-all to list all entries, including unexpired)
  gc process                       manually process garbage (specify
                                   --include-all to process all entries, including unexpired)
  lc list                          list all bucket lifecycle progress
  lc get                           get a lifecycle bucket configuration
  lc process                       manually process lifecycle
  lc reshard fix                   fix LC for a resharded bucket
  metadata get                     get metadata info
  metadata put                     put metadata info
  metadata rm                      remove metadata info
  metadata list                    list metadata info
  mdlog list                       list metadata log
  mdlog autotrim                   auto trim metadata log
  mdlog trim                       trim metadata log (use marker)
  mdlog status                     read metadata log status
  bilog list                       list bucket index log
  bilog trim                       trim bucket index log (use start-marker, end-marker)
  bilog status                     read bucket index log status
  bilog autotrim                   auto trim bucket index log
  datalog list                     list data log
  datalog trim                     trim data log
  datalog status                   read data log status
  datalog type                     change datalog type to --log_type={fifo,omap}
  orphans find                     deprecated -- init and run search for leaked rados objects (use job-id, pool)
  orphans finish                   deprecated -- clean up search for leaked rados objects
  orphans list-jobs                deprecated -- list the current job-ids for orphans search
    * the three 'orphans' sub-commands are now deprecated; consider using the `rgw-orphan-list` tool
  role create                      create a AWS role for use with STS
  role delete                      remove a role
  role get                         get a role
  role list                        list roles with specified path prefix
  role-trust-policy modify         modify the assume role policy of an existing role
  role-policy put                  add/update permission policy to role
  role-policy list                 list policies attached to a role
  role-policy get                  get the specified inline policy document embedded with the given role
  role-policy delete               remove policy attached to a role
  role update                      update max_session_duration of a role
  reshard add                      schedule a resharding of a bucket
  reshard list                     list all bucket resharding or scheduled to be resharded
  reshard status                   read bucket resharding status
  reshard process                  process of scheduled reshard jobs
  reshard cancel                   cancel resharding a bucket
  reshard stale-instances list     list stale-instances from bucket resharding
  reshard stale-instances delete   cleanup stale-instances from bucket resharding
  sync error list                  list sync error
  sync error trim                  trim sync error
  mfa create                       create a new MFA TOTP token
  mfa list                         list MFA TOTP tokens
  mfa get                          show MFA TOTP token
  mfa remove                       delete MFA TOTP token
  mfa check                        check MFA TOTP token
  mfa resync                       re-sync MFA TOTP token
  topic list                       list bucket notifications topics
  topic get                        get a bucket notifications topic
  topic rm                         remove a bucket notifications topic
  topic stats                      get a bucket notifications persistent topic stats (i.e. reservations, entries & size)
  script put                       upload a Lua script to a context
  script get                       get the Lua script of a context
  script rm                        remove the Lua scripts of a context
  script-package add               add a Lua package to the scripts allowlist
  script-package rm                remove a Lua package from the scripts allowlist
  script-package list              get the Lua packages allowlist
  script-package reload            install/remove Lua packages according to allowlist
  notification list                list bucket notifications configuration
  notification get                 get a bucket notifications configuration
  notification rm                  remove a bucket notifications configuration
options:
   --tenant=<tenant>                 tenant name
   --user_ns=<namespace>             namespace of user (oidc in case of users authenticated with oidc provider)
   --uid=<id>                        user id
   --new-uid=<id>                    new user id
   --subuser=<name>                  subuser name
   --access-key=<key>                S3 access key
   --email=<email>                   user's email address
   --secret/--secret-key=<key>       specify secret key
   --gen-access-key                  generate random access key (for S3)
   --gen-secret                      generate random secret key
   --key-type=<type>                 key type, options are: swift, s3
   --temp-url-key[-2]=<key>          temp url key
   --access=<access>                 Set access permissions for sub-user, should be one
                                     of read, write, readwrite, full
   --display-name=<name>             user's display name
   --max-buckets                     max number of buckets for a user
   --admin                           set the admin flag on the user
   --system                          set the system flag on the user
   --op-mask                         set the op mask on the user
   --bucket=<bucket>                 Specify the bucket name. Also used by the quota command.
   --pool=<pool>                     Specify the pool name. Also used to scan for leaked rados objects.
   --object=<object>                 object name
   --objects-file=<file>             file containing a list of object names to process
   --object-version=<version>        object version
   --date=<date>                     date in the format yyyy-mm-dd
   --start-date=<date>               start date in the format yyyy-mm-dd
   --end-date=<date>                 end date in the format yyyy-mm-dd
   --bucket-id=<bucket-id>           bucket id
   --bucket-new-name=<bucket>        for bucket link: optional new name
   --shard-id=<shard-id>             optional for:
                                       mdlog list
                                       data sync status
                                     required for:
                                       mdlog trim
   --gen=<gen-id>                    optional for:
                                       bilog list
                                       bilog trim
                                       bilog status
   --max-entries=<entries>           max entries for listing operations
   --metadata-key=<key>              key to retrieve metadata from with metadata get
   --remote=<remote>                 zone or zonegroup id of remote gateway
   --period=<id>                     period id
   --url=<url>                       url for pushing/pulling period/realm
   --epoch=<number>                  period epoch
   --commit                          commit the period during 'period update'
   --staging                         get staging period info
   --master                          set as master
   --master-zone=<id>                master zone id
   --rgw-realm=<name>                realm name
   --realm-id=<id>                   realm id
   --realm-new-name=<name>           realm new name
   --rgw-zonegroup=<name>            zonegroup name
   --zonegroup-id=<id>               zonegroup id
   --zonegroup-new-name=<name>       zonegroup new name
   --rgw-zone=<name>                 name of zone in which radosgw is running
   --zone-id=<id>                    zone id
   --zone-new-name=<name>            zone new name
   --source-zone                     specify the source zone (for data sync)
   --default                         set entity (realm, zonegroup, zone) as default
   --read-only                       set zone as read-only (when adding to zonegroup)
   --redirect-zone                   specify zone id to redirect when response is 404 (not found)
   --placement-id                    placement id for zonegroup placement commands
   --storage-class                   storage class for zonegroup placement commands
   --tags=<list>                     list of tags for zonegroup placement add and modify commands
   --tags-add=<list>                 list of tags to add for zonegroup placement modify command
   --tags-rm=<list>                  list of tags to remove for zonegroup placement modify command
   --endpoints=<list>                zone endpoints
   --index-pool=<pool>               placement target index pool
   --data-pool=<pool>                placement target data pool
   --data-extra-pool=<pool>          placement target data extra (non-ec) pool
   --placement-index-type=<type>     placement target index type (normal, indexless, or #id)
   --placement-inline-data=<true>    set whether the placement target is configured to store a data
                                     chunk inline in head objects
   --compression=<type>              placement target compression type (plugin name or empty/none)
   --tier-type=<type>                zone tier type
   --tier-config=<k>=<v>[,...]       set zone tier config keys, values
   --tier-config-rm=<k>[,...]        unset zone tier config keys
   --sync-from-all[=false]           set/reset whether zone syncs from all zonegroup peers
   --sync-from=[zone-name][,...]     set list of zones to sync from
   --sync-from-rm=[zone-name][,...]  remove zones from list of zones to sync from
   --bucket-index-max-shards         override a zone/zonegroup's default bucket index shard count
   --fix                             besides checking bucket index, will also fix it
   --check-objects                   bucket check: rebuilds bucket index according to actual objects state
   --format=<format>                 specify output format for certain operations: xml, json
   --purge-data                      when specified, user removal will also purge all the
                                     user data
   --purge-keys                      when specified, subuser removal will also purge all the
                                     subuser keys
   --purge-objects                   remove a bucket's objects before deleting it
                                     (NOTE: required to delete a non-empty bucket)
   --sync-stats                      option to 'user stats', update user stats with current
                                     stats reported by user's buckets indexes
   --reset-stats                     option to 'user stats', reset stats in accordance with user buckets
   --show-config                     show configuration
   --show-log-entries=<flag>         enable/disable dump of log entries on log show
   --show-log-sum=<flag>             enable/disable dump of log summation on log show
   --skip-zero-entries               log show only dumps entries that don't have zero value
                                     in one of the numeric field
   --infile=<file>                   file to read in when setting data
   --categories=<list>               comma separated list of categories, used in usage show
   --caps=<caps>                     list of caps (e.g., "usage=read, write; user=read")
   --op-mask=<op-mask>               permission of user's operations (e.g., "read, write, delete, *")
   --yes-i-really-mean-it            required for certain operations
   --warnings-only                   when specified with bucket limit check, list
                                     only buckets nearing or over the current max
                                     objects per shard value
   --bypass-gc                       when specified with bucket deletion, triggers
                                     object deletions by not involving GC
   --inconsistent-index              when specified with bucket deletion and bypass-gc set to true,
                                     ignores bucket index consistency
   --min-rewrite-size                min object size for bucket rewrite (default 4M)
   --max-rewrite-size                max object size for bucket rewrite (default ULLONG_MAX)
   --min-rewrite-stripe-size         min stripe size for object rewrite (default 0)
   --trim-delay-ms                   time interval in msec to limit the frequency of sync error log entries trimming operations,
                                     the trimming process will sleep the specified msec for every 1000 entries trimmed
   --max-concurrent-ios              maximum concurrent ios for bucket operations (default: 32)
   --enable-feature                  enable a zone/zonegroup feature
   --disable-feature                 disable a zone/zonegroup feature

<date> := "YYYY-MM-DD[ hh:mm:ss]"

Quota options:
   --max-objects                 specify max objects (negative value to disable)
   --max-size                    specify max size (in B/K/M/G/T, negative value to disable)
   --quota-scope                 scope of quota (bucket, user)

Rate limiting options:
   --max-read-ops                specify max requests per minute for READ ops per RGW (GET and HEAD request methods), 0 means unlimited
   --max-read-bytes              specify max bytes per minute for READ ops per RGW (GET and HEAD request methods), 0 means unlimited
   --max-write-ops               specify max requests per minute for WRITE ops per RGW (Not GET or HEAD request methods), 0 means unlimited
   --max-write-bytes             specify max bytes per minute for WRITE ops per RGW (Not GET or HEAD request methods), 0 means unlimited
   --ratelimit-scope             scope of rate limiting: bucket, user, anonymous
                                 anonymous can be configured only with global rate limit

Orphans search options:
   --num-shards                  num of shards to use for keeping the temporary scan info
   --orphan-stale-secs           num of seconds to wait before declaring an object to be an orphan (default: 86400)
   --job-id                      set the job id (for orphans find)
   --detail                      detailed mode, log and stat head objects as well

Orphans list-jobs options:
   --extra-info                  provide extra info in job list

Role options:
   --role-name                   name of the role to create
   --path                        path to the role
   --assume-role-policy-doc      the trust relationship policy document that grants an entity permission to assume the role
   --policy-name                 name of the policy document
   --policy-doc                  permission policy document
   --path-prefix                 path prefix for filtering roles

MFA options:
   --totp-serial                 a string that represents the ID of a TOTP token
   --totp-seed                   the secret seed that is used to calculate the TOTP
   --totp-seconds                the time resolution that is being used for TOTP generation
   --totp-window                 the number of TOTP tokens that are checked before and after the current token when validating token
   --totp-pin                    the valid value of a TOTP token at a certain time

Bucket notifications options:
   --topic                       bucket notifications topic name
   --notification-id             bucket notifications id

Script options:
   --context                     context in which the script runs. one of: prerequest, postrequest, background, getdata, putdata
   --package                     name of the Lua package that should be added/removed to/from the allowlist
   --allow-compilation           package is allowed to compile C code as part of its installation

Bucket check olh/unlinked options:
   --min-age-hours               minimum age of unlinked objects to consider for bucket check unlinked (default: 1)
   --dump-keys                   when specified, all keys identified as problematic are printed to stdout
   --hide-progress               when specified, per-shard progress details are not printed to stderr

radoslist options:
   --rgw-obj-fs                  the field separator that will separate the rados object name from the rgw object name;
                                 additionally rados objects for incomplete multipart uploads will not be output

  --conf/-c FILE    read configuration from the given configuration file
  --id ID           set ID portion of my name
  --name/-n TYPE.ID set name
  --cluster NAME    set cluster name (default: ceph)
  --setuser USER    set uid to user or uid (and gid to user's gid)
  --setgroup GROUP  set gid to group or gid
  --version         show version and quit

alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin -h | grep account
  user stats                       show user stats as accounted by quota subsystem
alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin -h | grep account -i
  user stats                       show user stats as accounted by quota subsystem
alphaduriendur@hc-opi5b16-1:~$ sudo ceph --version
ceph version 19.2.0~git20240301.4c76c50 (4c76c50a73f63ba48ccdf0adccce03b00d1d80c7) squid (dev)
alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin account create --email=contactme@arkobasu.space
ERROR: Unrecognized argument: 'account'
Expected one of the following:
  bi
  bilog
  bucket
  buckets
  caps
  data
  datalog
  gc
  global
  key
  lc
  log
  mdlog
  metadata
  mfa
  notification
  object
  objects
  olh
  orphans
  period
  policy
  quota
  ratelimit
  realm
  reshard
  role
  role-policy
  role-trust-policy
  script
  script-package
  subuser
  sync
  topic
  usage
  user
  zone
  zonegroup
  zonegroups
  zones
alphaduriendur@hc-opi5b16-1:~$ whereis radosgw-admin
radosgw-admin: /snap/bin/radosgw-admin
alphaduriendur@hc-opi5b16-1:~$

What version of MicroCeph are you using ?

Use this section to describe the channel/revision which produces the unexpected behaviour. This information can be fetched from the installed: section of sudo snap info microceph output.

alphaduriendur@hc-opi5b16-1:~$ sudo snap info microceph
name:      microceph
summary:   Simple clustered Ceph deployment
publisher: Canonical✓
store-url: https://snapcraft.io/microceph
contact:   https://matrix.to/#/#ubuntu-ceph:matrix.org
license:   AGPL-3.0
description: |
  MicroCeph is the easiest way to get up and running with Ceph. It is focused on providing a modern
  deployment and management experience to Ceph administrators and storage software developers.

  The below commands will set you up with a testing environment on a single machine using
  file-backed OSDs - you'll need about 15 GiB of available space on your root drive:

      sudo snap install microceph
      sudo snap refresh --hold microceph
      sudo microceph cluster bootstrap
      sudo microceph disk add loop,4G,3
      sudo ceph status

  You're done!

  You can remove everything cleanly with:

      sudo snap remove microceph

  To learn more about MicroCeph see the documentation:

  https://canonical-microceph.readthedocs-hosted.com
commands:
  - microceph.ceph
  - microceph
  - microceph.rados
  - microceph.radosgw-admin
  - microceph.rbd
services:
  microceph.daemon: simple, enabled, active
  microceph.mds:    simple, enabled, active
  microceph.mgr:    simple, enabled, active
  microceph.mon:    simple, enabled, active
  microceph.osd:    simple, enabled, active
  microceph.rgw:    simple, enabled, active
snap-id:      ct1DgtIGBaljdOwomQGMLr8EJcL5pOP1
tracking:     squid/edge
refresh-date: today at 11:25 CDT
hold:         forever
channels:
  reef/stable:      18.2.4+snapc9f2b08f92     2024-09-02 (1140) 93MB -
  reef/candidate:   18.2.4+snapc9f2b08f92     2024-08-28 (1140) 93MB -
  reef/beta:        ↑                                                
  reef/edge:        ↑                                                
  latest/stable:    18.2.4+snapc9f2b08f92     2024-09-19 (1140) 93MB -
  latest/candidate: ↑                                                
  latest/beta:      ↑                                                
  latest/edge:      19.2.0~git+snapa50b10bf4f 2024-09-25 (1172) 85MB -
  squid/stable:     –                                                
  squid/candidate:  –                                                
  squid/beta:       –                                                
  squid/edge:       19.2.0~git+snapa50b10bf4f 2024-09-25 (1172) 85MB -
  quincy/stable:    0+git.4a608fc             2024-01-10  (795) 86MB -
  quincy/candidate: 0+git.4a608fc             2023-11-30  (795) 86MB -
  quincy/beta:      ↑                                                
  quincy/edge:      0+git.287ee68             2023-12-05  (809) 86MB -
installed:          19.2.0~git+snapa50b10bf4f            (1172) 85MB held
alphaduriendur@hc-opi5b16-1:~$ sudo ceph --version
ceph version 19.2.0~git20240301.4c76c50 (4c76c50a73f63ba48ccdf0adccce03b00d1d80c7) squid (dev)
alphaduriendur@hc-opi5b16-1:~$ sudo radosgw-admin --version
ceph version 19.2.0~git20240301.4c76c50 (4c76c50a73f63ba48ccdf0adccce03b00d1d80c7) squid (dev)
alphaduriendur@hc-opi5b16-1:~$ 

What are the steps to reproduce this issue ?

  1. Install Microceph on any ARM64 device.
    alphaduriendur@hc-opi5b16-1:~$ lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux trixie/sid
    Release:    n/a
    Codename:   trixie
    alphaduriendur@hc-opi5b16-1:~$
  2. Enable RGW gateway

    
    alphaduriendur@hc-opi5b16-1:~$ sudo ceph status
    cluster:
    id:     e0254074-82b7-420c-bb84-96b8a2d57aca
    health: HEALTH_OK
    
    services:
    mon: 1 daemons, quorum hc-opi5b16-1.arkobasu.space (age 41m)
    mgr: hc-opi5b16-1.arkobasu.space(active, since 40m)
    osd: 3 osds: 3 up (since 39m), 3 in (since 40m)
    rgw: 1 daemon active (1 hosts, 1 zones)
    
    data:
    pools:   5 pools, 129 pgs
    objects: 194 objects, 582 KiB
    usage:   108 MiB used, 150 GiB / 150 GiB avail
    pgs:     129 active+clean

alphaduriendur@hc-opi5b16-1:~$ sudo microceph status MicroCeph deployment summary:

What happens (observed behaviour) ?

Throws error as shown above.

What were you expecting to happen ?

To be able to create accounts. …

Relevant logs, error output, etc.

If it’s considerably long, please paste to https://gist.github.com/ and insert the link here.

Additional comments.

abasu0713 commented 3 days ago

any updates? Would really appreciate it. If I could have rough idea of the timeline

sabaini commented 3 days ago

Please note squid is not released yet for MicroCeph. The final 19.2.0 release is making it's way through QA and we will rebuild MicroCeph once it's available. The current pre-release lacks account support across the board (not unique to arm64).